Pull in FreeType via DEPS instead.

BUG=pdfium:688
Change-Id: I7787b29d0fedc48f1360ab041d43829d0e805462

Change-Id: I7787b29d0fedc48f1360ab041d43829d0e805462
Reviewed-on: https://pdfium-review.googlesource.com/3331
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: dsinclair <dsinclair@chromium.org>
Reviewed-by: Nicolás Peña <npm@chromium.org>
diff --git a/.gitignore b/.gitignore
index c7facb8..5a4dcc7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,6 +7,7 @@
 /testing/gtest
 /third_party/android_ndk
 /third_party/catapult
+/third_party/freetype/src
 /third_party/icu
 /third_party/instrumented_libraries
 /third_party/llvm
diff --git a/DEPS b/DEPS
index ceb53c7..aa569fd 100644
--- a/DEPS
+++ b/DEPS
@@ -10,6 +10,7 @@
   'catapult_revision': '86352b966b0245d6883e5f7df27687856978b6d7',
   'clang_revision': 'c55112ff399f9ad6958b4bb58ca031b8ada63628',
   'cygwin_revision': 'c89e446b273697fadf3a10ff1007a97c0b7de6df',
+  'freetype_revision': '66725768cdf758cfb3f9abf03cbf5e5a77f42088',
   'gen_library_loader_revision': '916d4acd8b2cde67a390737dfba90b3c37de23a1',
   'gmock_revision': '29763965ab52f24565299976b936d1265cb6a271',
   'gtest_revision': '8245545b6dc9c4703e6496d1efd19e975ad2b038',
@@ -31,7 +32,8 @@
     Var('chromium_git') + "/chromium/src/build.git@" + Var('build_revision'),
 
   "buildtools":
-    Var('chromium_git') + "/chromium/buildtools.git@" + Var('buildtools_revision'),
+    Var('chromium_git') + "/chromium/buildtools.git@" +
+        Var('buildtools_revision'),
 
   "testing/corpus":
     Var('pdfium_git') + "/pdfium_tests@" + Var('pdfium_tests_revision'),
@@ -42,14 +44,20 @@
   "testing/gtest":
     Var('chromium_git') + "/external/googletest.git@" + Var('gtest_revision'),
 
+  "third_party/freetype/src":
+    Var('chromium_git') + '/chromium/src/third_party/freetype2.git@' +
+        Var('freetype_revision'),
+
   "third_party/icu":
     Var('chromium_git') + "/chromium/deps/icu.git@" + Var('icu_revision'),
 
   "third_party/instrumented_libraries":
-    Var('chromium_git') + "/chromium/src/third_party/instrumented_libraries.git@" + Var('instrumented_lib_revision'),
+    Var('chromium_git') +
+        "/chromium/src/third_party/instrumented_libraries.git@" +
+        Var('instrumented_lib_revision'),
 
   "third_party/skia":
-    Var('chromium_git') + '/skia.git' + '@' +  Var('skia_revision'),
+    Var('chromium_git') + '/skia.git@' +  Var('skia_revision'),
 
   "tools/clang":
     Var('chromium_git') + "/chromium/src/tools/clang@" +  Var('clang_revision'),
@@ -71,12 +79,15 @@
     "third_party/android_ndk":
       Var('chromium_git') + "/android_ndk.git@" + Var('android_ndk_revision'),
     "third_party/catapult":
-      Var('chromium_git') + "/external/github.com/catapult-project/catapult.git@" + Var('catapult_revision'),
+      Var('chromium_git') +
+          "/external/github.com/catapult-project/catapult.git@" +
+          Var('catapult_revision'),
   },
   "win": {
     # TODO(GYP): Remove this when no tools rely on GYP anymore.
     "tools/gyp":
-      Var('chromium_git') + '/external/gyp.git' + '@' + 'c61b0b35c8396bfd59efc6cfc11401d912b0f510',
+      Var('chromium_git') + '/external/gyp.git@' +
+          'c61b0b35c8396bfd59efc6cfc11401d912b0f510',
 
     "v8/third_party/cygwin":
       Var('chromium_git') + "/chromium/deps/cygwin@" + Var('cygwin_revision'),
diff --git a/core/fxge/freetype/DEPS b/core/fxge/freetype/DEPS
index 26546f7..38478a5 100644
--- a/core/fxge/freetype/DEPS
+++ b/core/fxge/freetype/DEPS
@@ -1,3 +1,3 @@
 include_rules = [
-  '+third_party/freetype/src'
+  '+third_party/freetype/src/src'
 ]
diff --git a/core/fxge/freetype/fx_freetype.cpp b/core/fxge/freetype/fx_freetype.cpp
index 6aa59fe..0ae207b 100644
--- a/core/fxge/freetype/fx_freetype.cpp
+++ b/core/fxge/freetype/fx_freetype.cpp
@@ -6,7 +6,7 @@
 
 #include "core/fxge/fx_freetype.h"
 
-#include "third_party/freetype/src/psnames/pstables.h"
+#include "third_party/freetype/src/src/psnames/pstables.h"
 
 static int xyq_search_node(char* glyph_name,
                            int name_offset,
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index cd9e40c..719b53b 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -33,9 +33,6 @@
     "//third_party/skia/include/pipe",
     "//third_party/skia/include/ports",
     "//third_party/skia/include/utils",
-
-    # TODO(dsinclair): Right way to use //third_party/freetype?
-    "//third_party/freetype/include",
   ]
 
   defines = []
@@ -305,6 +302,7 @@
   deps = [
     ":skia_opts",
     "../third_party:fx_zlib",
+    "//:freetype_common",
   ]
 
   if (is_linux) {
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index 33a9fa2..3ed7487 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -9,9 +9,11 @@
 group("third_party") {
   deps = [
     ":bigint",
-    ":fx_freetype",
     ":pdfium_base",
   ]
+  if (pdf_bundle_freetype) {
+    deps += [ ":fx_freetype" ]
+  }
 }
 
 config("pdfium_third_party_config") {
@@ -38,141 +40,145 @@
   ]
 }
 
-config("fx_freetype_warnings") {
-  visibility = [ ":*" ]
-  if (is_clang) {
-    # open_face_PS_from_sfnt_stream() and open_face_from_buffer() in
-    # ftbase.h are unused.
-    #
-    # ttgload.c casts from unsigned int to unsigned long to void*.
-    cflags = [
-      "-Wno-unused-function",
-      "-Wno-int-to-void-pointer-cast",
+if (pdf_bundle_freetype) {
+  config("fx_freetype_warnings") {
+    visibility = [ ":*" ]
+    if (is_clang) {
+      # open_face_PS_from_sfnt_stream() and open_face_from_buffer() in
+      # ftbase.h are unused.
+      #
+      # ttgload.c casts from unsigned int to unsigned long to void*.
+      cflags = [
+        "-Wno-unused-function",
+        "-Wno-int-to-void-pointer-cast",
+      ]
+    }
+  }
+
+  config("freetype_public_includes_config") {
+    include_dirs = [
+      "freetype/include",
+      "freetype/src/include",
+    ]
+    defines = [
+      "FT_CONFIG_MODULES_H=<freetype-custom-config/ftmodule.h>",
+      "FT_CONFIG_OPTIONS_H=<freetype-custom-config/ftoption.h>",
     ]
   }
-}
 
-config("freetype_public_includes_config") {
-  include_dirs = [
-    "freetype/include",
-    "freetype/src/include",
-  ]
-}
+  # Tests may link against this even if the production library doesn't,
+  # so it needs to be separate from it.
+  static_library("fx_freetype") {
+    configs -= [ "//build/config/compiler:chromium_code" ]
+    configs += [
+      "//build/config/compiler:no_chromium_code",
+      ":pdfium_third_party_config",
 
-# Tests may link against this even if the production library doesn't,
-# so it needs to be separate from it.
-static_library("fx_freetype") {
-  configs -= [ "//build/config/compiler:chromium_code" ]
-  configs += [
-    "//build/config/compiler:no_chromium_code",
-    ":pdfium_third_party_config",
-
-    # Must be after no_chromium_code for warning flags to be ordered correctly.
-    ":fx_freetype_warnings",
-  ]
-
-  public_configs = [ ":freetype_public_includes_config" ]
-
-  defines = [ "FT2_BUILD_LIBRARY" ]
-  sources = [
-    "freetype/include/freetype/config/ftconfig.h",
-    "freetype/include/freetype/config/ftheader.h",
-    "freetype/include/freetype/config/ftmodule.h",
-    "freetype/include/freetype/config/ftoption.h",
-    "freetype/include/freetype/config/ftstdlib.h",
-    "freetype/include/freetype/freetype.h",
-    "freetype/include/freetype/ftadvanc.h",
-    "freetype/include/freetype/ftbitmap.h",
-    "freetype/include/freetype/ftcffdrv.h",
-    "freetype/include/freetype/fterrdef.h",
-    "freetype/include/freetype/fterrors.h",
-    "freetype/include/freetype/ftglyph.h",
-    "freetype/include/freetype/ftgzip.h",
-    "freetype/include/freetype/ftimage.h",
-    "freetype/include/freetype/ftincrem.h",
-    "freetype/include/freetype/ftlcdfil.h",
-    "freetype/include/freetype/ftlist.h",
-    "freetype/include/freetype/ftmm.h",
-    "freetype/include/freetype/ftmodapi.h",
-    "freetype/include/freetype/ftmoderror.h",
-    "freetype/include/freetype/ftobjs.h",
-    "freetype/include/freetype/ftotval.h",
-    "freetype/include/freetype/ftoutln.h",
-    "freetype/include/freetype/ftrender.h",
-    "freetype/include/freetype/ftsizes.h",
-    "freetype/include/freetype/ftsnames.h",
-    "freetype/include/freetype/ftstream.h",
-    "freetype/include/freetype/ftsystem.h",
-    "freetype/include/freetype/fttrigon.h",
-    "freetype/include/freetype/ftttdrv.h",
-    "freetype/include/freetype/fttypes.h",
-    "freetype/include/freetype/internal/autohint.h",
-    "freetype/include/freetype/internal/ftcalc.h",
-    "freetype/include/freetype/internal/ftdebug.h",
-    "freetype/include/freetype/internal/ftdriver.h",
-    "freetype/include/freetype/internal/ftgloadr.h",
-    "freetype/include/freetype/internal/fthash.h",
-    "freetype/include/freetype/internal/ftmemory.h",
-    "freetype/include/freetype/internal/ftobjs.h",
-    "freetype/include/freetype/internal/ftpic.h",
-    "freetype/include/freetype/internal/ftrfork.h",
-    "freetype/include/freetype/internal/ftserv.h",
-    "freetype/include/freetype/internal/ftstream.h",
-    "freetype/include/freetype/internal/ftvalid.h",
-    "freetype/include/freetype/internal/internal.h",
-    "freetype/include/freetype/internal/psaux.h",
-    "freetype/include/freetype/internal/pshints.h",
-    "freetype/include/freetype/internal/services/svcid.h",
-    "freetype/include/freetype/internal/services/svfntfmt.h",
-    "freetype/include/freetype/internal/services/svgldict.h",
-    "freetype/include/freetype/internal/services/svkern.h",
-    "freetype/include/freetype/internal/services/svmetric.h",
-    "freetype/include/freetype/internal/services/svmm.h",
-    "freetype/include/freetype/internal/services/svpostnm.h",
-    "freetype/include/freetype/internal/services/svprop.h",
-    "freetype/include/freetype/internal/services/svpscmap.h",
-    "freetype/include/freetype/internal/services/svpsinfo.h",
-    "freetype/include/freetype/internal/services/svsfnt.h",
-    "freetype/include/freetype/internal/services/svttcmap.h",
-    "freetype/include/freetype/internal/services/svtteng.h",
-    "freetype/include/freetype/internal/services/svttglyf.h",
-    "freetype/include/freetype/internal/sfnt.h",
-    "freetype/include/freetype/internal/t1types.h",
-    "freetype/include/freetype/internal/tttypes.h",
-    "freetype/include/freetype/t1tables.h",
-    "freetype/include/freetype/ttnameid.h",
-    "freetype/include/freetype/tttables.h",
-    "freetype/include/freetype/tttags.h",
-    "freetype/include/ft2build.h",
-    "freetype/src/base/ftbase.c",
-    "freetype/src/base/ftbase.h",
-    "freetype/src/base/ftbitmap.c",
-    "freetype/src/base/ftglyph.c",
-    "freetype/src/base/ftinit.c",
-    "freetype/src/base/ftlcdfil.c",
-    "freetype/src/base/ftmm.c",
-    "freetype/src/base/ftsystem.c",
-    "freetype/src/cff/cff.c",
-    "freetype/src/cff/cffobjs.h",
-    "freetype/src/cff/cfftypes.h",
-    "freetype/src/cid/type1cid.c",
-    "freetype/src/psaux/psaux.c",
-    "freetype/src/pshinter/pshinter.c",
-    "freetype/src/psnames/psmodule.c",
-    "freetype/src/raster/raster.c",
-    "freetype/src/sfnt/sfnt.c",
-    "freetype/src/smooth/smooth.c",
-    "freetype/src/truetype/truetype.c",
-    "freetype/src/type1/type1.c",
-  ]
-  if (pdf_use_skia || pdf_use_skia_paths) {
-    sources += [
-      "freetype/include/freetype/ftfntfmt.h",
-      "freetype/include/freetype/ftsynth.h",
-      "freetype/src/base/ftfntfmt.c",
-      "freetype/src/base/ftfstype.c",
-      "freetype/src/base/fttype1.c",
+      # Must be after no_chromium_code for warning flags to be ordered correctly.
+      ":fx_freetype_warnings",
     ]
+
+    public_configs = [ ":freetype_public_includes_config" ]
+
+    defines = [ "FT2_BUILD_LIBRARY" ]
+    sources = [
+      "freetype/src/include/freetype/config/ftconfig.h",
+      "freetype/src/include/freetype/config/ftheader.h",
+      "freetype/src/include/freetype/config/ftstdlib.h",
+      "freetype/src/include/freetype/freetype.h",
+      "freetype/src/include/freetype/ftadvanc.h",
+      "freetype/src/include/freetype/ftbitmap.h",
+      "freetype/src/include/freetype/ftcffdrv.h",
+      "freetype/src/include/freetype/fterrdef.h",
+      "freetype/src/include/freetype/fterrors.h",
+      "freetype/src/include/freetype/ftglyph.h",
+      "freetype/src/include/freetype/ftgzip.h",
+      "freetype/src/include/freetype/ftimage.h",
+      "freetype/src/include/freetype/ftincrem.h",
+      "freetype/src/include/freetype/ftlcdfil.h",
+      "freetype/src/include/freetype/ftlist.h",
+      "freetype/src/include/freetype/ftmm.h",
+      "freetype/src/include/freetype/ftmodapi.h",
+      "freetype/src/include/freetype/ftmoderror.h",
+      "freetype/src/include/freetype/ftobjs.h",
+      "freetype/src/include/freetype/ftotval.h",
+      "freetype/src/include/freetype/ftoutln.h",
+      "freetype/src/include/freetype/ftrender.h",
+      "freetype/src/include/freetype/ftsizes.h",
+      "freetype/src/include/freetype/ftsnames.h",
+      "freetype/src/include/freetype/ftstream.h",
+      "freetype/src/include/freetype/ftsystem.h",
+      "freetype/src/include/freetype/fttrigon.h",
+      "freetype/src/include/freetype/ftttdrv.h",
+      "freetype/src/include/freetype/fttypes.h",
+      "freetype/src/include/freetype/internal/autohint.h",
+      "freetype/src/include/freetype/internal/ftcalc.h",
+      "freetype/src/include/freetype/internal/ftdebug.h",
+      "freetype/src/include/freetype/internal/ftdriver.h",
+      "freetype/src/include/freetype/internal/ftgloadr.h",
+      "freetype/src/include/freetype/internal/fthash.h",
+      "freetype/src/include/freetype/internal/ftmemory.h",
+      "freetype/src/include/freetype/internal/ftobjs.h",
+      "freetype/src/include/freetype/internal/ftpic.h",
+      "freetype/src/include/freetype/internal/ftrfork.h",
+      "freetype/src/include/freetype/internal/ftserv.h",
+      "freetype/src/include/freetype/internal/ftstream.h",
+      "freetype/src/include/freetype/internal/ftvalid.h",
+      "freetype/src/include/freetype/internal/internal.h",
+      "freetype/src/include/freetype/internal/psaux.h",
+      "freetype/src/include/freetype/internal/pshints.h",
+      "freetype/src/include/freetype/internal/services/svcid.h",
+      "freetype/src/include/freetype/internal/services/svfntfmt.h",
+      "freetype/src/include/freetype/internal/services/svgldict.h",
+      "freetype/src/include/freetype/internal/services/svkern.h",
+      "freetype/src/include/freetype/internal/services/svmetric.h",
+      "freetype/src/include/freetype/internal/services/svmm.h",
+      "freetype/src/include/freetype/internal/services/svpostnm.h",
+      "freetype/src/include/freetype/internal/services/svprop.h",
+      "freetype/src/include/freetype/internal/services/svpscmap.h",
+      "freetype/src/include/freetype/internal/services/svpsinfo.h",
+      "freetype/src/include/freetype/internal/services/svsfnt.h",
+      "freetype/src/include/freetype/internal/services/svttcmap.h",
+      "freetype/src/include/freetype/internal/services/svtteng.h",
+      "freetype/src/include/freetype/internal/services/svttglyf.h",
+      "freetype/src/include/freetype/internal/sfnt.h",
+      "freetype/src/include/freetype/internal/t1types.h",
+      "freetype/src/include/freetype/internal/tttypes.h",
+      "freetype/src/include/freetype/t1tables.h",
+      "freetype/src/include/freetype/ttnameid.h",
+      "freetype/src/include/freetype/tttables.h",
+      "freetype/src/include/freetype/tttags.h",
+      "freetype/src/include/ft2build.h",
+      "freetype/src/src/base/ftbase.c",
+      "freetype/src/src/base/ftbase.h",
+      "freetype/src/src/base/ftbitmap.c",
+      "freetype/src/src/base/ftglyph.c",
+      "freetype/src/src/base/ftinit.c",
+      "freetype/src/src/base/ftlcdfil.c",
+      "freetype/src/src/base/ftmm.c",
+      "freetype/src/src/base/ftsystem.c",
+      "freetype/src/src/cff/cff.c",
+      "freetype/src/src/cff/cffobjs.h",
+      "freetype/src/src/cff/cfftypes.h",
+      "freetype/src/src/cid/type1cid.c",
+      "freetype/src/src/psaux/psaux.c",
+      "freetype/src/src/pshinter/pshinter.c",
+      "freetype/src/src/psnames/psmodule.c",
+      "freetype/src/src/raster/raster.c",
+      "freetype/src/src/sfnt/sfnt.c",
+      "freetype/src/src/smooth/smooth.c",
+      "freetype/src/src/truetype/truetype.c",
+      "freetype/src/src/type1/type1.c",
+    ]
+    if (pdf_use_skia || pdf_use_skia_paths) {
+      sources += [
+        "freetype/src/include/freetype/ftfntfmt.h",
+        "freetype/src/include/freetype/ftsynth.h",
+        "freetype/src/src/base/ftfntfmt.c",
+        "freetype/src/src/base/ftfstype.c",
+        "freetype/src/src/base/fttype1.c",
+      ]
+    }
   }
 }
 
diff --git a/third_party/freetype/include/freetype/config/ftmodule.h b/third_party/freetype/include/freetype-custom-config/ftmodule.h
similarity index 100%
rename from third_party/freetype/include/freetype/config/ftmodule.h
rename to third_party/freetype/include/freetype-custom-config/ftmodule.h
diff --git a/third_party/freetype/include/freetype/config/ftoption.h b/third_party/freetype/include/freetype-custom-config/ftoption.h
similarity index 100%
rename from third_party/freetype/include/freetype/config/ftoption.h
rename to third_party/freetype/include/freetype-custom-config/ftoption.h
diff --git a/third_party/freetype/include/freetype/config/ftconfig.h b/third_party/freetype/include/freetype/config/ftconfig.h
deleted file mode 100644
index 9d7f883..0000000
--- a/third_party/freetype/include/freetype/config/ftconfig.h
+++ /dev/null
@@ -1,482 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftconfig.h                                                             */
-/*                                                                         */
-/*    ANSI-specific configuration file (specification only).               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 header file contains a number of macro definitions that are used */
-  /* by the rest of the engine.  Most of the macros here are automatically */
-  /* determined at compile time, and you should not need to change it to   */
-  /* port FreeType, except to compile the library with a non-ANSI          */
-  /* compiler.                                                             */
-  /*                                                                       */
-  /* Note however that if some specific modifications are needed, we       */
-  /* advise you to place a modified copy in your build directory.          */
-  /*                                                                       */
-  /* The build directory is usually `builds/<system>', and contains        */
-  /* system-specific files that are always included first when building    */
-  /* the library.                                                          */
-  /*                                                                       */
-  /* This ANSI version should stay in `include/config/'.                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef FTCONFIG_H_
-#define FTCONFIG_H_
-
-#include <ft2build.h>
-#include FT_CONFIG_OPTIONS_H
-#include FT_CONFIG_STANDARD_LIBRARY_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*               PLATFORM-SPECIFIC CONFIGURATION MACROS                  */
-  /*                                                                       */
-  /* These macros can be toggled to suit a specific system.  The current   */
-  /* ones are defaults used to compile FreeType in an ANSI C environment   */
-  /* (16bit compilers are also supported).  Copy this file to your own     */
-  /* `builds/<system>' directory, and edit it to port the engine.          */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* There are systems (like the Texas Instruments 'C54x) where a `char' */
-  /* has 16 bits.  ANSI C says that sizeof(char) is always 1.  Since an  */
-  /* `int' has 16 bits also for this system, sizeof(int) gives 1 which   */
-  /* is probably unexpected.                                             */
-  /*                                                                     */
-  /* `CHAR_BIT' (defined in limits.h) gives the number of bits in a      */
-  /* `char' type.                                                        */
-
-#ifndef FT_CHAR_BIT
-#define FT_CHAR_BIT  CHAR_BIT
-#endif
-
-
-  /* The size of an `int' type.  */
-#if                                 FT_UINT_MAX == 0xFFFFUL
-#define FT_SIZEOF_INT  (16 / FT_CHAR_BIT)
-#elif                               FT_UINT_MAX == 0xFFFFFFFFUL
-#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)
-#else
-#error "Unsupported size of `int' type!"
-#endif
-
-  /* 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)
-#elif FT_ULONG_MAX > 0xFFFFFFFFUL && FT_ULONG_MAX == 0xFFFFFFFFFFUL
-#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)
-#else
-#error "Unsupported size of `long' type!"
-#endif
-
-
-  /* FT_UNUSED is a macro used to indicate that a given parameter is not  */
-  /* used -- this is only used to get rid of unpleasant compiler warnings */
-#ifndef FT_UNUSED
-#define FT_UNUSED( arg )  ( (arg) = (arg) )
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                     AUTOMATIC CONFIGURATION MACROS                    */
-  /*                                                                       */
-  /* These macros are computed from the ones defined above.  Don't touch   */
-  /* their definition, unless you know precisely what you are doing.  No   */
-  /* porter should need to mess with them.                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Mac support                                                           */
-  /*                                                                       */
-  /*   This is the only necessary change, so it is defined here instead    */
-  /*   providing a new configuration file.                                 */
-  /*                                                                       */
-#if defined( __APPLE__ ) || ( defined( __MWERKS__ ) && defined( macintosh ) )
-  /* no Carbon frameworks for 64bit 10.4.x */
-  /* AvailabilityMacros.h is available since Mac OS X 10.2,        */
-  /* so guess the system version by maximum errno before inclusion */
-#include <errno.h>
-#ifdef ECANCELED /* defined since 10.2 */
-#include "AvailabilityMacros.h"
-#endif
-#if defined( __LP64__ ) && \
-    ( MAC_OS_X_VERSION_MIN_REQUIRED <= MAC_OS_X_VERSION_10_4 )
-#undef FT_MACINTOSH
-#endif
-
-#elif defined( __SC__ ) || defined( __MRC__ )
-  /* Classic MacOS compilers */
-#include "ConditionalMacros.h"
-#if TARGET_OS_MAC
-#define FT_MACINTOSH 1
-#endif
-
-#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>                                                             */
-  /*    basic_types                                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Int16                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for a 16bit signed integer type.                         */
-  /*                                                                       */
-  typedef signed short  FT_Int16;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UInt16                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for a 16bit unsigned integer type.                       */
-  /*                                                                       */
-  typedef unsigned short  FT_UInt16;
-
-  /* */
-
-
-  /* this #if 0 ... #endif clause is for documentation purposes */
-#if 0
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Int32                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for a 32bit signed integer type.  The size depends on    */
-  /*    the configuration.                                                 */
-  /*                                                                       */
-  typedef signed XXX  FT_Int32;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UInt32                                                          */
-  /*                                                                       */
-  /*    A typedef for a 32bit unsigned integer type.  The size depends on  */
-  /*    the configuration.                                                 */
-  /*                                                                       */
-  typedef unsigned XXX  FT_UInt32;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Int64                                                           */
-  /*                                                                       */
-  /*    A typedef for a 64bit signed integer type.  The size depends on    */
-  /*    the configuration.  Only defined if there is real 64bit support;   */
-  /*    otherwise, it gets emulated with a structure (if necessary).       */
-  /*                                                                       */
-  typedef signed XXX  FT_Int64;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UInt64                                                          */
-  /*                                                                       */
-  /*    A typedef for a 64bit unsigned integer type.  The size depends on  */
-  /*    the configuration.  Only defined if there is real 64bit support;   */
-  /*    otherwise, it gets emulated with a structure (if necessary).       */
-  /*                                                                       */
-  typedef unsigned XXX  FT_UInt64;
-
-  /* */
-
-#endif
-
-#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)
-
-  typedef signed long     FT_Int32;
-  typedef unsigned long   FT_UInt32;
-
-#else
-#error "no 32bit type found -- please check your configuration files"
-#endif
-
-
-  /* look up an integer type that is at least 32 bits */
-#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)
-
-  typedef long           FT_Fast;
-  typedef unsigned long  FT_UFast;
-
-#endif
-
-
-  /* determine whether we have a 64-bit int type for platforms without */
-  /* Autoconf                                                          */
-#if FT_SIZEOF_LONG == (64 / FT_CHAR_BIT)
-
-  /* FT_LONG64 must be defined if a 64-bit type is available */
-#define FT_LONG64
-#define FT_INT64   long
-#define FT_UINT64  unsigned long
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* A 64-bit data type may create compilation problems if you compile     */
-  /* in strict ANSI mode.  To avoid them, we disable other 64-bit data     */
-  /* types if __STDC__ is defined.  You can however ignore this rule       */
-  /* by defining the FT_CONFIG_OPTION_FORCE_INT64 configuration macro.     */
-  /*                                                                       */
-#elif !defined( __STDC__ ) || defined( FT_CONFIG_OPTION_FORCE_INT64 )
-
-#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
-#define FT_INT64   __int64
-#define FT_UINT64  unsigned __int64
-
-#elif defined( __BORLANDC__ )  /* Borland C++ */
-
-  /* XXXX: We should probably check the value of __BORLANDC__ in order */
-  /*       to test the compiler version.                               */
-
-  /* this compiler provides the __int64 type */
-#define FT_LONG64
-#define FT_INT64   __int64
-#define FT_UINT64  unsigned __int64
-
-#elif defined( __WATCOMC__ )   /* Watcom C++ */
-
-  /* Watcom doesn't provide 64-bit data types */
-
-#elif defined( __MWERKS__ )    /* Metrowerks CodeWarrior */
-
-#define FT_LONG64
-#define FT_INT64   long long int
-#define FT_UINT64  unsigned long long int
-
-#elif defined( __GNUC__ )
-
-  /* GCC provides the `long long' type */
-#define FT_LONG64
-#define FT_INT64   long long int
-#define FT_UINT64  unsigned long long int
-
-#endif /* __STDC_VERSION__ >= 199901L */
-
-#endif /* FT_SIZEOF_LONG == (64 / FT_CHAR_BIT) */
-
-#ifdef FT_LONG64
-  typedef FT_INT64   FT_Int64;
-  typedef FT_UINT64  FT_UInt64;
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* miscellaneous                                                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#define FT_BEGIN_STMNT  do {
-#define FT_END_STMNT    } while ( 0 )
-#define FT_DUMMY_STMNT  FT_BEGIN_STMNT FT_END_STMNT
-
-
-  /* typeof condition taken from gnulib's `intprops.h' header file */
-#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 FT_TYPEOF( type )  /* empty */
-#endif
-
-
-#ifdef FT_MAKE_OPTION_SINGLE_OBJECT
-
-#define FT_LOCAL( x )      static  x
-#define FT_LOCAL_DEF( x )  static  x
-
-#else
-
-#ifdef __cplusplus
-#define FT_LOCAL( x )      extern "C"  x
-#define FT_LOCAL_DEF( x )  extern "C"  x
-#else
-#define FT_LOCAL( x )      extern  x
-#define FT_LOCAL_DEF( x )  x
-#endif
-
-#endif /* FT_MAKE_OPTION_SINGLE_OBJECT */
-
-#define FT_LOCAL_ARRAY( x )      extern const  x
-#define FT_LOCAL_ARRAY_DEF( x )  const  x
-
-
-#ifndef FT_BASE
-
-#ifdef __cplusplus
-#define FT_BASE( x )  extern "C"  x
-#else
-#define FT_BASE( x )  extern  x
-#endif
-
-#endif /* !FT_BASE */
-
-
-#ifndef FT_BASE_DEF
-
-#ifdef __cplusplus
-#define FT_BASE_DEF( x )  x
-#else
-#define FT_BASE_DEF( x )  x
-#endif
-
-#endif /* !FT_BASE_DEF */
-
-
-#ifndef FT_EXPORT
-
-#ifdef __cplusplus
-#define FT_EXPORT( x )  extern "C"  x
-#else
-#define FT_EXPORT( x )  extern  x
-#endif
-
-#endif /* !FT_EXPORT */
-
-
-#ifndef FT_EXPORT_DEF
-
-#ifdef __cplusplus
-#define FT_EXPORT_DEF( x )  extern "C"  x
-#else
-#define FT_EXPORT_DEF( x )  extern  x
-#endif
-
-#endif /* !FT_EXPORT_DEF */
-
-
-#ifndef FT_EXPORT_VAR
-
-#ifdef __cplusplus
-#define FT_EXPORT_VAR( x )  extern "C"  x
-#else
-#define FT_EXPORT_VAR( x )  extern  x
-#endif
-
-#endif /* !FT_EXPORT_VAR */
-
-  /* The following macros are needed to compile the library with a   */
-  /* C++ compiler and with 16bit compilers.                          */
-  /*                                                                 */
-
-  /* This is special.  Within C++, you must specify `extern "C"' for */
-  /* functions which are used via function pointers, and you also    */
-  /* must do that for structures which contain function pointers to  */
-  /* assure C linkage -- it's not possible to have (local) anonymous */
-  /* functions which are accessed by (global) function pointers.     */
-  /*                                                                 */
-  /*                                                                 */
-  /* FT_CALLBACK_DEF is used to _define_ a callback function.        */
-  /*                                                                 */
-  /* FT_CALLBACK_TABLE is used to _declare_ a constant variable that */
-  /* contains pointers to callback functions.                        */
-  /*                                                                 */
-  /* FT_CALLBACK_TABLE_DEF is used to _define_ a constant variable   */
-  /* that contains pointers to callback functions.                   */
-  /*                                                                 */
-  /*                                                                 */
-  /* Some 16bit compilers have to redefine these macros to insert    */
-  /* the infamous `_cdecl' or `__fastcall' declarations.             */
-  /*                                                                 */
-#ifndef FT_CALLBACK_DEF
-#ifdef __cplusplus
-#define FT_CALLBACK_DEF( x )  extern "C"  x
-#else
-#define FT_CALLBACK_DEF( x )  static  x
-#endif
-#endif /* FT_CALLBACK_DEF */
-
-#ifndef FT_CALLBACK_TABLE
-#ifdef __cplusplus
-#define FT_CALLBACK_TABLE      extern "C"
-#define FT_CALLBACK_TABLE_DEF  extern "C"
-#else
-#define FT_CALLBACK_TABLE      extern
-#define FT_CALLBACK_TABLE_DEF  /* nothing */
-#endif
-#endif /* FT_CALLBACK_TABLE */
-
-
-FT_END_HEADER
-
-
-#endif /* FTCONFIG_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/config/ftheader.h b/third_party/freetype/include/freetype/config/ftheader.h
deleted file mode 100644
index 950d36c..0000000
--- a/third_party/freetype/include/freetype/config/ftheader.h
+++ /dev/null
@@ -1,833 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftheader.h                                                             */
-/*                                                                         */
-/*    Build macros of the FreeType 2 library.                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTHEADER_H_
-#define FTHEADER_H_
-
-
-  /*@***********************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_BEGIN_HEADER                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro is used in association with @FT_END_HEADER in header    */
-  /*    files to ensure that the declarations within are properly          */
-  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
-  /*    C++ compiler.                                                      */
-  /*                                                                       */
-#ifdef __cplusplus
-#define FT_BEGIN_HEADER  extern "C" {
-#else
-#define FT_BEGIN_HEADER  /* nothing */
-#endif
-
-
-  /*@***********************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_END_HEADER                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro is used in association with @FT_BEGIN_HEADER in header  */
-  /*    files to ensure that the declarations within are properly          */
-  /*    encapsulated in an `extern "C" { .. }' block when included from a  */
-  /*    C++ compiler.                                                      */
-  /*                                                                       */
-#ifdef __cplusplus
-#define FT_END_HEADER  }
-#else
-#define FT_END_HEADER  /* nothing */
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Aliases for the FreeType 2 public and configuration files.            */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    header_file_macros                                                 */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Header File Macros                                                 */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Macro definitions used to #include specific header files.          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The following macros are defined to the name of specific           */
-  /*    FreeType~2 header files.  They can be used directly in #include    */
-  /*    statements as in:                                                  */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      #include FT_FREETYPE_H                                           */
-  /*      #include FT_MULTIPLE_MASTERS_H                                   */
-  /*      #include FT_GLYPH_H                                              */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    There are several reasons why we are now using macros to name      */
-  /*    public header files.  The first one is that such macros are not    */
-  /*    limited to the infamous 8.3~naming rule required by DOS (and       */
-  /*    `FT_MULTIPLE_MASTERS_H' is a lot more meaningful than `ftmm.h').   */
-  /*                                                                       */
-  /*    The second reason is that it allows for more flexibility in the    */
-  /*    way FreeType~2 is installed on a given system.                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* configuration files */
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CONFIG_CONFIG_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   FreeType~2 configuration data.
-   *
-   */
-#ifndef FT_CONFIG_CONFIG_H
-#define FT_CONFIG_CONFIG_H  <freetype/config/ftconfig.h>
-#endif
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CONFIG_STANDARD_LIBRARY_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   FreeType~2 interface to the standard C library functions.
-   *
-   */
-#ifndef FT_CONFIG_STANDARD_LIBRARY_H
-#define FT_CONFIG_STANDARD_LIBRARY_H  <freetype/config/ftstdlib.h>
-#endif
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CONFIG_OPTIONS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   FreeType~2 project-specific configuration options.
-   *
-   */
-#ifndef FT_CONFIG_OPTIONS_H
-#define FT_CONFIG_OPTIONS_H  <freetype/config/ftoption.h>
-#endif
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CONFIG_MODULES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   list of FreeType~2 modules that are statically linked to new library
-   *   instances in @FT_Init_FreeType.
-   *
-   */
-#ifndef FT_CONFIG_MODULES_H
-#define FT_CONFIG_MODULES_H  <freetype/config/ftmodule.h>
-#endif
-
-  /* */
-
-  /* public headers */
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_FREETYPE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   base FreeType~2 API.
-   *
-   */
-#define FT_FREETYPE_H  <freetype/freetype.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ERRORS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   list of FreeType~2 error codes (and messages).
-   *
-   *   It is included by @FT_FREETYPE_H.
-   *
-   */
-#define FT_ERRORS_H  <freetype/fterrors.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_MODULE_ERRORS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   list of FreeType~2 module error offsets (and messages).
-   *
-   */
-#define FT_MODULE_ERRORS_H  <freetype/ftmoderr.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_SYSTEM_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 interface to low-level operations (i.e., memory management
-   *   and stream i/o).
-   *
-   *   It is included by @FT_FREETYPE_H.
-   *
-   */
-#define FT_SYSTEM_H  <freetype/ftsystem.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IMAGE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing type
-   *   definitions related to glyph images (i.e., bitmaps, outlines,
-   *   scan-converter parameters).
-   *
-   *   It is included by @FT_FREETYPE_H.
-   *
-   */
-#define FT_IMAGE_H  <freetype/ftimage.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TYPES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   basic data types defined by FreeType~2.
-   *
-   *   It is included by @FT_FREETYPE_H.
-   *
-   */
-#define FT_TYPES_H  <freetype/fttypes.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_LIST_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   list management API of FreeType~2.
-   *
-   *   (Most applications will never need to include this file.)
-   *
-   */
-#define FT_LIST_H  <freetype/ftlist.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_OUTLINE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   scalable outline management API of FreeType~2.
-   *
-   */
-#define FT_OUTLINE_H  <freetype/ftoutln.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_SIZES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   API which manages multiple @FT_Size objects per face.
-   *
-   */
-#define FT_SIZES_H  <freetype/ftsizes.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_MODULE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   module management API of FreeType~2.
-   *
-   */
-#define FT_MODULE_H  <freetype/ftmodapi.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_RENDER_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   renderer module management API of FreeType~2.
-   *
-   */
-#define FT_RENDER_H  <freetype/ftrender.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_AUTOHINTER_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   structures and macros related to the auto-hinting module.
-   *
-   */
-#define FT_AUTOHINTER_H  <freetype/ftautoh.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CFF_DRIVER_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   structures and macros related to the CFF driver module.
-   *
-   */
-#define FT_CFF_DRIVER_H  <freetype/ftcffdrv.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TRUETYPE_DRIVER_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing
-   *   structures and macros related to the TrueType driver module.
-   *
-   */
-#define FT_TRUETYPE_DRIVER_H  <freetype/ftttdrv.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TYPE1_TABLES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   types and API specific to the Type~1 format.
-   *
-   */
-#define FT_TYPE1_TABLES_H  <freetype/t1tables.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TRUETYPE_IDS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   enumeration values which identify name strings, languages, encodings,
-   *   etc.  This file really contains a _large_ set of constant macro
-   *   definitions, taken from the TrueType and OpenType specifications.
-   *
-   */
-#define FT_TRUETYPE_IDS_H  <freetype/ttnameid.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TRUETYPE_TABLES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   types and API specific to the TrueType (as well as OpenType) format.
-   *
-   */
-#define FT_TRUETYPE_TABLES_H  <freetype/tttables.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TRUETYPE_TAGS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of TrueType four-byte `tags' which identify blocks in
-   *   SFNT-based font formats (i.e., TrueType and OpenType).
-   *
-   */
-#define FT_TRUETYPE_TAGS_H  <freetype/tttags.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_BDF_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which accesses BDF-specific strings from a
-   *   face.
-   *
-   */
-#define FT_BDF_H  <freetype/ftbdf.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CID_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which access CID font information from a
-   *   face.
-   *
-   */
-#define FT_CID_H  <freetype/ftcid.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_GZIP_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which supports gzip-compressed files.
-   *
-   */
-#define FT_GZIP_H  <freetype/ftgzip.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_LZW_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which supports LZW-compressed files.
-   *
-   */
-#define FT_LZW_H  <freetype/ftlzw.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_BZIP2_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which supports bzip2-compressed files.
-   *
-   */
-#define FT_BZIP2_H  <freetype/ftbzip2.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_WINFONTS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   definitions of an API which supports Windows FNT files.
-   *
-   */
-#define FT_WINFONTS_H   <freetype/ftwinfnt.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_GLYPH_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   API of the optional glyph management component.
-   *
-   */
-#define FT_GLYPH_H  <freetype/ftglyph.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_BITMAP_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   API of the optional bitmap conversion component.
-   *
-   */
-#define FT_BITMAP_H  <freetype/ftbitmap.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_BBOX_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   API of the optional exact bounding box computation routines.
-   *
-   */
-#define FT_BBOX_H  <freetype/ftbbox.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_CACHE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   API of the optional FreeType~2 cache sub-system.
-   *
-   */
-#define FT_CACHE_H  <freetype/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
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_MAC_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   Macintosh-specific FreeType~2 API.  The latter is used to access
-   *   fonts embedded in resource forks.
-   *
-   *   This header file must be explicitly included by client applications
-   *   compiled on the Mac (note that the base API still works though).
-   *
-   */
-#define FT_MAC_H  <freetype/ftmac.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_MULTIPLE_MASTERS_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   optional multiple-masters management API of FreeType~2.
-   *
-   */
-#define FT_MULTIPLE_MASTERS_H  <freetype/ftmm.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_SFNT_NAMES_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   optional FreeType~2 API which accesses embedded `name' strings in
-   *   SFNT-based font formats (i.e., TrueType and OpenType).
-   *
-   */
-#define FT_SFNT_NAMES_H  <freetype/ftsnames.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_OPENTYPE_VALIDATE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   optional FreeType~2 API which validates OpenType tables (BASE, GDEF,
-   *   GPOS, GSUB, JSTF).
-   *
-   */
-#define FT_OPENTYPE_VALIDATE_H  <freetype/ftotval.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_GX_VALIDATE_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   optional FreeType~2 API which validates TrueTypeGX/AAT tables (feat,
-   *   mort, morx, bsln, just, kern, opbd, trak, prop).
-   *
-   */
-#define FT_GX_VALIDATE_H  <freetype/ftgxval.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_PFR_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 API which accesses PFR-specific data.
-   *
-   */
-#define FT_PFR_H  <freetype/ftpfr.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_STROKER_H
-   *
-   * @description:
-   *   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  <freetype/ftstroke.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_SYNTHESIS_H
-   *
-   * @description:
-   *   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  <freetype/ftsynth.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_FONT_FORMATS_H
-   *
-   * @description:
-   *   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  <freetype/ftfntfmt.h>
-
-  /* deprecated */
-#define FT_XFREE86_H  FT_FONT_FORMATS_H
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_TRIGONOMETRY_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 API which performs trigonometric computations (e.g.,
-   *   cosines and arc tangents).
-   */
-#define FT_TRIGONOMETRY_H  <freetype/fttrigon.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_LCD_FILTER_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_LCD_FILTER_H  <freetype/ftlcdfil.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_UNPATENTED_HINTING_H
-   *
-   * @description:
-   *   Deprecated.
-   */
-#define FT_UNPATENTED_HINTING_H  <freetype/ttunpat.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_INCREMENTAL_H
-   *
-   * @description:
-   *   A macro used in #include statements to name the file containing the
-   *   FreeType~2 API which performs incremental glyph loading.
-   */
-#define FT_INCREMENTAL_H  <freetype/ftincrem.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_GASP_H
-   *
-   * @description:
-   *   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  <freetype/ftgasp.h>
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ADVANCES_H
-   *
-   * @description:
-   *   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  <freetype/ftadvanc.h>
-
-
-  /* */
-
-#define FT_ERROR_DEFINITIONS_H  <freetype/fterrdef.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           <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_MRU_H      <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_MANAGER_H  <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_CACHE_H    <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_GLYPH_H    <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_IMAGE_H    <freetype/ftcache.h>
-#define FT_CACHE_INTERNAL_SBITS_H    <freetype/ftcache.h>
-
-
-#define FT_INCREMENTAL_H          <freetype/ftincrem.h>
-
-#define FT_TRUETYPE_UNPATENTED_H  <freetype/ttunpat.h>
-
-
-  /*
-   * Include internal headers definitions from <internal/...>
-   * only when building the library.
-   */
-#ifdef FT2_BUILD_LIBRARY
-#define  FT_INTERNAL_INTERNAL_H  <freetype/internal/internal.h>
-#include FT_INTERNAL_INTERNAL_H
-#endif /* FT2_BUILD_LIBRARY */
-
-
-#endif /* FTHEADER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/config/ftstdlib.h b/third_party/freetype/include/freetype/config/ftstdlib.h
deleted file mode 100644
index 05a4845..0000000
--- a/third_party/freetype/include/freetype/config/ftstdlib.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftstdlib.h                                                             */
-/*                                                                         */
-/*    ANSI-specific library and header configuration file (specification   */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 2002-2017 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 used to group all #includes to the ANSI C library that   */
-  /* 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. */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTSTDLIB_H_
-#define FTSTDLIB_H_
-
-
-#include <stddef.h>
-
-#define ft_ptrdiff_t  ptrdiff_t
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                           integer limits                           */
-  /*                                                                    */
-  /* UINT_MAX and ULONG_MAX are used to automatically compute the size  */
-  /* of `int' and `long' in bytes at compile-time.  So far, this works  */
-  /* for all platforms the library has been tested on.                  */
-  /*                                                                    */
-  /* Note that on the extremely rare platforms that do not provide      */
-  /* integer types that are _exactly_ 16 and 32 bits wide (e.g. some    */
-  /* old Crays where `int' is 36 bits), we do not make any guarantee    */
-  /* about the correct behaviour of FT2 with all fonts.                 */
-  /*                                                                    */
-  /* In these case, `ftconfig.h' will refuse to compile anyway with a   */
-  /* message like `couldn't find 32-bit type' or something similar.     */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#include <limits.h>
-
-#define FT_CHAR_BIT    CHAR_BIT
-#define FT_USHORT_MAX  USHRT_MAX
-#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
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                 character and string processing                    */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#include <string.h>
-
-#define ft_memchr   memchr
-#define ft_memcmp   memcmp
-#define ft_memcpy   memcpy
-#define ft_memmove  memmove
-#define ft_memset   memset
-#define ft_strcat   strcat
-#define ft_strcmp   strcmp
-#define ft_strcpy   strcpy
-#define ft_strlen   strlen
-#define ft_strncmp  strncmp
-#define ft_strncpy  strncpy
-#define ft_strrchr  strrchr
-#define ft_strstr   strstr
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                           file handling                            */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#include <stdio.h>
-
-#define FT_FILE     FILE
-#define ft_fclose   fclose
-#define ft_fopen    fopen
-#define ft_fread    fread
-#define ft_fseek    fseek
-#define ft_ftell    ftell
-#define ft_sprintf  sprintf
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                             sorting                                */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#include <stdlib.h>
-
-#define ft_qsort  qsort
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                        memory allocation                           */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#define ft_scalloc   calloc
-#define ft_sfree     free
-#define ft_smalloc   malloc
-#define ft_srealloc  realloc
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                          miscellaneous                             */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#define ft_strtol  strtol
-#define ft_getenv  getenv
-
-
-  /**********************************************************************/
-  /*                                                                    */
-  /*                         execution control                          */
-  /*                                                                    */
-  /**********************************************************************/
-
-
-#include <setjmp.h>
-
-#define ft_jmp_buf     jmp_buf  /* note: this cannot be a typedef since */
-                                /*       jmp_buf is defined as a macro  */
-                                /*       on certain platforms           */
-
-#define ft_longjmp     longjmp
-#define ft_setjmp( b ) setjmp( *(ft_jmp_buf*) &(b) ) /* same thing here */
-
-
-  /* the following is only used for debugging purposes, i.e., if */
-  /* FT_DEBUG_LEVEL_ERROR or FT_DEBUG_LEVEL_TRACE are defined    */
-
-#include <stdarg.h>
-
-
-#endif /* FTSTDLIB_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/freetype.h b/third_party/freetype/include/freetype/freetype.h
deleted file mode 100644
index b6c6032..0000000
--- a/third_party/freetype/include/freetype/freetype.h
+++ /dev/null
@@ -1,4357 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  freetype.h                                                             */
-/*                                                                         */
-/*    FreeType high-level API and common types (specification only).       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FREETYPE_H_
-#define FREETYPE_H_
-
-
-#ifndef FT_FREETYPE_H
-#error "`ft2build.h' hasn't been included yet!"
-#error "Please always use macros to include FreeType header files."
-#error "Example:"
-#error "  #include <ft2build.h>"
-#error "  #include FT_FREETYPE_H"
-#endif
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_TYPES_H
-#include FT_ERRORS_H
-
-
-FT_BEGIN_HEADER
-
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    header_inclusion                                                   */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    FreeType's header inclusion scheme                                 */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    How client applications should include FreeType header files.      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    To be as flexible as possible (and for historical reasons),        */
-  /*    FreeType uses a very special inclusion scheme to load header       */
-  /*    files, for example                                                 */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      #include <ft2build.h>                                            */
-  /*                                                                       */
-  /*      #include FT_FREETYPE_H                                           */
-  /*      #include FT_OUTLINE_H                                            */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    A compiler and its preprocessor only needs an include path to find */
-  /*    the file `ft2build.h'; the exact locations and names of the other  */
-  /*    FreeType header files are hidden by preprocessor macro names,      */
-  /*    loaded by `ft2build.h'.  The API documentation always gives the    */
-  /*    header macro name needed for a particular function.                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    user_allocation                                                    */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    User allocation                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    How client applications should allocate FreeType data structures.  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FreeType assumes that structures allocated by the user and passed  */
-  /*    as arguments are zeroed out except for the actual data.  In other  */
-  /*    words, it is recommended to use `calloc' (or variants of it)       */
-  /*    instead of `malloc' for allocation.                                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
-  /*                        B A S I C   T Y P E S                          */
-  /*                                                                       */
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    base_interface                                                     */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Base Interface                                                     */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    The FreeType~2 base font interface.                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section describes the most important public high-level API    */
-  /*    functions of FreeType~2.                                           */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Library                                                         */
-  /*    FT_Face                                                            */
-  /*    FT_Size                                                            */
-  /*    FT_GlyphSlot                                                       */
-  /*    FT_CharMap                                                         */
-  /*    FT_Encoding                                                        */
-  /*    FT_ENC_TAG                                                         */
-  /*                                                                       */
-  /*    FT_FaceRec                                                         */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_SCALABLE                                              */
-  /*    FT_FACE_FLAG_FIXED_SIZES                                           */
-  /*    FT_FACE_FLAG_FIXED_WIDTH                                           */
-  /*    FT_FACE_FLAG_HORIZONTAL                                            */
-  /*    FT_FACE_FLAG_VERTICAL                                              */
-  /*    FT_FACE_FLAG_COLOR                                                 */
-  /*    FT_FACE_FLAG_SFNT                                                  */
-  /*    FT_FACE_FLAG_CID_KEYED                                             */
-  /*    FT_FACE_FLAG_TRICKY                                                */
-  /*    FT_FACE_FLAG_KERNING                                               */
-  /*    FT_FACE_FLAG_MULTIPLE_MASTERS                                      */
-  /*    FT_FACE_FLAG_GLYPH_NAMES                                           */
-  /*    FT_FACE_FLAG_EXTERNAL_STREAM                                       */
-  /*    FT_FACE_FLAG_HINTER                                                */
-  /*                                                                       */
-  /*    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_IS_SFNT                                                         */
-  /*    FT_IS_SCALABLE                                                     */
-  /*    FT_IS_FIXED_WIDTH                                                  */
-  /*    FT_IS_CID_KEYED                                                    */
-  /*    FT_IS_TRICKY                                                       */
-  /*                                                                       */
-  /*    FT_STYLE_FLAG_BOLD                                                 */
-  /*    FT_STYLE_FLAG_ITALIC                                               */
-  /*                                                                       */
-  /*    FT_SizeRec                                                         */
-  /*    FT_Size_Metrics                                                    */
-  /*                                                                       */
-  /*    FT_GlyphSlotRec                                                    */
-  /*    FT_Glyph_Metrics                                                   */
-  /*    FT_SubGlyph                                                        */
-  /*                                                                       */
-  /*    FT_Bitmap_Size                                                     */
-  /*                                                                       */
-  /*    FT_Init_FreeType                                                   */
-  /*    FT_Done_FreeType                                                   */
-  /*                                                                       */
-  /*    FT_New_Face                                                        */
-  /*    FT_Done_Face                                                       */
-  /*    FT_Reference_Face                                                  */
-  /*    FT_New_Memory_Face                                                 */
-  /*    FT_Open_Face                                                       */
-  /*    FT_Open_Args                                                       */
-  /*    FT_Parameter                                                       */
-  /*    FT_Attach_File                                                     */
-  /*    FT_Attach_Stream                                                   */
-  /*                                                                       */
-  /*    FT_Set_Char_Size                                                   */
-  /*    FT_Set_Pixel_Sizes                                                 */
-  /*    FT_Request_Size                                                    */
-  /*    FT_Select_Size                                                     */
-  /*    FT_Size_Request_Type                                               */
-  /*    FT_Size_RequestRec                                                 */
-  /*    FT_Size_Request                                                    */
-  /*    FT_Set_Transform                                                   */
-  /*    FT_Load_Glyph                                                      */
-  /*    FT_Get_Char_Index                                                  */
-  /*    FT_Get_First_Char                                                  */
-  /*    FT_Get_Next_Char                                                   */
-  /*    FT_Get_Name_Index                                                  */
-  /*    FT_Load_Char                                                       */
-  /*                                                                       */
-  /*    FT_OPEN_MEMORY                                                     */
-  /*    FT_OPEN_STREAM                                                     */
-  /*    FT_OPEN_PATHNAME                                                   */
-  /*    FT_OPEN_DRIVER                                                     */
-  /*    FT_OPEN_PARAMS                                                     */
-  /*                                                                       */
-  /*    FT_LOAD_DEFAULT                                                    */
-  /*    FT_LOAD_RENDER                                                     */
-  /*    FT_LOAD_MONOCHROME                                                 */
-  /*    FT_LOAD_LINEAR_DESIGN                                              */
-  /*    FT_LOAD_NO_SCALE                                                   */
-  /*    FT_LOAD_NO_HINTING                                                 */
-  /*    FT_LOAD_NO_BITMAP                                                  */
-  /*    FT_LOAD_NO_AUTOHINT                                                */
-  /*    FT_LOAD_COLOR                                                      */
-  /*                                                                       */
-  /*    FT_LOAD_VERTICAL_LAYOUT                                            */
-  /*    FT_LOAD_IGNORE_TRANSFORM                                           */
-  /*    FT_LOAD_FORCE_AUTOHINT                                             */
-  /*    FT_LOAD_NO_RECURSE                                                 */
-  /*    FT_LOAD_PEDANTIC                                                   */
-  /*                                                                       */
-  /*    FT_LOAD_TARGET_NORMAL                                              */
-  /*    FT_LOAD_TARGET_LIGHT                                               */
-  /*    FT_LOAD_TARGET_MONO                                                */
-  /*    FT_LOAD_TARGET_LCD                                                 */
-  /*    FT_LOAD_TARGET_LCD_V                                               */
-  /*                                                                       */
-  /*    FT_LOAD_TARGET_MODE                                                */
-  /*                                                                       */
-  /*    FT_Render_Glyph                                                    */
-  /*    FT_Render_Mode                                                     */
-  /*    FT_Get_Kerning                                                     */
-  /*    FT_Kerning_Mode                                                    */
-  /*    FT_Get_Track_Kerning                                               */
-  /*    FT_Get_Glyph_Name                                                  */
-  /*    FT_Get_Postscript_Name                                             */
-  /*                                                                       */
-  /*    FT_CharMapRec                                                      */
-  /*    FT_Select_Charmap                                                  */
-  /*    FT_Set_Charmap                                                     */
-  /*    FT_Get_Charmap_Index                                               */
-  /*                                                                       */
-  /*    FT_Get_FSType_Flags                                                */
-  /*    FT_Get_SubGlyph_Info                                               */
-  /*                                                                       */
-  /*    FT_Face_Internal                                                   */
-  /*    FT_Size_Internal                                                   */
-  /*    FT_Slot_Internal                                                   */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_XXX                                                   */
-  /*    FT_STYLE_FLAG_XXX                                                  */
-  /*    FT_OPEN_XXX                                                        */
-  /*    FT_LOAD_XXX                                                        */
-  /*    FT_LOAD_TARGET_XXX                                                 */
-  /*    FT_SUBGLYPH_FLAG_XXX                                               */
-  /*    FT_FSTYPE_XXX                                                      */
-  /*                                                                       */
-  /*    FT_HAS_FAST_GLYPHS                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Glyph_Metrics                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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.                               */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    width ::                                                           */
-  /*      The glyph's width.                                               */
-  /*                                                                       */
-  /*    height ::                                                          */
-  /*      The glyph's height.                                              */
-  /*                                                                       */
-  /*    horiBearingX ::                                                    */
-  /*      Left side bearing for horizontal layout.                         */
-  /*                                                                       */
-  /*    horiBearingY ::                                                    */
-  /*      Top side bearing for horizontal layout.                          */
-  /*                                                                       */
-  /*    horiAdvance ::                                                     */
-  /*      Advance width for horizontal layout.                             */
-  /*                                                                       */
-  /*    vertBearingX ::                                                    */
-  /*      Left side bearing for vertical layout.                           */
-  /*                                                                       */
-  /*    vertBearingY ::                                                    */
-  /*      Top side bearing for vertical layout.  Larger positive values    */
-  /*      mean further below the vertical glyph origin.                    */
-  /*                                                                       */
-  /*    vertAdvance ::                                                     */
-  /*      Advance height for vertical layout.  Positive values mean the    */
-  /*      glyph has a positive advance downward.                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    If not disabled with @FT_LOAD_NO_HINTING, the values represent     */
-  /*    dimensions of the hinted glyph (in case hinting is applicable).    */
-  /*                                                                       */
-  /*    Stroking a glyph with an outside border does not increase          */
-  /*    `horiAdvance' or `vertAdvance'; you have to manually adjust these  */
-  /*    values to account for the added width and height.                  */
-  /*                                                                       */
-  typedef struct  FT_Glyph_Metrics_
-  {
-    FT_Pos  width;
-    FT_Pos  height;
-
-    FT_Pos  horiBearingX;
-    FT_Pos  horiBearingY;
-    FT_Pos  horiAdvance;
-
-    FT_Pos  vertBearingX;
-    FT_Pos  vertBearingY;
-    FT_Pos  vertAdvance;
-
-  } FT_Glyph_Metrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Bitmap_Size                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure models the metrics of a bitmap strike (i.e., a set  */
-  /*    of glyphs for a given point size and resolution) in a bitmap font. */
-  /*    It is used for the `available_sizes' field of @FT_Face.            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    height :: The vertical distance, in pixels, between two            */
-  /*              consecutive baselines.  It is always positive.           */
-  /*                                                                       */
-  /*    width  :: The average width, in pixels, of all glyphs in the       */
-  /*              strike.                                                  */
-  /*                                                                       */
-  /*    size   :: The nominal size of the strike in 26.6 fractional        */
-  /*              points.  This field is not very useful.                  */
-  /*                                                                       */
-  /*    x_ppem :: The horizontal ppem (nominal width) in 26.6 fractional   */
-  /*              pixels.                                                  */
-  /*                                                                       */
-  /*    y_ppem :: The vertical ppem (nominal height) in 26.6 fractional    */
-  /*              pixels.                                                  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Windows FNT:                                                       */
-  /*      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    */
-  /*      bitmap strike itself.  They are computed from the global font    */
-  /*      parameters.                                                      */
-  /*                                                                       */
-  typedef struct  FT_Bitmap_Size_
-  {
-    FT_Short  height;
-    FT_Short  width;
-
-    FT_Pos    size;
-
-    FT_Pos    x_ppem;
-    FT_Pos    y_ppem;
-
-  } FT_Bitmap_Size;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
-  /*                     O B J E C T   C L A S S E S                       */
-  /*                                                                       */
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Library                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a FreeType library instance.  Each `library' is        */
-  /*    completely independent from the others; it is the `root' of a set  */
-  /*    of objects like fonts, faces, sizes, etc.                          */
-  /*                                                                       */
-  /*    It also embeds a memory manager (see @FT_Memory), as well as a     */
-  /*    scan-line converter object (see @FT_Raster).                       */
-  /*                                                                       */
-  /*    In multi-threaded applications it is easiest to use one            */
-  /*    `FT_Library' object per thread.  In case this is too cumbersome,   */
-  /*    a single `FT_Library' object across threads is possible also       */
-  /*    (since FreeType version 2.5.6), as long as a mutex lock is used    */
-  /*    around @FT_New_Face and @FT_Done_Face.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Library objects are normally created by @FT_Init_FreeType, and     */
-  /*    destroyed with @FT_Done_FreeType.  If you need reference-counting  */
-  /*    (cf. @FT_Reference_Library), use @FT_New_Library and               */
-  /*    @FT_Done_Library.                                                  */
-  /*                                                                       */
-  typedef struct FT_LibraryRec_  *FT_Library;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    module_management                                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Module                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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 former.                                                     */
-  /*                                                                       */
-  typedef struct FT_ModuleRec_*  FT_Module;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Driver                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Renderer                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    base_interface                                                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Face                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a typographic face object.  A face object models a     */
-  /*    given typeface, in a given style.                                  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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 filepath or a custom input stream.                         */
-  /*                                                                       */
-  /*    Use @FT_Done_Face to destroy it (along with its slot and sizes).   */
-  /*                                                                       */
-  /*    An `FT_Face' object can only be safely used from one thread at a   */
-  /*    time.  Similarly, creation and destruction of `FT_Face' with the   */
-  /*    same @FT_Library object can only be done from one thread at a      */
-  /*    time.  On the other hand, functions like @FT_Load_Glyph and its    */
-  /*    siblings are thread-safe and do not need the lock to be held as    */
-  /*    long as the same `FT_Face' object is not used from multiple        */
-  /*    threads at the same time.                                          */
-  /*                                                                       */
-  /* <Also>                                                                */
-  /*    See @FT_FaceRec for the publicly accessible fields of a given face */
-  /*    object.                                                            */
-  /*                                                                       */
-  typedef struct FT_FaceRec_*  FT_Face;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Size                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an object that models a face scaled to a given         */
-  /*    character size.                                                    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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.                                                           */
-  /*                                                                       */
-  /*    You can use @FT_Set_Char_Size, @FT_Set_Pixel_Sizes,                */
-  /*    @FT_Request_Size or even @FT_Select_Size to change the content     */
-  /*    (i.e., the scaling values) of the active @FT_Size.                 */
-  /*                                                                       */
-  /*    You can use @FT_New_Size to create additional size objects for a   */
-  /*    given @FT_Face, but they won't be used by other functions until    */
-  /*    you activate it through @FT_Activate_Size.  Only one size can be   */
-  /*    activated at any given time per face.                              */
-  /*                                                                       */
-  /* <Also>                                                                */
-  /*    See @FT_SizeRec for the publicly accessible fields of a given size */
-  /*    object.                                                            */
-  /*                                                                       */
-  typedef struct FT_SizeRec_*  FT_Size;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_GlyphSlot                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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, */
-  /*    i.e., the glyph's metrics, its image (bitmap or outline), and      */
-  /*    other control information.                                         */
-  /*                                                                       */
-  /* <Also>                                                                */
-  /*    See @FT_GlyphSlotRec for the publicly accessible glyph fields.     */
-  /*                                                                       */
-  typedef struct FT_GlyphSlotRec_*  FT_GlyphSlot;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_CharMap                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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', 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.   */
-  /*                                                                       */
-  /*    The currently active charmap is available as `face->charmap'.      */
-  /*    You should call @FT_Set_Charmap to change it.                      */
-  /*                                                                       */
-  /* <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.                           */
-  /*                                                                       */
-  /* <Also>                                                                */
-  /*    See @FT_CharMapRec for the publicly accessible fields of a given   */
-  /*    character map.                                                     */
-  /*                                                                       */
-  typedef struct FT_CharMapRec_*  FT_CharMap;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_ENC_TAG                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro converts four-letter tags into an unsigned long.  It is */
-  /*    used to define `encoding' identifiers (see @FT_Encoding).          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
-  /*    should redefine this macro in case of problems to something like   */
-  /*    this:                                                              */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      #define FT_ENC_TAG( value, a, b, c, d )  value                   */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    to get a simple enumeration without assigning special numbers.     */
-  /*                                                                       */
-
-#ifndef FT_ENC_TAG
-#define FT_ENC_TAG( value, a, b, c, d )         \
-          value = ( ( (FT_UInt32)(a) << 24 ) |  \
-                    ( (FT_UInt32)(b) << 16 ) |  \
-                    ( (FT_UInt32)(c) <<  8 ) |  \
-                      (FT_UInt32)(d)         )
-
-#endif /* FT_ENC_TAG */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Encoding                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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        */
-  /*    repertories (i.e., charsets), and not text encoding methods (e.g., */
-  /*    UTF-8, UTF-16, etc.).                                              */
-  /*                                                                       */
-  /*    Other encodings might be defined in the future.                    */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_ENCODING_NONE ::                                                */
-  /*      The encoding value~0 is reserved.                                */
-  /*                                                                       */
-  /*    FT_ENCODING_UNICODE ::                                             */
-  /*      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 ::                                           */
-  /*      Microsoft Symbol encoding, used to encode mathematical symbols   */
-  /*      and wingdings.  For more information, see                        */
-  /*      `http://www.microsoft.com/typography/otspec/recom.htm',          */
-  /*      `http://www.kostis.net/charsets/symbol.htm', and                 */
-  /*      `http://www.kostis.net/charsets/wingding.htm'.                   */
-  /*                                                                       */
-  /*      This encoding uses character codes from the PUA (Private Unicode */
-  /*      Area) in the range U+F020-U+F0FF.                                */
-  /*                                                                       */
-  /*    FT_ENCODING_SJIS ::                                                */
-  /*      Shift JIS encoding for Japanese.  More info at                   */
-  /*      `http://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 in mainland China.                                          */
-  /*                                                                       */
-  /*    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 Extended      */
-  /*      Wansung (MS Windows code page 949).                              */
-  /*      For more information see                                         */
-  /*      `http://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.            */
-  /*                                                                       */
-  /*    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 ::                                      */
-  /*      Adobe Standard encoding, as found in Type~1, CFF, and            */
-  /*      OpenType/CFF fonts.  It is limited to 256 character codes.       */
-  /*                                                                       */
-  /*    FT_ENCODING_ADOBE_EXPERT ::                                        */
-  /*      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 ::                                         */
-  /*      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 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.                         */
-  /*                                                                       */
-  /*    FT_ENCODING_MS_BIG5 ::                                             */
-  /*      Same as FT_ENCODING_BIG5.  Deprecated.                           */
-  /*                                                                       */
-  /*    FT_ENCODING_MS_WANSUNG ::                                          */
-  /*      Same as FT_ENCODING_WANSUNG.  Deprecated.                        */
-  /*                                                                       */
-  /*    FT_ENCODING_MS_JOHAB ::                                            */
-  /*      Same as FT_ENCODING_JOHAB.  Deprecated.                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    By default, FreeType automatically synthesizes a Unicode charmap   */
-  /*    for PostScript fonts, using their glyph name 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.                                                    */
-  /*                                                                       */
-  /*    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          */
-  /*    FT_ENCODING_UNICODE).  Use @FT_Get_BDF_Charset_ID to find out      */
-  /*    which encoding is really present.  If, for example, the            */
-  /*    `cs_registry' field is `KOI8' and the `cs_encoding' field is `R',  */
-  /*    the font is encoded in KOI8-R.                                     */
-  /*                                                                       */
-  /*    FT_ENCODING_NONE is always set (with a single exception) by the    */
-  /*    winfonts driver.  Use @FT_Get_WinFNT_Header and examine the        */
-  /*    `charset' field of the @FT_WinFNT_HeaderRec structure to find out  */
-  /*    which encoding is really present.  For example,                    */
-  /*    @FT_WinFNT_ID_CP1251 (204) means Windows code page 1251 (for       */
-  /*    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  */
-  /*    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  */
-  /*                                                                       */
-  /*    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_LANGID_GREEK', it is the Greek encoding, not Roman.        */
-  /*    @TT_MAC_ID_ARABIC with `TT_MAC_LANGID_FARSI' means the Farsi       */
-  /*    variant the Arabic encoding.                                       */
-  /*                                                                       */
-  typedef enum  FT_Encoding_
-  {
-    FT_ENC_TAG( FT_ENCODING_NONE, 0, 0, 0, 0 ),
-
-    FT_ENC_TAG( FT_ENCODING_MS_SYMBOL, 's', 'y', 'm', 'b' ),
-    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_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 */
-    FT_ENCODING_MS_SJIS    = FT_ENCODING_SJIS,
-    FT_ENCODING_MS_GB2312  = FT_ENCODING_GB2312,
-    FT_ENCODING_MS_BIG5    = FT_ENCODING_BIG5,
-    FT_ENCODING_MS_WANSUNG = FT_ENCODING_WANSUNG,
-    FT_ENCODING_MS_JOHAB   = FT_ENCODING_JOHAB,
-
-    FT_ENC_TAG( FT_ENCODING_ADOBE_STANDARD, 'A', 'D', 'O', 'B' ),
-    FT_ENC_TAG( FT_ENCODING_ADOBE_EXPERT,   'A', 'D', 'B', 'E' ),
-    FT_ENC_TAG( FT_ENCODING_ADOBE_CUSTOM,   'A', 'D', 'B', 'C' ),
-    FT_ENC_TAG( FT_ENCODING_ADOBE_LATIN_1,  'l', 'a', 't', '1' ),
-
-    FT_ENC_TAG( FT_ENCODING_OLD_LATIN_2, 'l', 'a', 't', '2' ),
-
-    FT_ENC_TAG( FT_ENCODING_APPLE_ROMAN, 'a', 'r', 'm', 'n' )
-
-  } FT_Encoding;
-
-
-  /* these constants are deprecated; use the corresponding `FT_Encoding' */
-  /* values instead                                                      */
-#define ft_encoding_none            FT_ENCODING_NONE
-#define ft_encoding_unicode         FT_ENCODING_UNICODE
-#define ft_encoding_symbol          FT_ENCODING_MS_SYMBOL
-#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_big5            FT_ENCODING_BIG5
-#define ft_encoding_wansung         FT_ENCODING_WANSUNG
-#define ft_encoding_johab           FT_ENCODING_JOHAB
-
-#define ft_encoding_adobe_standard  FT_ENCODING_ADOBE_STANDARD
-#define ft_encoding_adobe_expert    FT_ENCODING_ADOBE_EXPERT
-#define ft_encoding_adobe_custom    FT_ENCODING_ADOBE_CUSTOM
-#define ft_encoding_apple_roman     FT_ENCODING_APPLE_ROMAN
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_CharMapRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The base charmap structure.                                        */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    face        :: A handle to the parent face object.                 */
-  /*                                                                       */
-  /*    encoding    :: An @FT_Encoding tag identifying the charmap.  Use   */
-  /*                   this with @FT_Select_Charmap.                       */
-  /*                                                                       */
-  /*    platform_id :: An ID number describing the platform for the        */
-  /*                   following encoding ID.  This comes directly from    */
-  /*                   the TrueType specification gets emulated            */
-  /*                   for other formats.                                  */
-  /*                                                                       */
-  /*    encoding_id :: A platform specific encoding number.  This also     */
-  /*                   comes from the TrueType specification and gets      */
-  /*                   emulated similarly.                                 */
-  /*                                                                       */
-  typedef struct  FT_CharMapRec_
-  {
-    FT_Face      face;
-    FT_Encoding  encoding;
-    FT_UShort    platform_id;
-    FT_UShort    encoding_id;
-
-  } FT_CharMapRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
-  /*                 B A S E   O B J E C T   C L A S S E S                 */
-  /*                                                                       */
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Face_Internal                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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.                    */
-  /*                                                                       */
-  typedef struct FT_Face_InternalRec_*  FT_Face_Internal;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_FaceRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FreeType root face class structure.  A face object models a        */
-  /*    typeface in a font file.                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_faces           :: The number of faces in the font file.  Some */
-  /*                           font formats can have multiple faces in     */
-  /*                           a single font file.                         */
-  /*                                                                       */
-  /*    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.                              */
-  /*                                                                       */
-  /*                           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 variation data).  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).   */
-  /*                                                                       */
-  /*    face_flags          :: A set of bit flags that give important      */
-  /*                           information about the face; see             */
-  /*                           @FT_FACE_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.  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).                   */
-  /*                                                                       */
-  /*    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 (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  */
-  /*                           the typeface's family (like `Times New      */
-  /*                           Roman', `Bodoni', `Garamond', etc).  This   */
-  /*                           is a least common denominator used to list  */
-  /*                           fonts.  Some formats (TrueType & OpenType)  */
-  /*                           provide localized and Unicode versions of   */
-  /*                           this string.  Applications should use the   */
-  /*                           format specific interface to access them.   */
-  /*                           Can be NULL (e.g., in fonts embedded in a   */
-  /*                           PDF file).                                  */
-  /*                                                                       */
-  /*                           In case the font doesn't provide a specific */
-  /*                           family name entry, FreeType tries to        */
-  /*                           synthesize one, deriving it from other name */
-  /*                           entries.                                    */
-  /*                                                                       */
-  /*    style_name          :: The face's style name.  This is an ASCII    */
-  /*                           string, usually in English, that describes  */
-  /*                           the typeface's style (like `Italic',        */
-  /*                           `Bold', `Condensed', etc).  Not all font    */
-  /*                           formats provide a style name, so this field */
-  /*                           is optional, and can be set to NULL.  As    */
-  /*                           for `family_name', some formats provide     */
-  /*                           localized and Unicode versions of this      */
-  /*                           string.  Applications should use the format */
-  /*                           specific interface to access them.          */
-  /*                                                                       */
-  /*    num_fixed_sizes     :: The number of bitmap strikes in the face.   */
-  /*                           Even if the face is scalable, there might   */
-  /*                           still be bitmap strikes, which are called   */
-  /*                           `sbits' in that case.                       */
-  /*                                                                       */
-  /*    available_sizes     :: An array of @FT_Bitmap_Size for all bitmap  */
-  /*                           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.       */
-  /*                                                                       */
-  /*    generic             :: A field reserved for client uses.  See the  */
-  /*                           @FT_Generic type description.               */
-  /*                                                                       */
-  /*    bbox                :: The font bounding box.  Coordinates are     */
-  /*                           expressed in font units (see                */
-  /*                           `units_per_EM').  The box is large enough   */
-  /*                           to contain any glyph from the font.  Thus,  */
-  /*                           `bbox.yMax' can be seen as the `maximum     */
-  /*                           ascender', and `bbox.yMin' as the `minimum  */
-  /*                           descender'.  Only relevant for scalable     */
-  /*                           formats.                                    */
-  /*                                                                       */
-  /*                           Note that the bounding box might be off by  */
-  /*                           (at least) one pixel for hinted fonts.  See */
-  /*                           @FT_Size_Metrics for further discussion.    */
-  /*                                                                       */
-  /*    units_per_EM        :: The number of font units per EM square for  */
-  /*                           this face.  This is typically 2048 for      */
-  /*                           TrueType fonts, and 1000 for Type~1 fonts.  */
-  /*                           Only relevant for scalable formats.         */
-  /*                                                                       */
-  /*    ascender            :: The typographic ascender of the face,       */
-  /*                           expressed in font units.  For font formats  */
-  /*                           not having this information, it is set to   */
-  /*                           `bbox.yMax'.  Only relevant for scalable    */
-  /*                           formats.                                    */
-  /*                                                                       */
-  /*    descender           :: The typographic descender of the face,      */
-  /*                           expressed in font units.  For font formats  */
-  /*                           not having this information, it is set to   */
-  /*                           `bbox.yMin'.  Note that this field is       */
-  /*                           negative for values below the baseline.     */
-  /*                           Only relevant for scalable formats.         */
-  /*                                                                       */
-  /*    height              :: This value is the vertical distance         */
-  /*                           between two consecutive baselines,          */
-  /*                           expressed in font units.  It is always      */
-  /*                           positive.  Only relevant for scalable       */
-  /*                           formats.                                    */
-  /*                                                                       */
-  /*                           If you want the global glyph height, use    */
-  /*                           `ascender - descender'.                     */
-  /*                                                                       */
-  /*    max_advance_width   :: The maximum advance width, in font units,   */
-  /*                           for all glyphs in this face.  This can be   */
-  /*                           used to make word wrapping computations     */
-  /*                           faster.  Only relevant for scalable         */
-  /*                           formats.                                    */
-  /*                                                                       */
-  /*    max_advance_height  :: The maximum advance height, in font units,  */
-  /*                           for all glyphs in this face.  This is only  */
-  /*                           relevant for vertical layouts, and is set   */
-  /*                           to `height' for fonts that do not provide   */
-  /*                           vertical metrics.  Only relevant for        */
-  /*                           scalable formats.                           */
-  /*                                                                       */
-  /*    underline_position  :: The position, in font units, of the         */
-  /*                           underline line for this face.  It is the    */
-  /*                           center of the underlining stem.  Only       */
-  /*                           relevant for scalable formats.              */
-  /*                                                                       */
-  /*    underline_thickness :: The thickness, in font units, of the        */
-  /*                           underline for this face.  Only relevant for */
-  /*                           scalable formats.                           */
-  /*                                                                       */
-  /*    glyph               :: The face's associated glyph slot(s).        */
-  /*                                                                       */
-  /*    size                :: The current active size for this face.      */
-  /*                                                                       */
-  /*    charmap             :: The current active charmap for this face.   */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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'.                                             */
-  /*                                                                       */
-  typedef struct  FT_FaceRec_
-  {
-    FT_Long           num_faces;
-    FT_Long           face_index;
-
-    FT_Long           face_flags;
-    FT_Long           style_flags;
-
-    FT_Long           num_glyphs;
-
-    FT_String*        family_name;
-    FT_String*        style_name;
-
-    FT_Int            num_fixed_sizes;
-    FT_Bitmap_Size*   available_sizes;
-
-    FT_Int            num_charmaps;
-    FT_CharMap*       charmaps;
-
-    FT_Generic        generic;
-
-    /*# The following member variables (down to `underline_thickness') */
-    /*# are only relevant to scalable outlines; cf. @FT_Bitmap_Size    */
-    /*# for bitmap fonts.                                              */
-    FT_BBox           bbox;
-
-    FT_UShort         units_per_EM;
-    FT_Short          ascender;
-    FT_Short          descender;
-    FT_Short          height;
-
-    FT_Short          max_advance_width;
-    FT_Short          max_advance_height;
-
-    FT_Short          underline_position;
-    FT_Short          underline_thickness;
-
-    FT_GlyphSlot      glyph;
-    FT_Size           size;
-    FT_CharMap        charmap;
-
-    /*@private begin */
-
-    FT_Driver         driver;
-    FT_Memory         memory;
-    FT_Stream         stream;
-
-    FT_ListRec        sizes_list;
-
-    FT_Generic        autohint;   /* face-specific auto-hinter data */
-    void*             extensions; /* unused                         */
-
-    FT_Face_Internal  internal;
-
-    /*@private end */
-
-  } FT_FaceRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_FACE_FLAG_XXX                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A list of bit flags used in the `face_flags' field of the          */
-  /*    @FT_FaceRec structure.  They inform client applications of         */
-  /*    properties of the corresponding face.                              */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_FACE_FLAG_SCALABLE ::                                           */
-  /*      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 ::                                        */
-  /*      The face contains bitmap strikes.  See also the                  */
-  /*      `num_fixed_sizes' and `available_sizes' fields of @FT_FaceRec.   */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_FIXED_WIDTH ::                                        */
-  /*      The face contains fixed-width characters (like Courier, Lucido,  */
-  /*      MonoType, etc.).                                                 */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_SFNT ::                                               */
-  /*      The face uses the SFNT storage scheme.  For now, this means      */
-  /*      TrueType and OpenType.                                           */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_HORIZONTAL ::                                         */
-  /*      The face contains horizontal glyph metrics.  This should be set  */
-  /*      for all common formats.                                          */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_VERTICAL ::                                           */
-  /*      The face contains vertical glyph metrics.  This is only          */
-  /*      available in some formats, not all of them.                      */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_KERNING ::                                            */
-  /*      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 ::                                   */
-  /*      The face contains multiple masters and is capable of             */
-  /*      interpolating between them.  Supported formats are Adobe MM,     */
-  /*      TrueType GX, and OpenType variation fonts.                       */
-  /*                                                                       */
-  /*      See the multiple-masters specific API for details.               */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_GLYPH_NAMES ::                                        */
-  /*      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 ::                                    */
-  /*      Used internally by FreeType to indicate that a face's stream was */
-  /*      provided by the client application and should not be destroyed   */
-  /*      when @FT_Done_Face is called.  Don't read or test this flag.     */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_HINTER ::                                             */
-  /*      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 ::                                          */
-  /*      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 (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 ::                                             */
-  /*      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                     */
-  /*      @FT_LOAD_NO_HINTING.  You have to set both @FT_LOAD_NO_HINTING   */
-  /*      and @FT_LOAD_NO_AUTOHINT to really disable hinting; however, you */
-  /*      probably never want this except for demonstration purposes.      */
-  /*                                                                       */
-  /*      Currently, there are about a dozen TrueType fonts in the list of */
-  /*      tricky fonts; they are hard-coded in file `ttobjs.c'.            */
-  /*                                                                       */
-  /*    FT_FACE_FLAG_COLOR ::                                              */
-  /*      The face has color glyph tables.  To access color glyphs use     */
-  /*      @FT_LOAD_COLOR.                                                  */
-  /*                                                                       */
-#define FT_FACE_FLAG_SCALABLE          ( 1L <<  0 )
-#define FT_FACE_FLAG_FIXED_SIZES       ( 1L <<  1 )
-#define FT_FACE_FLAG_FIXED_WIDTH       ( 1L <<  2 )
-#define FT_FACE_FLAG_SFNT              ( 1L <<  3 )
-#define FT_FACE_FLAG_HORIZONTAL        ( 1L <<  4 )
-#define FT_FACE_FLAG_VERTICAL          ( 1L <<  5 )
-#define FT_FACE_FLAG_KERNING           ( 1L <<  6 )
-#define FT_FACE_FLAG_FAST_GLYPHS       ( 1L <<  7 )
-#define FT_FACE_FLAG_MULTIPLE_MASTERS  ( 1L <<  8 )
-#define FT_FACE_FLAG_GLYPH_NAMES       ( 1L <<  9 )
-#define FT_FACE_FLAG_EXTERNAL_STREAM   ( 1L << 10 )
-#define FT_FACE_FLAG_HINTER            ( 1L << 11 )
-#define FT_FACE_FLAG_CID_KEYED         ( 1L << 12 )
-#define FT_FACE_FLAG_TRICKY            ( 1L << 13 )
-#define FT_FACE_FLAG_COLOR             ( 1L << 14 )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_HORIZONTAL( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains
-   *   horizontal metrics (this is true for all font formats though).
-   *
-   * @also:
-   *   @FT_HAS_VERTICAL can be used to check for vertical metrics.
-   *
-   */
-#define FT_HAS_HORIZONTAL( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_HORIZONTAL )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_VERTICAL( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains real
-   *   vertical metrics (and not only synthesized ones).
-   *
-   */
-#define FT_HAS_VERTICAL( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_VERTICAL )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_KERNING( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains kerning
-   *   data that can be accessed with @FT_Get_Kerning.
-   *
-   */
-#define FT_HAS_KERNING( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_KERNING )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IS_SCALABLE( face )
-   *
-   * @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).
-   *
-   */
-#define FT_IS_SCALABLE( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_SCALABLE )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IS_SFNT( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains a font
-   *   whose format is based on the SFNT storage scheme.  This usually
-   *   means: TrueType fonts, OpenType fonts, as well as SFNT-based embedded
-   *   bitmap fonts.
-   *
-   *   If this macro is true, all functions defined in @FT_SFNT_NAMES_H and
-   *   @FT_TRUETYPE_TABLES_H are available.
-   *
-   */
-#define FT_IS_SFNT( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_SFNT )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IS_FIXED_WIDTH( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains a font face
-   *   that contains fixed-width (or `monospace', `fixed-pitch', etc.)
-   *   glyphs.
-   *
-   */
-#define FT_IS_FIXED_WIDTH( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_FIXED_WIDTH )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_FIXED_SIZES( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains some
-   *   embedded bitmaps.  See the `available_sizes' field of the
-   *   @FT_FaceRec structure.
-   *
-   */
-#define FT_HAS_FIXED_SIZES( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_FIXED_SIZES )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_FAST_GLYPHS( face )
-   *
-   * @description:
-   *   Deprecated.
-   *
-   */
-#define FT_HAS_FAST_GLYPHS( face )  0
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_GLYPH_NAMES( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains some glyph
-   *   names that can be accessed through @FT_Get_Glyph_Name.
-   *
-   */
-#define FT_HAS_GLYPH_NAMES( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_GLYPH_NAMES )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_MULTIPLE_MASTERS( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains some
-   *   multiple masters.  The functions provided by @FT_MULTIPLE_MASTERS_H
-   *   are then available to choose the exact design you want.
-   *
-   */
-#define FT_HAS_MULTIPLE_MASTERS( face ) \
-          ( (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.
-   *
-   */
-#define FT_IS_NAMED_INSTANCE( face ) \
-          ( (face)->face_index & 0x7FFF0000L )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IS_CID_KEYED( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains a CID-keyed
-   *   font.  See the discussion of @FT_FACE_FLAG_CID_KEYED for more
-   *   details.
-   *
-   *   If this macro is true, all functions defined in @FT_CID_H are
-   *   available.
-   *
-   */
-#define FT_IS_CID_KEYED( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_CID_KEYED )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_IS_TRICKY( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face represents a `tricky' font.
-   *   See the discussion of @FT_FACE_FLAG_TRICKY for more details.
-   *
-   */
-#define FT_IS_TRICKY( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_TRICKY )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_HAS_COLOR( face )
-   *
-   * @description:
-   *   A macro that returns true whenever a face object contains
-   *   tables for color glyphs.
-   *
-   */
-#define FT_HAS_COLOR( face ) \
-          ( (face)->face_flags & FT_FACE_FLAG_COLOR )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Const>                                                               */
-  /*    FT_STYLE_FLAG_XXX                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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 ::                                            */
-  /*      The face style is italic or oblique.                             */
-  /*                                                                       */
-  /*    FT_STYLE_FLAG_BOLD ::                                              */
-  /*      The face is bold.                                                */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The style information as provided by FreeType is very basic.  More */
-  /*    details are beyond the scope and should be done on a higher level  */
-  /*    (for example, by analyzing various fields of the `OS/2' table in   */
-  /*    SFNT based fonts).                                                 */
-  /*                                                                       */
-#define FT_STYLE_FLAG_ITALIC  ( 1 << 0 )
-#define FT_STYLE_FLAG_BOLD    ( 1 << 1 )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Size_Internal                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An opaque handle to an `FT_Size_InternalRec' structure, used to    */
-  /*    model private data of a given @FT_Size object.                     */
-  /*                                                                       */
-  typedef struct FT_Size_InternalRec_*  FT_Size_Internal;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Size_Metrics                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The size metrics structure gives the metrics of a size object.     */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    x_ppem       :: The width of the scaled EM square in pixels, hence */
-  /*                    the term `ppem' (pixels per EM).  It is also       */
-  /*                    referred to as `nominal width'.                    */
-  /*                                                                       */
-  /*    y_ppem       :: The height of the scaled EM square in pixels,      */
-  /*                    hence the term `ppem' (pixels per EM).  It is also */
-  /*                    referred to as `nominal height'.                   */
-  /*                                                                       */
-  /*    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 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.                       */
-  /*                                                                       */
-  /*    descender    :: The descender in 26.6 fractional pixels.  See      */
-  /*                    @FT_FaceRec for the details.                       */
-  /*                                                                       */
-  /*    height       :: The height in 26.6 fractional pixels.  See         */
-  /*                    @FT_FaceRec for the details.                       */
-  /*                                                                       */
-  /*    max_advance  :: The maximum advance width in 26.6 fractional       */
-  /*                    pixels.  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.                 */
-  /*                                                                       */
-  /*    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!                        */
-  /*                                                                       */
-  /*    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.    */
-  /*                                                                       */
-  typedef struct  FT_Size_Metrics_
-  {
-    FT_UShort  x_ppem;      /* horizontal pixels per EM               */
-    FT_UShort  y_ppem;      /* vertical pixels per EM                 */
-
-    FT_Fixed   x_scale;     /* scaling values used to convert font    */
-    FT_Fixed   y_scale;     /* units to 26.6 fractional pixels        */
-
-    FT_Pos     ascender;    /* ascender in 26.6 frac. pixels          */
-    FT_Pos     descender;   /* descender in 26.6 frac. pixels         */
-    FT_Pos     height;      /* text height in 26.6 frac. pixels       */
-    FT_Pos     max_advance; /* max horizontal advance, in 26.6 pixels */
-
-  } FT_Size_Metrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_SizeRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FreeType root size class structure.  A size object models a face   */
-  /*    object at a given size.                                            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    face    :: Handle to the parent face object.                       */
-  /*                                                                       */
-  /*    generic :: A typeless pointer, unused by the FreeType library or   */
-  /*               any of its drivers.  It can be used by client           */
-  /*               applications to link their own data to each size        */
-  /*               object.                                                 */
-  /*                                                                       */
-  /*    metrics :: Metrics for this size object.  This field is read-only. */
-  /*                                                                       */
-  typedef struct  FT_SizeRec_
-  {
-    FT_Face           face;      /* parent face object              */
-    FT_Generic        generic;   /* generic pointer for client uses */
-    FT_Size_Metrics   metrics;   /* size metrics                    */
-    FT_Size_Internal  internal;
-
-  } FT_SizeRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_SubGlyph                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The subglyph structure is an internal object used to describe      */
-  /*    subglyphs (for example, in the case of composites).                */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The subglyph implementation is not part of the high-level API,     */
-  /*    hence the forward structure declaration.                           */
-  /*                                                                       */
-  /*    You can however retrieve subglyph information with                 */
-  /*    @FT_Get_SubGlyph_Info.                                             */
-  /*                                                                       */
-  typedef struct FT_SubGlyphRec_*  FT_SubGlyph;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Slot_Internal                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An opaque handle to an `FT_Slot_InternalRec' structure, used to    */
-  /*    model private data of a given @FT_GlyphSlot object.                */
-  /*                                                                       */
-  typedef struct FT_Slot_InternalRec_*  FT_Slot_Internal;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_GlyphSlotRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FreeType root glyph slot class structure.  A glyph slot is a       */
-  /*    container where individual glyphs can be loaded, be they in        */
-  /*    outline or bitmap format.                                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    library           :: A handle to the FreeType library instance     */
-  /*                         this slot belongs to.                         */
-  /*                                                                       */
-  /*    face              :: A handle to the parent face object.           */
-  /*                                                                       */
-  /*    next              :: In some cases (like some font tools), several */
-  /*                         glyph slots per face object can be a good     */
-  /*                         thing.  As this is rare, the glyph slots are  */
-  /*                         listed through a direct, single-linked list   */
-  /*                         using its `next' field.                       */
-  /*                                                                       */
-  /*    generic           :: A typeless pointer unused by the FreeType     */
-  /*                         library or any of its drivers.  It can be     */
-  /*                         used by client applications to link their own */
-  /*                         data to each glyph slot object.               */
-  /*                                                                       */
-  /*    metrics           :: The metrics of the last loaded glyph in the   */
-  /*                         slot.  The returned values depend on the last */
-  /*                         load flags (see the @FT_Load_Glyph API        */
-  /*                         function) and can be expressed either in 26.6 */
-  /*                         fractional pixels or font units.              */
-  /*                                                                       */
-  /*                         Note that even when the glyph image is        */
-  /*                         transformed, the metrics are not.             */
-  /*                                                                       */
-  /*    linearHoriAdvance :: The advance width of the unhinted glyph.      */
-  /*                         Its value is expressed in 16.16 fractional    */
-  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
-  /*                         when loading the glyph.  This field can be    */
-  /*                         important to perform correct WYSIWYG layout.  */
-  /*                         Only relevant for outline glyphs.             */
-  /*                                                                       */
-  /*    linearVertAdvance :: The advance height of the unhinted glyph.     */
-  /*                         Its value is expressed in 16.16 fractional    */
-  /*                         pixels, unless @FT_LOAD_LINEAR_DESIGN is set  */
-  /*                         when loading the glyph.  This field can be    */
-  /*                         important to perform correct WYSIWYG layout.  */
-  /*                         Only relevant for outline glyphs.             */
-  /*                                                                       */
-  /*    advance           :: This shorthand is, depending on               */
-  /*                         @FT_LOAD_IGNORE_TRANSFORM, the transformed    */
-  /*                         (hinted) advance width for the glyph, in 26.6 */
-  /*                         fractional pixel format.  As specified with   */
-  /*                         @FT_LOAD_VERTICAL_LAYOUT, it uses either the  */
-  /*                         `horiAdvance' or the `vertAdvance' value of   */
-  /*                         `metrics' field.                              */
-  /*                                                                       */
-  /*    format            :: This field indicates the format of the image  */
-  /*                         contained in the glyph slot.  Typically       */
-  /*                         @FT_GLYPH_FORMAT_BITMAP,                      */
-  /*                         @FT_GLYPH_FORMAT_OUTLINE, or                  */
-  /*                         @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_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.                 */
-  /*                                                                       */
-  /*    bitmap_top        :: The bitmap's top bearing expressed in integer */
-  /*                         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   */
-  /*                         not be freed.                                 */
-  /*                                                                       */
-  /*    num_subglyphs     :: The number of subglyphs in a composite glyph. */
-  /*                         This field is only valid for the composite    */
-  /*                         glyph format that should normally only be     */
-  /*                         loaded with the @FT_LOAD_NO_RECURSE flag.     */
-  /*                                                                       */
-  /*    subglyphs         :: An array of subglyph descriptors for          */
-  /*                         composite glyphs.  There are `num_subglyphs'  */
-  /*                         elements in there.  Currently internal to     */
-  /*                         FreeType.                                     */
-  /*                                                                       */
-  /*    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; it is   */
-  /*                         currently internal to FreeType.               */
-  /*                                                                       */
-  /*    control_len       :: This is the length in bytes of the control    */
-  /*                         data.  Currently internal to FreeType.        */
-  /*                                                                       */
-  /*    other             :: Reserved.                                     */
-  /*                                                                       */
-  /*    lsb_delta         :: The difference between hinted and unhinted    */
-  /*                         left side bearing while auto-hinting is       */
-  /*                         active.  Zero otherwise.                      */
-  /*                                                                       */
-  /*    rsb_delta         :: The difference between hinted and unhinted    */
-  /*                         right side bearing while auto-hinting is      */
-  /*                         active.  Zero otherwise.                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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).                                                          */
-  /*                                                                       */
-  /*    This image can later be converted into a bitmap by calling         */
-  /*    @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 */
-  /*    the slot's face transformation fields, then converting it into a   */
-  /*    bitmap that is returned in `slot->bitmap'.                         */
-  /*                                                                       */
-  /*    Note that `slot->bitmap_left' and `slot->bitmap_top' are also used */
-  /*    to specify the position of the bitmap relative to the current pen  */
-  /*    position (e.g., coordinates (0,0) on the baseline).  Of course,    */
-  /*    `slot->format' is also changed to @FT_GLYPH_FORMAT_BITMAP.         */
-  /*                                                                       */
-  /*    Here is a small pseudo code fragment that shows how to use         */
-  /*    `lsb_delta' and `rsb_delta':                                       */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      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 - 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;                       */
-  /*                                                                       */
-  /*        <save glyph image, or render glyph, or ...>                    */
-  /*                                                                       */
-  /*        origin_x += face->glyph->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;
-    FT_Face           face;
-    FT_GlyphSlot      next;
-    FT_UInt           reserved;       /* retained for binary compatibility */
-    FT_Generic        generic;
-
-    FT_Glyph_Metrics  metrics;
-    FT_Fixed          linearHoriAdvance;
-    FT_Fixed          linearVertAdvance;
-    FT_Vector         advance;
-
-    FT_Glyph_Format   format;
-
-    FT_Bitmap         bitmap;
-    FT_Int            bitmap_left;
-    FT_Int            bitmap_top;
-
-    FT_Outline        outline;
-
-    FT_UInt           num_subglyphs;
-    FT_SubGlyph       subglyphs;
-
-    void*             control_data;
-    long              control_len;
-
-    FT_Pos            lsb_delta;
-    FT_Pos            rsb_delta;
-
-    void*             other;
-
-    FT_Slot_Internal  internal;
-
-  } FT_GlyphSlotRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
-  /*                         F U N C T I O N S                             */
-  /*                                                                       */
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Init_FreeType                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a new FreeType library object.  The set of modules      */
-  /*    that are registered by this function is determined at build time.  */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    alibrary :: A handle to a new library object.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <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).  */
-  /*                                                                       */
-  /*    See the documentation of @FT_Library and @FT_Face for              */
-  /*    multi-threading issues.                                            */
-  /*                                                                       */
-  /*    If you need reference-counting (cf. @FT_Reference_Library), use    */
-  /*    @FT_New_Library and @FT_Done_Library.                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Init_FreeType( FT_Library  *alibrary );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_FreeType                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy a given FreeType library object and all of its children,   */
-  /*    including resources, drivers, faces, sizes, etc.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to the target library object.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Done_FreeType( FT_Library  library );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_OPEN_XXX                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A list of bit field constants used within the `flags' field of the */
-  /*    @FT_Open_Args structure.                                           */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_OPEN_MEMORY   :: This is a memory-based stream.                 */
-  /*                                                                       */
-  /*    FT_OPEN_STREAM   :: Copy the stream from the `stream' field.       */
-  /*                                                                       */
-  /*    FT_OPEN_PATHNAME :: Create a new input stream from a C~path        */
-  /*                        name.                                          */
-  /*                                                                       */
-  /*    FT_OPEN_DRIVER   :: Use the `driver' field.                        */
-  /*                                                                       */
-  /*    FT_OPEN_PARAMS   :: Use the `num_params' and `params' fields.      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The `FT_OPEN_MEMORY', `FT_OPEN_STREAM', and `FT_OPEN_PATHNAME'     */
-  /*    flags are mutually exclusive.                                      */
-  /*                                                                       */
-#define FT_OPEN_MEMORY    0x1
-#define FT_OPEN_STREAM    0x2
-#define FT_OPEN_PATHNAME  0x4
-#define FT_OPEN_DRIVER    0x8
-#define FT_OPEN_PARAMS    0x10
-
-
-  /* these constants are deprecated; use the corresponding `FT_OPEN_XXX' */
-  /* values instead                                                      */
-#define ft_open_memory    FT_OPEN_MEMORY
-#define ft_open_stream    FT_OPEN_STREAM
-#define ft_open_pathname  FT_OPEN_PATHNAME
-#define ft_open_driver    FT_OPEN_DRIVER
-#define ft_open_params    FT_OPEN_PARAMS
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Parameter                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure to pass more or less generic parameters to      */
-  /*    @FT_Open_Face.                                                     */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    tag  :: A four-byte identification tag.                            */
-  /*                                                                       */
-  /*    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.               */
-  /*                                                                       */
-  typedef struct  FT_Parameter_
-  {
-    FT_ULong    tag;
-    FT_Pointer  data;
-
-  } FT_Parameter;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Open_Args                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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        */
-  /*                   structure.                                          */
-  /*                                                                       */
-  /*    memory_base :: The first byte of the file in memory.               */
-  /*                                                                       */
-  /*    memory_size :: The size in bytes of the file in memory.            */
-  /*                                                                       */
-  /*    pathname    :: A pointer to an 8-bit file pathname.                */
-  /*                                                                       */
-  /*    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 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.                     */
-  /*                                                                       */
-  /*    params      :: Extra parameters passed to the font driver when     */
-  /*                   opening a new face.                                 */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The stream type is determined by the contents of `flags' that      */
-  /*    are tested in the following order by @FT_Open_Face:                */
-  /*                                                                       */
-  /*    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 not copied, and the client is responsible for         */
-  /*    releasing and destroying them _after_ the corresponding call to    */
-  /*    @FT_Done_Face.                                                     */
-  /*                                                                       */
-  /*    Otherwise, if the @FT_OPEN_STREAM bit is set, assume that a        */
-  /*    custom input stream `stream' is used.                              */
-  /*                                                                       */
-  /*    Otherwise, if the @FT_OPEN_PATHNAME bit is set, assume that this   */
-  /*    is a normal file and use `pathname' to open it.                    */
-  /*                                                                       */
-  /*    If the @FT_OPEN_DRIVER bit is set, @FT_Open_Face only tries to     */
-  /*    open the file with the driver whose handler is in `driver'.        */
-  /*                                                                       */
-  /*    If the @FT_OPEN_PARAMS bit is set, the parameters given by         */
-  /*    `num_params' and `params' 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   */
-  /*    other words, applications should treat them as read-only.          */
-  /*                                                                       */
-  typedef struct  FT_Open_Args_
-  {
-    FT_UInt         flags;
-    const FT_Byte*  memory_base;
-    FT_Long         memory_size;
-    FT_String*      pathname;
-    FT_Stream       stream;
-    FT_Module       driver;
-    FT_Int          num_params;
-    FT_Parameter*   params;
-
-  } FT_Open_Args;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Call @FT_Open_Face to open a font by its pathname.                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    pathname   :: A path to the font file.                             */
-  /*                                                                       */
-  /*    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.  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Use @FT_Done_Face to destroy the created @FT_Face object (along    */
-  /*    with its slot and sizes).                                          */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Face( FT_Library   library,
-               const char*  filepathname,
-               FT_Long      face_index,
-               FT_Face     *aface );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Memory_Face                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Call @FT_Open_Face to open a font that has been loaded into        */
-  /*    memory.                                                            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    file_base  :: A pointer to the beginning of the font data.         */
-  /*                                                                       */
-  /*    file_size  :: The size of the memory chunk used by the font data.  */
-  /*                                                                       */
-  /*    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.  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You must not deallocate the memory before calling @FT_Done_Face.   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Memory_Face( FT_Library      library,
-                      const FT_Byte*  file_base,
-                      FT_Long         file_size,
-                      FT_Long         face_index,
-                      FT_Face        *aface );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Open_Face                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a face object from a given resource described by            */
-  /*    @FT_Open_Args.                                                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    args       :: A pointer to an `FT_Open_Args' structure that must   */
-  /*                  be filled by the caller.                             */
-  /*                                                                       */
-  /*    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.                               */
-  /*                                                                       */
-  /*                  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.  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Unlike FreeType 1.x, this function automatically creates a glyph   */
-  /*    slot for the face object that can be accessed directly through     */
-  /*    `face->glyph'.                                                     */
-  /*                                                                       */
-  /*    Each new face object created with this function also owns a        */
-  /*    default @FT_Size object, accessible as `face->size'.               */
-  /*                                                                       */
-  /*    One @FT_Library instance can have multiple face objects, this is,  */
-  /*    @FT_Open_Face and its siblings can be called multiple times using  */
-  /*    the same `library' argument.                                       */
-  /*                                                                       */
-  /*    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,
-                FT_Long              face_index,
-                FT_Face             *aface );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Attach_File                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Call @FT_Attach_Stream to attach a file.                           */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face         :: The target face object.                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    filepathname :: The pathname.                                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Attach_File( FT_Face      face,
-                  const char*  filepathname );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Attach_Stream                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    `Attach' data to a face object.  Normally, this is used to read    */
-  /*    additional information for the face object.  For example, you can  */
-  /*    attach an AFM file that comes with a Type~1 font to get the        */
-  /*    kerning values and other metrics.                                  */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The target face object.                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    parameters :: A pointer to @FT_Open_Args that must be filled by    */
-  /*                  the caller.                                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The meaning of the `attach' (i.e., what really happens when the    */
-  /*    new file is read) is not fixed by FreeType itself.  It really      */
-  /*    depends on the font format (and thus the font driver).             */
-  /*                                                                       */
-  /*    Client applications are expected to know what they are doing       */
-  /*    when invoking this function.  Most drivers simply do not implement */
-  /*    file or stream attachments.                                        */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Attach_Stream( FT_Face        face,
-                    FT_Open_Args*  parameters );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Reference_Face                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A counter gets initialized to~1 at the time an @FT_Face structure  */
-  /*    is created.  This function increments the counter.  @FT_Done_Face  */
-  /*    then only destroys a face if the counter is~1, otherwise it simply */
-  /*    decrements the counter.                                            */
-  /*                                                                       */
-  /*    This function helps in managing life-cycles of structures that     */
-  /*    reference @FT_Face objects.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to a target face object.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.4.2                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Reference_Face( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Face                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Discard a given face object, as well as all of its child slots and */
-  /*    sizes.                                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to a target face object.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    See the discussion of reference counters in the description of     */
-  /*    @FT_Reference_Face.                                                */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Done_Face( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Select_Size                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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.                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    strike_index :: The index of the bitmap strike in the              */
-  /*                    `available_sizes' field of @FT_FaceRec structure.  */
-  /*                                                                       */
-  /* <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 );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Size_Request_Type                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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 `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 */
-  /*      of @FT_FaceRec are used to determine the horizontal and vertical */
-  /*      scaling value, respectively.                                     */
-  /*                                                                       */
-  /*    FT_SIZE_REQUEST_TYPE_CELL ::                                       */
-  /*      The `max_advance_width' field of @FT_FaceRec is used to          */
-  /*      determine the horizontal scaling value; the vertical scaling     */
-  /*      value is determined the same way as                              */
-  /*      @FT_SIZE_REQUEST_TYPE_REAL_DIM does.  Finally, both scaling      */
-  /*      values are set to the smaller one.  This type is useful if you   */
-  /*      want to specify the font size for, say, a window of a given      */
-  /*      dimension and 80x24 cells.                                       */
-  /*                                                                       */
-  /*    FT_SIZE_REQUEST_TYPE_SCALES ::                                     */
-  /*      Specify the scaling values directly.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The above descriptions only apply to scalable formats.  For bitmap */
-  /*    formats, the behaviour is up to the driver.                        */
-  /*                                                                       */
-  /*    See the note section of @FT_Size_Metrics if you wonder how size    */
-  /*    requesting relates to scaling values.                              */
-  /*                                                                       */
-  typedef enum  FT_Size_Request_Type_
-  {
-    FT_SIZE_REQUEST_TYPE_NOMINAL,
-    FT_SIZE_REQUEST_TYPE_REAL_DIM,
-    FT_SIZE_REQUEST_TYPE_BBOX,
-    FT_SIZE_REQUEST_TYPE_CELL,
-    FT_SIZE_REQUEST_TYPE_SCALES,
-
-    FT_SIZE_REQUEST_TYPE_MAX
-
-  } FT_Size_Request_Type;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Size_RequestRec                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure to model a size request.                               */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    type           :: See @FT_Size_Request_Type.                       */
-  /*                                                                       */
-  /*    width          :: The desired width, given as a 26.6 fractional    */
-  /*                      point value (with 72pt = 1in).                   */
-  /*                                                                       */
-  /*    height         :: The desired height, given as a 26.6 fractional   */
-  /*                      point value (with 72pt = 1in).                   */
-  /*                                                                       */
-  /*    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 (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, 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;
-    FT_Long               width;
-    FT_Long               height;
-    FT_UInt               horiResolution;
-    FT_UInt               vertResolution;
-
-  } FT_Size_RequestRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Size_Request                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a size request structure.                              */
-  /*                                                                       */
-  typedef struct FT_Size_RequestRec_  *FT_Size_Request;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Request_Size                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Resize the scale of the active @FT_Size object in a face.          */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face :: A handle to a target face object.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    req  :: A pointer to a @FT_Size_RequestRec.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Although drivers may select the bitmap strike matching the         */
-  /*    request, you should not rely on this if you intend to select a     */
-  /*    particular bitmap strike.  Use @FT_Select_Size instead in that     */
-  /*    case.                                                              */
-  /*                                                                       */
-  /*    The relation between the requested size and the resulting glyph    */
-  /*    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        */
-  /*    `https://www.freetype.org/freetype2/docs/glyphs/glyphs-2.html'.    */
-  /*                                                                       */
-  /*    Don't use this function if you are using the FreeType cache API.   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Request_Size( FT_Face          face,
-                   FT_Size_Request  req );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Char_Size                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Call @FT_Request_Size to request the nominal size (in points).     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face            :: A handle to a target face object.               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    char_width      :: The nominal width, in 26.6 fractional points.   */
-  /*                                                                       */
-  /*    char_height     :: The nominal height, in 26.6 fractional points.  */
-  /*                                                                       */
-  /*    horz_resolution :: The horizontal resolution in dpi.               */
-  /*                                                                       */
-  /*    vert_resolution :: The vertical resolution in dpi.                 */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    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.                                                */
-  /*                                                                       */
-  /*    If either the horizontal or vertical resolution is zero, it is set */
-  /*    equal to the other value.                                          */
-  /*                                                                       */
-  /*    A character width or height smaller than 1pt is set to 1pt; if     */
-  /*    both resolution values are zero, they are set to 72dpi.            */
-  /*                                                                       */
-  /*    Don't use this function if you are using the FreeType cache API.   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_Char_Size( FT_Face     face,
-                    FT_F26Dot6  char_width,
-                    FT_F26Dot6  char_height,
-                    FT_UInt     horz_resolution,
-                    FT_UInt     vert_resolution );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Pixel_Sizes                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Call @FT_Request_Size to request the nominal size (in pixels).     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face         :: A handle to the target face object.                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    pixel_width  :: The nominal width, in pixels.                      */
-  /*                                                                       */
-  /*    pixel_height :: The nominal height, in pixels.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    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      */
-  /*    understand how requested sizes relate to actual sizes.             */
-  /*                                                                       */
-  /*    Don't use this function if you are using the FreeType cache API.   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_Pixel_Sizes( FT_Face  face,
-                      FT_UInt  pixel_width,
-                      FT_UInt  pixel_height );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Load_Glyph                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load a glyph into the glyph slot of a face object.                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face        :: A handle to the target face object where the glyph  */
-  /*                   is loaded.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    glyph_index :: The index of the glyph in the font file.  For       */
-  /*                   CID-keyed fonts (either in PS or in CFF format)     */
-  /*                   this argument specifies the CID value.              */
-  /*                                                                       */
-  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
-  /*                   @FT_LOAD_XXX constants can be used to control the   */
-  /*                   glyph loading process (e.g., whether the outline    */
-  /*                   should be scaled, whether to load bitmaps or not,   */
-  /*                   whether to hint the outline, etc).                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The loaded glyph may be transformed.  See @FT_Set_Transform for    */
-  /*    the details.                                                       */
-  /*                                                                       */
-  /*    For subsetted CID-keyed fonts, `FT_Err_Invalid_Argument' is        */
-  /*    returned for invalid CID values (this is, for CID values that      */
-  /*    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,
-                 FT_Int32  load_flags );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Load_Char                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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    */
-  /*                   is loaded.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    char_code   :: The glyph's character code, according to the        */
-  /*                   current charmap used in the face.                   */
-  /*                                                                       */
-  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
-  /*                   @FT_LOAD_XXX constants can be used to control the   */
-  /*                   glyph loading process (e.g., whether the outline    */
-  /*                   should be scaled, whether to load bitmaps or not,   */
-  /*                   whether to hint the outline, etc).                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <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.                                                          */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Load_Char( FT_Face   face,
-                FT_ULong  char_code,
-                FT_Int32  load_flags );
-
-
-  /*************************************************************************
-   *
-   * @enum:
-   *   FT_LOAD_XXX
-   *
-   * @description:
-   *   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 ::
-   *     Corresponding to~0, this value is used as the default glyph load
-   *     operation.  In this case, the following happens:
-   *
-   *     1. FreeType looks for a bitmap for the glyph corresponding to the
-   *        face's current size.  If one is found, the function returns.
-   *        The bitmap 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
-   *     bitmaps.  The following flags are used to modify this default
-   *     behaviour to more specific and useful cases.
-   *
-   *   FT_LOAD_NO_SCALE ::
-   *     Don't scale the loaded outline glyph but keep it in font units.
-   *
-   *     This flag implies @FT_LOAD_NO_HINTING and @FT_LOAD_NO_BITMAP, and
-   *     unsets @FT_LOAD_RENDER.
-   *
-   *     If the font is `tricky' (see @FT_FACE_FLAG_TRICKY for more), using
-   *     FT_LOAD_NO_SCALE usually yields meaningless outlines because the
-   *     subglyphs must be scaled and positioned with hinting instructions.
-   *     This can be solved by loading the font without FT_LOAD_NO_SCALE and
-   *     setting the character size to `font->units_per_EM'.
-   *
-   *   FT_LOAD_NO_HINTING ::
-   *     Disable hinting.  This generally generates `blurrier' bitmap glyphs
-   *     when the glyph are rendered in any of the anti-aliased modes.  See
-   *     also the note below.
-   *
-   *     This flag is implied by @FT_LOAD_NO_SCALE.
-   *
-   *   FT_LOAD_RENDER ::
-   *     Call @FT_Render_Glyph after the glyph is loaded.  By default, the
-   *     glyph is rendered in @FT_RENDER_MODE_NORMAL mode.  This can be
-   *     overridden by @FT_LOAD_TARGET_XXX or @FT_LOAD_MONOCHROME.
-   *
-   *     This flag is unset by @FT_LOAD_NO_SCALE.
-   *
-   *   FT_LOAD_NO_BITMAP ::
-   *     Ignore bitmap strikes when loading.  Bitmap-only fonts ignore this
-   *     flag.
-   *
-   *     @FT_LOAD_NO_SCALE always sets this flag.
-   *
-   *   FT_LOAD_VERTICAL_LAYOUT ::
-   *     Load the glyph for vertical text layout.  In particular, the
-   *     `advance' value in the @FT_GlyphSlotRec structure is set to the
-   *     `vertAdvance' value of the `metrics' field.
-   *
-   *     In case @FT_HAS_VERTICAL doesn't return true, you shouldn't use
-   *     this flag currently.  Reason is that in this case vertical metrics
-   *     get synthesized, and those values are not always consistent across
-   *     various font formats.
-   *
-   *   FT_LOAD_FORCE_AUTOHINT ::
-   *     Prefer the auto-hinter over the font's native hinter.  See also
-   *     the note below.
-   *
-   *   FT_LOAD_PEDANTIC ::
-   *     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
-   *     result in partially hinted or distorted glyphs in case a glyph's
-   *     bytecode is buggy.
-   *
-   *   FT_LOAD_NO_RECURSE ::
-   *     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 ::
-   *     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
-   *     render an outline glyph to a 1-bit monochrome bitmap glyph, with
-   *     8~pixels packed into each byte of the bitmap data.
-   *
-   *     Note that this has no effect on the hinting algorithm used.  You
-   *     should rather use @FT_LOAD_TARGET_MONO so that the
-   *     monochrome-optimized hinting algorithm is used.
-   *
-   *   FT_LOAD_LINEAR_DESIGN ::
-   *     Keep  `linearHoriAdvance' and `linearVertAdvance' fields of
-   *     @FT_GlyphSlotRec in font units.  See @FT_GlyphSlotRec for
-   *     details.
-   *
-   *   FT_LOAD_NO_AUTOHINT ::
-   *     Disable the auto-hinter.  See also the note below.
-   *
-   *   FT_LOAD_COLOR ::
-   *     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 ::
-   *     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 ::
-   *     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.
-   *
-   *   FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH ::
-   *     Ignored.  Deprecated.
-   *
-   * @note:
-   *   By default, hinting is enabled and the font's native hinter (see
-   *   @FT_FACE_FLAG_HINTER) is preferred over the auto-hinter.  You can
-   *   disable hinting by setting @FT_LOAD_NO_HINTING or change the
-   *   precedence by setting @FT_LOAD_FORCE_AUTOHINT.  You can also set
-   *   @FT_LOAD_NO_AUTOHINT in case you don't want the auto-hinter to be
-   *   used at all.
-   *
-   *   See the description of @FT_FACE_FLAG_TRICKY for a special exception
-   *   (affecting only a handful of Asian fonts).
-   *
-   *   Besides deciding which hinter to use, you can also decide which
-   *   hinting algorithm to use.  See @FT_LOAD_TARGET_XXX for details.
-   *
-   *   Note that the auto-hinter needs a valid Unicode cmap (either a native
-   *   one or synthesized by FreeType) for producing correct results.  If a
-   *   font provides an incorrect mapping (for example, assigning the
-   *   character code U+005A, LATIN CAPITAL LETTER Z, to a glyph depicting a
-   *   mathematical integral sign), the auto-hinter might produce useless
-   *   results.
-   *
-   */
-#define FT_LOAD_DEFAULT                      0x0
-#define FT_LOAD_NO_SCALE                     ( 1L << 0 )
-#define FT_LOAD_NO_HINTING                   ( 1L << 1 )
-#define FT_LOAD_RENDER                       ( 1L << 2 )
-#define FT_LOAD_NO_BITMAP                    ( 1L << 3 )
-#define FT_LOAD_VERTICAL_LAYOUT              ( 1L << 4 )
-#define FT_LOAD_FORCE_AUTOHINT               ( 1L << 5 )
-#define FT_LOAD_CROP_BITMAP                  ( 1L << 6 )
-#define FT_LOAD_PEDANTIC                     ( 1L << 7 )
-#define FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  ( 1L << 9 )
-#define FT_LOAD_NO_RECURSE                   ( 1L << 10 )
-#define FT_LOAD_IGNORE_TRANSFORM             ( 1L << 11 )
-#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_' */
-#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 */
-#define FT_LOAD_ADVANCE_ONLY                 ( 1L << 8 )
-#define FT_LOAD_SBITS_ONLY                   ( 1L << 14 )
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_LOAD_TARGET_XXX
-   *
-   * @description:
-   *   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 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 ::
-   *     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 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 Microsoft's ClearType and Adobe's
-   *     proprietary 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.
-   *
-   *   FT_LOAD_TARGET_MONO ::
-   *     Strong hinting algorithm that should only be used for monochrome
-   *     output.  The result is probably unpleasant if the glyph is rendered
-   *     in non-monochrome modes.
-   *
-   *   FT_LOAD_TARGET_LCD ::
-   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for horizontally
-   *     decimated LCD displays.
-   *
-   *   FT_LOAD_TARGET_LCD_V ::
-   *     A variant of @FT_LOAD_TARGET_NORMAL optimized for vertically
-   *     decimated LCD displays.
-   *
-   * @note:
-   *   You should use only _one_ of the FT_LOAD_TARGET_XXX values in your
-   *   `load_flags'.  They can't be ORed.
-   *
-   *   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 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
-   *   rendering mode.  As an example, it is possible to use the `light'
-   *   hinting algorithm and have the results rendered in horizontal LCD
-   *   pixel mode, with code like
-   *
-   *     {
-   *       FT_Load_Glyph( face, glyph_index,
-   *                      load_flags | FT_LOAD_TARGET_LIGHT );
-   *
-   *       FT_Render_Glyph( face->glyph, FT_RENDER_MODE_LCD );
-   *     }
-   *
-   */
-#define FT_LOAD_TARGET_( x )   ( (FT_Int32)( (x) & 15 ) << 16 )
-
-#define FT_LOAD_TARGET_NORMAL  FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
-#define FT_LOAD_TARGET_LIGHT   FT_LOAD_TARGET_( FT_RENDER_MODE_LIGHT  )
-#define FT_LOAD_TARGET_MONO    FT_LOAD_TARGET_( FT_RENDER_MODE_MONO   )
-#define FT_LOAD_TARGET_LCD     FT_LOAD_TARGET_( FT_RENDER_MODE_LCD    )
-#define FT_LOAD_TARGET_LCD_V   FT_LOAD_TARGET_( FT_RENDER_MODE_LCD_V  )
-
-
-  /**************************************************************************
-   *
-   * @macro:
-   *   FT_LOAD_TARGET_MODE
-   *
-   * @description:
-   *   Return the @FT_Render_Mode corresponding to a given
-   *   @FT_LOAD_TARGET_XXX value.
-   *
-   */
-#define FT_LOAD_TARGET_MODE( x )  ( (FT_Render_Mode)( ( (x) >> 16 ) & 15 ) )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Transform                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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 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 */
-  /*    the glyph has been loaded.  It means that hinting is unaltered by  */
-  /*    the transformation and is performed on the character size given in */
-  /*    the last call to @FT_Set_Char_Size or @FT_Set_Pixel_Sizes.         */
-  /*                                                                       */
-  /*    Note that this also transforms the `face.glyph.advance' field, but */
-  /*    *not* the values in `face.glyph.metrics'.                          */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Set_Transform( FT_Face     face,
-                    FT_Matrix*  matrix,
-                    FT_Vector*  delta );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Render_Mode                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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,   */
-  /*    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 ::                                           */
-  /*      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        */
-  /*      defined as a separate value because render modes are also used   */
-  /*      indirectly to define hinting algorithm selectors.  See           */
-  /*      @FT_LOAD_TARGET_XXX for details.                                 */
-  /*                                                                       */
-  /*    FT_RENDER_MODE_MONO ::                                             */
-  /*      This mode corresponds to 1-bit bitmaps (with 2~levels of         */
-  /*      opacity).                                                        */
-  /*                                                                       */
-  /*    FT_RENDER_MODE_LCD ::                                              */
-  /*      This mode corresponds to horizontal RGB and BGR sub-pixel        */
-  /*      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 */
-  /*      (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.                             */
-  /*                                                                       */
-  /*    The selected render mode only affects vector glyphs of a font.     */
-  /*    Embedded bitmaps often have a different pixel mode like            */
-  /*    @FT_PIXEL_MODE_MONO.  You can use @FT_Bitmap_Convert to transform  */
-  /*    them into 8-bit pixmaps.                                           */
-  /*                                                                       */
-  typedef enum  FT_Render_Mode_
-  {
-    FT_RENDER_MODE_NORMAL = 0,
-    FT_RENDER_MODE_LIGHT,
-    FT_RENDER_MODE_MONO,
-    FT_RENDER_MODE_LCD,
-    FT_RENDER_MODE_LCD_V,
-
-    FT_RENDER_MODE_MAX
-
-  } FT_Render_Mode;
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_Render_Mode' values instead                       */
-#define ft_render_mode_normal  FT_RENDER_MODE_NORMAL
-#define ft_render_mode_mono    FT_RENDER_MODE_MONO
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Render_Glyph                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Convert a given glyph image to a bitmap.  It does so by inspecting */
-  /*    the glyph image format, finding the relevant renderer, and         */
-  /*    invoking it.                                                       */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    slot        :: A handle to the glyph slot containing the image to  */
-  /*                   convert.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    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'. */
-  /*                                                                       */
-  /*    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,
-                   FT_Render_Mode  render_mode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Kerning_Mode                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration to specify the format of kerning values returned by */
-  /*    @FT_Get_Kerning.                                                   */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_KERNING_DEFAULT  :: Return grid-fitted kerning distances in     */
-  /*                           26.6 fractional pixels.                     */
-  /*                                                                       */
-  /*    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_UNFITTED,
-    FT_KERNING_UNSCALED
-
-  } FT_Kerning_Mode;
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_Kerning_Mode' values instead                      */
-#define ft_kerning_default   FT_KERNING_DEFAULT
-#define ft_kerning_unfitted  FT_KERNING_UNFITTED
-#define ft_kerning_unscaled  FT_KERNING_UNSCALED
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Kerning                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the kerning vector between two glyphs of the same face.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to a source face object.                   */
-  /*                                                                       */
-  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
-  /*                                                                       */
-  /*    right_glyph :: The index of the right glyph in the kern pair.      */
-  /*                                                                       */
-  /*    kern_mode   :: See @FT_Kerning_Mode for more information.          */
-  /*                   Determines the scale and dimension of the returned  */
-  /*                   kerning vector.                                     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    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.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
-  /*    supported by this method.  Other layouts, or more sophisticated    */
-  /*    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,
-                  FT_UInt     right_glyph,
-                  FT_UInt     kern_mode,
-                  FT_Vector  *akerning );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Track_Kerning                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the track kerning for a given face object at a given size.  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face       :: A handle to a source face object.                    */
-  /*                                                                       */
-  /*    point_size :: The point size in 16.16 fractional points.           */
-  /*                                                                       */
-  /*    degree     :: The degree of tightness.  Increasingly negative      */
-  /*                  values represent tighter track kerning, while        */
-  /*                  increasingly positive values represent looser track  */
-  /*                  kerning.  Value zero means no track kerning.         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    akerning   :: The kerning in 16.16 fractional points, to be        */
-  /*                  uniformly applied between all glyphs.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Currently, only the Type~1 font driver supports track kerning,     */
-  /*    using data from AFM files (if attached with @FT_Attach_File or     */
-  /*    @FT_Attach_Stream).                                                */
-  /*                                                                       */
-  /*    Only very few AFM files come with track kerning data; please refer */
-  /*    to Adobe's AFM specification for more details.                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Track_Kerning( FT_Face    face,
-                        FT_Fixed   point_size,
-                        FT_Int     degree,
-                        FT_Fixed*  akerning );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Glyph_Name                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the ASCII name of a given glyph in a face.  This only     */
-  /*    works for those faces where @FT_HAS_GLYPH_NAMES(face) returns~1.   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to a source face object.                   */
-  /*                                                                       */
-  /*    glyph_index :: The glyph index.                                    */
-  /*                                                                       */
-  /*    buffer_max  :: The maximum number of bytes available in the        */
-  /*                   buffer.                                             */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    buffer      :: A pointer to a target buffer where the name is      */
-  /*                   copied to.                                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    An error is returned if the face doesn't provide glyph names or if */
-  /*    the glyph index is invalid.  In all cases of failure, the first    */
-  /*    byte of `buffer' is set to~0 to indicate an empty name.            */
-  /*                                                                       */
-  /*    The glyph name is truncated to fit within the buffer if it is too  */
-  /*    long.  The returned string is always zero-terminated.              */
-  /*                                                                       */
-  /*    Be aware that FreeType reorders glyph indices internally so that   */
-  /*    glyph index~0 always corresponds to the `missing glyph' (called    */
-  /*    `.notdef').                                                        */
-  /*                                                                       */
-  /*    This function always returns an error if the config macro          */
-  /*    `FT_CONFIG_OPTION_NO_GLYPH_NAMES' is not defined in `ftoption.h'.  */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Glyph_Name( FT_Face     face,
-                     FT_UInt     glyph_index,
-                     FT_Pointer  buffer,
-                     FT_UInt     buffer_max );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Postscript_Name                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the ASCII PostScript name of a given face, if available.  */
-  /*    This only works with PostScript, TrueType, and OpenType fonts.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source face object.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A pointer to the face's PostScript name.  NULL if unavailable.     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The returned pointer is owned by the face and is destroyed with    */
-  /*    it.                                                                */
-  /*                                                                       */
-  FT_EXPORT( const char* )
-  FT_Get_Postscript_Name( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Select_Charmap                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Select a given charmap by its encoding tag (as listed in           */
-  /*    `freetype.h').                                                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face     :: A handle to the source face object.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    encoding :: A handle to the selected encoding.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function returns an error if no charmap in the face           */
-  /*    corresponds to the encoding queried here.                          */
-  /*                                                                       */
-  /*    Because many fonts contain more than a single cmap for Unicode     */
-  /*    encoding, this function has some special code to select the one    */
-  /*    that covers Unicode best (`best' in the sense that a UCS-4 cmap is */
-  /*    preferred to a UCS-2 cmap).  It is thus preferable to              */
-  /*    @FT_Set_Charmap in this case.                                      */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Select_Charmap( FT_Face      face,
-                     FT_Encoding  encoding );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Charmap                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Select a given charmap for character code to glyph index mapping.  */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face    :: A handle to the source face object.                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    charmap :: A handle to the selected charmap.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function returns an error if the charmap is not part of       */
-  /*    the face (i.e., if it is not listed in the `face->charmaps'        */
-  /*    table).                                                            */
-  /*                                                                       */
-  /*    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,
-                  FT_CharMap  charmap );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Get_Charmap_Index
-   *
-   * @description:
-   *   Retrieve index of a given charmap.
-   *
-   * @input:
-   *   charmap ::
-   *     A handle to a charmap.
-   *
-   * @return:
-   *   The index into the array of character maps within the face to which
-   *   `charmap' belongs.  If an error occurs, -1 is returned.
-   *
-   */
-  FT_EXPORT( FT_Int )
-  FT_Get_Charmap_Index( FT_CharMap  charmap );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Char_Index                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the glyph index of a given character code.  This function   */
-  /*    uses the currently selected charmap to do the mapping.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A handle to the source face object.                    */
-  /*                                                                       */
-  /*    charcode :: The character code.                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The glyph index.  0~means `undefined character code'.              */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    If you use FreeType to manipulate the contents of font files       */
-  /*    directly, be aware that the glyph index returned by this function  */
-  /*    doesn't always correspond to the internal indices used within the  */
-  /*    file.  This is done to ensure that value~0 always corresponds to   */
-  /*    the `missing glyph'.  If the first glyph is not named `.notdef',   */
-  /*    then for Type~1 and Type~42 fonts, `.notdef' will be moved into    */
-  /*    the glyph ID~0 position, and whatever was there will be moved to   */
-  /*    the position `.notdef' had.  For Type~1 fonts, if there is no      */
-  /*    `.notdef' glyph at all, then one will be created at index~0 and    */
-  /*    whatever was there will be moved to the last index -- Type~42      */
-  /*    fonts are considered invalid under this condition.                 */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt )
-  FT_Get_Char_Index( FT_Face   face,
-                     FT_ULong  charcode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_First_Char                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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.                     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    agindex :: Glyph index of first character code.  0~if charmap is   */
-  /*               empty.                                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The charmap's first character code.                                */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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:                                             */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      FT_ULong  charcode;                                              */
-  /*      FT_UInt   gindex;                                                */
-  /*                                                                       */
-  /*                                                                       */
-  /*      charcode = FT_Get_First_Char( face, &gindex );                   */
-  /*      while ( gindex != 0 )                                            */
-  /*      {                                                                */
-  /*        ... do something with (charcode,gindex) pair ...               */
-  /*                                                                       */
-  /*        charcode = FT_Get_Next_Char( face, charcode, &gindex );        */
-  /*      }                                                                */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    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.                  */
-  /*                                                                       */
-  FT_EXPORT( FT_ULong )
-  FT_Get_First_Char( FT_Face   face,
-                     FT_UInt  *agindex );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Next_Char                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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>                                                              */
-  /*    agindex   :: Glyph index of next character code.  0~if charmap     */
-  /*                 is empty.                                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The charmap's next character code.                                 */
-  /*                                                                       */
-  /* <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 that function for a simple code example.                  */
-  /*                                                                       */
-  /*    Note that `*agindex' is set to~0 when there are no more codes in   */
-  /*    the charmap.                                                       */
-  /*                                                                       */
-  FT_EXPORT( FT_ULong )
-  FT_Get_Next_Char( FT_Face    face,
-                    FT_ULong   char_code,
-                    FT_UInt   *agindex );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Name_Index                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the glyph index of a given glyph name.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face       :: A handle to the source face object.                  */
-  /*                                                                       */
-  /*    glyph_name :: The glyph name.                                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The glyph index.  0~means `undefined character code'.              */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt )
-  FT_Get_Name_Index( FT_Face     face,
-                     FT_String*  glyph_name );
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_SUBGLYPH_FLAG_XXX
-   *
-   * @description:
-   *   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 ::
-   *   FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES ::
-   *   FT_SUBGLYPH_FLAG_ROUND_XY_TO_GRID ::
-   *   FT_SUBGLYPH_FLAG_SCALE ::
-   *   FT_SUBGLYPH_FLAG_XY_SCALE ::
-   *   FT_SUBGLYPH_FLAG_2X2 ::
-   *   FT_SUBGLYPH_FLAG_USE_MY_METRICS ::
-   *
-   */
-#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
-
-
-  /*************************************************************************
-   *
-   * @func:
-   *   FT_Get_SubGlyph_Info
-   *
-   * @description:
-   *   Retrieve a description of a given subglyph.  Only use it if
-   *   `glyph->format' is @FT_GLYPH_FORMAT_COMPOSITE; an error is
-   *   returned otherwise.
-   *
-   * @input:
-   *   glyph ::
-   *     The source glyph slot.
-   *
-   *   sub_index ::
-   *     The index of the subglyph.  Must be less than
-   *     `glyph->num_subglyphs'.
-   *
-   * @output:
-   *   p_index ::
-   *     The glyph index of the subglyph.
-   *
-   *   p_flags ::
-   *     The subglyph flags, see @FT_SUBGLYPH_FLAG_XXX.
-   *
-   *   p_arg1 ::
-   *     The subglyph's first argument (if any).
-   *
-   *   p_arg2 ::
-   *     The subglyph's second argument (if any).
-   *
-   *   p_transform ::
-   *     The subglyph transformation (if any).
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   The values of `*p_arg1', `*p_arg2', and `*p_transform' must be
-   *   interpreted depending on the flags returned in `*p_flags'.  See the
-   *   OpenType specification for details.
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
-                        FT_UInt       sub_index,
-                        FT_Int       *p_index,
-                        FT_UInt      *p_flags,
-                        FT_Int       *p_arg1,
-                        FT_Int       *p_arg2,
-                        FT_Matrix    *p_transform );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_FSTYPE_XXX                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A list of bit flags used in the `fsType' field of the OS/2 table   */
-  /*    in a TrueType or OpenType font and the `FSType' entry in a         */
-  /*    PostScript font.  These bit flags are returned by                  */
-  /*    @FT_Get_FSType_Flags; they inform client applications of embedding */
-  /*    and subsetting restrictions associated with a font.                */
-  /*                                                                       */
-  /*    See                                                                */
-  /*    http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/FontPolicies.pdf */
-  /*    for more details.                                                  */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_FSTYPE_INSTALLABLE_EMBEDDING ::                                 */
-  /*      Fonts with no fsType bit set may be embedded and permanently     */
-  /*      installed on the remote system by an application.                */
-  /*                                                                       */
-  /*    FT_FSTYPE_RESTRICTED_LICENSE_EMBEDDING ::                          */
-  /*      Fonts that have only this bit set must not be modified, embedded */
-  /*      or exchanged in any manner without first obtaining permission of */
-  /*      the font software copyright owner.                               */
-  /*                                                                       */
-  /*    FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING ::                           */
-  /*      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 ::                                    */
-  /*      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 ::                                         */
-  /*      The font may not be subsetted prior to embedding.                */
-  /*                                                                       */
-  /*    FT_FSTYPE_BITMAP_EMBEDDING_ONLY ::                                 */
-  /*      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>                                                                */
-  /*    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
-#define FT_FSTYPE_PREVIEW_AND_PRINT_EMBEDDING   0x0004
-#define FT_FSTYPE_EDITABLE_EMBEDDING            0x0008
-#define FT_FSTYPE_NO_SUBSETTING                 0x0100
-#define FT_FSTYPE_BITMAP_EMBEDDING_ONLY         0x0200
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_FSType_Flags                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the `fsType' flags for a font.                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source face object.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The `fsType' flags, see @FT_FSTYPE_XXX.                            */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Use this function rather than directly reading the `fs_type' field */
-  /*    in the @PS_FontInfoRec structure, which is only guaranteed to      */
-  /*    return the correct results for Type~1 fonts.                       */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.8                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_UShort )
-  FT_Get_FSType_Flags( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    glyph_variants                                                     */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Glyph Variants                                                     */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    The FreeType~2 interface to Unicode Ideographic Variation          */
-  /*    Sequences (IVS), 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.                                     */
-  /*                                                                       */
-  /*    An IVS is registered and unique; for further details please refer  */
-  /*    to Unicode Technical Standard #37, the Ideographic Variation       */
-  /*    Database:                                                          */
-  /*                                                                       */
-  /*      http://www.unicode.org/reports/tr37/                             */
-  /*      http://www.unicode.org/ivd/                                      */
-  /*                                                                       */
-  /*    To date (January 2017), the character with the most variants 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.                                             */
-  /*                                                                       */
-  /*    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.                                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_GetCharVariantIndex                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the glyph index of a given character code as modified by    */
-  /*    the variation selector.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      A handle to the source face object.                              */
-  /*                                                                       */
-  /*    charcode ::                                                        */
-  /*      The character code point in Unicode.                             */
-  /*                                                                       */
-  /*    variantSelector ::                                                 */
-  /*      The Unicode code point of the variation selector.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The glyph index.  0~means either `undefined character code', or    */
-  /*    `undefined selector code', or `no variation selector cmap          */
-  /*    subtable', or `current CharMap is not Unicode'.                    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    If you use FreeType to manipulate the contents of font files       */
-  /*    directly, be aware that the glyph index returned by this function  */
-  /*    doesn't always correspond to the internal indices used within      */
-  /*    the file.  This is done to ensure that value~0 always corresponds  */
-  /*    to the `missing glyph'.                                            */
-  /*                                                                       */
-  /*    This function is only meaningful if                                */
-  /*      a) the font has a variation selector cmap sub table,             */
-  /*    and                                                                */
-  /*      b) the current charmap has a Unicode encoding.                   */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.6                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt )
-  FT_Face_GetCharVariantIndex( FT_Face   face,
-                               FT_ULong  charcode,
-                               FT_ULong  variantSelector );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_GetCharVariantIsDefault                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Check whether this variant of this Unicode character is the one to */
-  /*    be found in the `cmap'.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      A handle to the source face object.                              */
-  /*                                                                       */
-  /*    charcode ::                                                        */
-  /*      The character codepoint in Unicode.                              */
-  /*                                                                       */
-  /*    variantSelector ::                                                 */
-  /*      The Unicode codepoint of the variation selector.                 */
-  /*                                                                       */
-  /* <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.             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function is only meaningful if the font has a variation       */
-  /*    selector cmap subtable.                                            */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.6                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Int )
-  FT_Face_GetCharVariantIsDefault( FT_Face   face,
-                                   FT_ULong  charcode,
-                                   FT_ULong  variantSelector );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_GetVariantSelectors                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a zero-terminated list of Unicode variant selectors found   */
-  /*    in the font.                                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      A handle to the source face object.                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A pointer to an array of selector code points, or NULL if there is */
-  /*    no valid variant selector cmap subtable.                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The last item in the array is~0; the array is owned by the         */
-  /*    @FT_Face object but can be overwritten or released on the next     */
-  /*    call to a FreeType function.                                       */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.6                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt32* )
-  FT_Face_GetVariantSelectors( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_GetVariantsOfChar                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a zero-terminated list of Unicode variant selectors found   */
-  /*    for the specified character code.                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      A handle to the source face object.                              */
-  /*                                                                       */
-  /*    charcode ::                                                        */
-  /*      The character codepoint in Unicode.                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A pointer to an array of variant selector code points that are     */
-  /*    active for the given character, or NULL if the corresponding list  */
-  /*    is empty.                                                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The last item in the array is~0; the array is owned by the         */
-  /*    @FT_Face object but can be overwritten or released on the next     */
-  /*    call to a FreeType function.                                       */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.6                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt32* )
-  FT_Face_GetVariantsOfChar( FT_Face   face,
-                             FT_ULong  charcode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_GetCharsOfVariant                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a zero-terminated list of Unicode character codes found for */
-  /*    the specified variant selector.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      A handle to the source face object.                              */
-  /*                                                                       */
-  /*    variantSelector ::                                                 */
-  /*      The variant 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.               */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The last item in the array is~0; the array is owned by the         */
-  /*    @FT_Face object but can be overwritten or released on the next     */
-  /*    call to a FreeType function.                                       */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.6                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_UInt32* )
-  FT_Face_GetCharsOfVariant( FT_Face   face,
-                             FT_ULong  variantSelector );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    computations                                                       */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Computations                                                       */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Crunching fixed numbers and vectors.                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains various functions used to perform            */
-  /*    computations on 16.16 fixed-float numbers or 2d vectors.           */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_MulDiv                                                          */
-  /*    FT_MulFix                                                          */
-  /*    FT_DivFix                                                          */
-  /*    FT_RoundFix                                                        */
-  /*    FT_CeilFix                                                         */
-  /*    FT_FloorFix                                                        */
-  /*    FT_Vector_Transform                                                */
-  /*    FT_Matrix_Multiply                                                 */
-  /*    FT_Matrix_Invert                                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_MulDiv                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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>                                                              */
-  /*    The result of `(a*b)/c'.  This function never traps when trying to */
-  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
-  /*    on the signs of `a' and `b'.                                       */
-  /*                                                                       */
-  FT_EXPORT( FT_Long )
-  FT_MulDiv( FT_Long  a,
-             FT_Long  b,
-             FT_Long  c );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_MulFix                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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).                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The result of `(a*b)/0x10000'.                                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function has been optimized for the case where the absolute   */
-  /*    value of `a' is less than 2048, and `b' is a 16.16 scaling factor. */
-  /*    As this happens mainly when scaling from notional units to         */
-  /*    fractional pixels in FreeType, it resulted in noticeable speed     */
-  /*    improvements between versions 2.x and 1.x.                         */
-  /*                                                                       */
-  /*    As a conclusion, always try to place a 16.16 factor as the         */
-  /*    _second_ argument of this function; this can make a great          */
-  /*    difference.                                                        */
-  /*                                                                       */
-  FT_EXPORT( FT_Long )
-  FT_MulFix( FT_Long  a,
-             FT_Long  b );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_DivFix                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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>                                                              */
-  /*    The result of `(a*0x10000)/b'.                                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Long )
-  FT_DivFix( FT_Long  a,
-             FT_Long  b );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_RoundFix                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Round a 16.16 fixed number.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    a :: The number to be rounded.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    `a' rounded to the nearest 16.16 fixed integer, halfway cases away */
-  /*    from zero.                                                         */
-  /*                                                                       */
-  FT_EXPORT( FT_Fixed )
-  FT_RoundFix( FT_Fixed  a );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_CeilFix                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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>                                                              */
-  /*    `a' rounded towards plus infinity.                                 */
-  /*                                                                       */
-  FT_EXPORT( FT_Fixed )
-  FT_CeilFix( FT_Fixed  a );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_FloorFix                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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>                                                              */
-  /*    `a' rounded towards minus infinity.                                */
-  /*                                                                       */
-  FT_EXPORT( FT_Fixed )
-  FT_FloorFix( FT_Fixed  a );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Vector_Transform                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Transform a single vector through a 2x2 matrix.                    */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    vector :: The target vector to transform.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    matrix :: A pointer to the source 2x2 matrix.                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The result is undefined if either `vector' or `matrix' is invalid. */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Vector_Transform( FT_Vector*        vec,
-                       const FT_Matrix*  matrix );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    version                                                            */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    FreeType Version                                                   */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Functions and macros related to FreeType versions.                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Note that those functions and macros are of limited use because    */
-  /*    even a new release of FreeType with only documentation changes     */
-  /*    increases the version number.                                      */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Library_Version                                                 */
-  /*                                                                       */
-  /*    FREETYPE_MAJOR                                                     */
-  /*    FREETYPE_MINOR                                                     */
-  /*    FREETYPE_PATCH                                                     */
-  /*                                                                       */
-  /*    FT_Face_CheckTrueTypePatents                                       */
-  /*    FT_Face_SetUnpatentedHinting                                       */
-  /*                                                                       */
-  /*    FREETYPE_XXX                                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @enum:
-   *   FREETYPE_XXX
-   *
-   * @description:
-   *   These three macros identify the FreeType source code version.
-   *   Use @FT_Library_Version to access them at runtime.
-   *
-   * @values:
-   *   FREETYPE_MAJOR :: The major version number.
-   *   FREETYPE_MINOR :: The minor version number.
-   *   FREETYPE_PATCH :: The patch level.
-   *
-   * @note:
-   *   The version number of FreeType if built as a dynamic link library
-   *   with the `libtool' package is _not_ controlled by these three
-   *   macros.
-   *
-   */
-#define FREETYPE_MAJOR  2
-#define FREETYPE_MINOR  7
-#define FREETYPE_PATCH  1
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Library_Version                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the version of the FreeType library being used.  This is    */
-  /*    useful when dynamically linking to the library, since one cannot   */
-  /*    use the macros @FREETYPE_MAJOR, @FREETYPE_MINOR, and               */
-  /*    @FREETYPE_PATCH.                                                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A source library handle.                                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    amajor  :: The major version number.                               */
-  /*                                                                       */
-  /*    aminor  :: The minor version number.                               */
-  /*                                                                       */
-  /*    apatch  :: The patch version number.                               */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The reason why this function takes a `library' argument is because */
-  /*    certain programs implement library initialization in a custom way  */
-  /*    that doesn't use @FT_Init_FreeType.                                */
-  /*                                                                       */
-  /*    In such cases, the library version might not be available before   */
-  /*    the library object has been created.                               */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Library_Version( FT_Library   library,
-                      FT_Int      *amajor,
-                      FT_Int      *aminor,
-                      FT_Int      *apatch );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_CheckTrueTypePatents                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deprecated, does nothing.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A face handle.                                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always returns false.                                              */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Since May 2010, TrueType hinting is no longer patented.            */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.5                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Bool )
-  FT_Face_CheckTrueTypePatents( FT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Face_SetUnpatentedHinting                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deprecated, does nothing.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face  :: A face handle.                                            */
-  /*                                                                       */
-  /*    value :: New boolean setting.                                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always returns false.                                              */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Since May 2010, TrueType hinting is no longer patented.            */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.3.5                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Bool )
-  FT_Face_SetUnpatentedHinting( FT_Face  face,
-                                FT_Bool  value );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FREETYPE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftadvanc.h b/third_party/freetype/include/freetype/ftadvanc.h
deleted file mode 100644
index dea96e0..0000000
--- a/third_party/freetype/include/freetype/ftadvanc.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftadvanc.h                                                             */
-/*                                                                         */
-/*    Quick computation of advance widths (specification only).            */
-/*                                                                         */
-/*  Copyright 2008-2017 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 FTADVANC_H_
-#define FTADVANC_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:
-   *   quick_advance
-   *
-   * @title:
-   *   Quick retrieval of advance values
-   *
-   * @abstract:
-   *   Retrieve horizontal and vertical advance values without processing
-   *   glyph outlines, if possible.
-   *
-   * @description:
-   *   This section contains functions to quickly extract advance values
-   *   without handling glyph outlines, if possible.
-   *
-   * @order:
-   *   FT_Get_Advance
-   *   FT_Get_Advances
-   *
-   */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Const>                                                               */
-  /*    FT_ADVANCE_FLAG_FAST_ONLY                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A bit-flag to be OR-ed with the `flags' parameter of the           */
-  /*    @FT_Get_Advance and @FT_Get_Advances functions.                    */
-  /*                                                                       */
-  /*    If set, it indicates that you want these functions to fail if the  */
-  /*    corresponding hinting mode or font driver doesn't allow for very   */
-  /*    quick advance computation.                                         */
-  /*                                                                       */
-  /*    Typically, glyphs that are either unscaled, unhinted, bitmapped,   */
-  /*    or light-hinted can have their advance width computed very         */
-  /*    quickly.                                                           */
-  /*                                                                       */
-  /*    Normal and bytecode hinted modes that require loading, scaling,    */
-  /*    and hinting of the glyph outline, are extremely slow by            */
-  /*    comparison.                                                        */
-  /*                                                                       */
-#define FT_ADVANCE_FLAG_FAST_ONLY  0x20000000L
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Advance                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the advance value of a given glyph outline in an          */
-  /*    @FT_Face.                                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face       :: The source @FT_Face handle.                          */
-  /*                                                                       */
-  /*    gindex     :: The glyph index.                                     */
-  /*                                                                       */
-  /*    load_flags :: A set of bit flags similar to those used when        */
-  /*                  calling @FT_Load_Glyph, used to determine what kind  */
-  /*                  of advances you need.                                */
-  /* <Output>                                                              */
-  /*    padvance :: The advance value.  If scaling is performed (based on  */
-  /*                the value of `load_flags'), the advance value is in    */
-  /*                16.16 format.  Otherwise, it is in font units.         */
-  /*                                                                       */
-  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, this is the        */
-  /*                vertical advance corresponding to a vertical layout.   */
-  /*                Otherwise, it is the horizontal advance in a           */
-  /*                horizontal layout.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
-  /*    if the corresponding font backend doesn't have a quick way to      */
-  /*    retrieve the advances.                                             */
-  /*                                                                       */
-  /*    A scaled advance is returned in 16.16 format but isn't transformed */
-  /*    by the affine transformation specified by @FT_Set_Transform.       */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Advance( FT_Face    face,
-                  FT_UInt    gindex,
-                  FT_Int32   load_flags,
-                  FT_Fixed  *padvance );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Advances                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the advance values of several glyph outlines in an        */
-  /*    @FT_Face.                                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: The source @FT_Face handle.                         */
-  /*                                                                       */
-  /*    start       :: The first glyph index.                              */
-  /*                                                                       */
-  /*    count       :: The number of advance values you want to retrieve.  */
-  /*                                                                       */
-  /*    load_flags  :: A set of bit flags similar to those used when       */
-  /*                   calling @FT_Load_Glyph.                             */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    padvance :: The advance values.  This array, to be provided by the */
-  /*                caller, must contain at least `count' elements.        */
-  /*                                                                       */
-  /*                If scaling is performed (based on the value of         */
-  /*                `load_flags'), the advance values are in 16.16 format. */
-  /*                Otherwise, they are in font units.                     */
-  /*                                                                       */
-  /*                If @FT_LOAD_VERTICAL_LAYOUT is set, these are the      */
-  /*                vertical advances corresponding to a vertical layout.  */
-  /*                Otherwise, they are the horizontal advances in a       */
-  /*                horizontal layout.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function may fail if you use @FT_ADVANCE_FLAG_FAST_ONLY and   */
-  /*    if the corresponding font backend doesn't have a quick way to      */
-  /*    retrieve the advances.                                             */
-  /*                                                                       */
-  /*    Scaled advances are returned in 16.16 format but aren't            */
-  /*    transformed by the affine transformation specified by              */
-  /*    @FT_Set_Transform.                                                 */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Advances( FT_Face    face,
-                   FT_UInt    start,
-                   FT_UInt    count,
-                   FT_Int32   load_flags,
-                   FT_Fixed  *padvances );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTADVANC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftbitmap.h b/third_party/freetype/include/freetype/ftbitmap.h
deleted file mode 100644
index 04b2402..0000000
--- a/third_party/freetype/include/freetype/ftbitmap.h
+++ /dev/null
@@ -1,240 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbitmap.h                                                             */
-/*                                                                         */
-/*    FreeType utility functions for bitmaps (specification).              */
-/*                                                                         */
-/*  Copyright 2004-2017 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 FTBITMAP_H_
-#define FTBITMAP_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>                                                             */
-  /*    bitmap_handling                                                    */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Bitmap Handling                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Handling FT_Bitmap objects.                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains functions for handling @FT_Bitmap objects.   */
-  /*    Note that none of the functions changes the bitmap's `flow' (as    */
-  /*    indicated by the sign of the `pitch' field in `FT_Bitmap').        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Bitmap_Init                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a pointer to an @FT_Bitmap structure.                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    abitmap :: A pointer to the bitmap structure.                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    A deprecated name for the same function is `FT_Bitmap_New'.        */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Bitmap_Init( FT_Bitmap  *abitmap );
-
-
-  /* deprecated */
-  FT_EXPORT( void )
-  FT_Bitmap_New( FT_Bitmap  *abitmap );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Bitmap_Copy                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Copy a bitmap into another one.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to a library object.                           */
-  /*                                                                       */
-  /*    source  :: A handle to the source bitmap.                          */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    target  :: A handle to the target bitmap.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Bitmap_Copy( FT_Library        library,
-                  const FT_Bitmap  *source,
-                  FT_Bitmap        *target);
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Bitmap_Embolden                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Embolden a bitmap.  The new bitmap will be about `xStrength'       */
-  /*    pixels wider and `yStrength' pixels higher.  The left and bottom   */
-  /*    borders are kept unchanged.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library   :: A handle to a library object.                         */
-  /*                                                                       */
-  /*    xStrength :: How strong the glyph is emboldened horizontally.      */
-  /*                 Expressed in 26.6 pixel format.                       */
-  /*                                                                       */
-  /*    yStrength :: How strong the glyph is emboldened vertically.        */
-  /*                 Expressed in 26.6 pixel format.                       */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    bitmap    :: A handle to the target bitmap.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The current implementation restricts `xStrength' to be less than   */
-  /*    or equal to~8 if bitmap is of pixel_mode @FT_PIXEL_MODE_MONO.      */
-  /*                                                                       */
-  /*    If you want to embolden the bitmap owned by a @FT_GlyphSlotRec,    */
-  /*    you should call @FT_GlyphSlot_Own_Bitmap on the slot first.        */
-  /*                                                                       */
-  /*    Bitmaps in @FT_PIXEL_MODE_GRAY2 and @FT_PIXEL_MODE_GRAY@ format    */
-  /*    are converted to @FT_PIXEL_MODE_GRAY format (i.e., 8bpp).          */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Bitmap_Embolden( FT_Library  library,
-                      FT_Bitmap*  bitmap,
-                      FT_Pos      xStrength,
-                      FT_Pos      yStrength );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Bitmap_Convert                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Convert a bitmap object with depth 1bpp, 2bpp, 4bpp, 8bpp or 32bpp */
-  /*    to a bitmap object with depth 8bpp, making the number of used      */
-  /*    bytes line (a.k.a. the `pitch') a multiple of `alignment'.         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library   :: A handle to a library object.                         */
-  /*                                                                       */
-  /*    source    :: The source bitmap.                                    */
-  /*                                                                       */
-  /*    alignment :: The pitch of the bitmap is a multiple of this         */
-  /*                 parameter.  Common values are 1, 2, or 4.             */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    target    :: The target bitmap.                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    It is possible to call @FT_Bitmap_Convert multiple times without   */
-  /*    calling @FT_Bitmap_Done (the memory is simply reallocated).        */
-  /*                                                                       */
-  /*    Use @FT_Bitmap_Done to finally remove the bitmap object.           */
-  /*                                                                       */
-  /*    The `library' argument is taken to have access to FreeType's       */
-  /*    memory handling functions.                                         */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Bitmap_Convert( FT_Library        library,
-                     const FT_Bitmap  *source,
-                     FT_Bitmap        *target,
-                     FT_Int            alignment );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_GlyphSlot_Own_Bitmap                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Make sure that a glyph slot owns `slot->bitmap'.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    slot :: The glyph slot.                                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function is to be used in combination with                    */
-  /*    @FT_Bitmap_Embolden.                                               */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Bitmap_Done                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy a bitmap object initialized with @FT_Bitmap_Init.          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to a library object.                           */
-  /*                                                                       */
-  /*    bitmap  :: The bitmap object to be freed.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The `library' argument is taken to have access to FreeType's       */
-  /*    memory handling functions.                                         */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Bitmap_Done( FT_Library  library,
-                  FT_Bitmap  *bitmap );
-
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTBITMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftcffdrv.h b/third_party/freetype/include/freetype/ftcffdrv.h
deleted file mode 100644
index 35758f8..0000000
--- a/third_party/freetype/include/freetype/ftcffdrv.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcffdrv.h                                                             */
-/*                                                                         */
-/*    FreeType API for controlling the CFF driver (specification only).    */
-/*                                                                         */
-/*  Copyright 2013-2017 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) 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.
-   *
-   * @order:
-   *   hinting-engine[cff]
-   *   no-stem-darkening[cff]
-   *   darkening-parameters[cff]
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   hinting-engine[cff]
-   *
-   * @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.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values `adobe' or `freetype').
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_CFF_HINTING_XXX
-   *
-   * @description:
-   *   A list of constants used for the @hinting-engine[cff] 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[cff]
-   *
-   * @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.
-   *
-   *   This property can be set via the `FREETYPE_PROPERTIES' environment
-   *   variable (using values 1 and 0 for `on' and `off', respectively).
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   darkening-parameters[cff]
-   *
-   * @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.
-   *
-   *   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=\
-   *     cff:darkening-parameters=500,300,1000,200,1500,100,2000,0
-   *   }
-   */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* FTCFFDRV_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/fterrdef.h b/third_party/freetype/include/freetype/fterrdef.h
deleted file mode 100644
index 232dccd..0000000
--- a/third_party/freetype/include/freetype/fterrdef.h
+++ /dev/null
@@ -1,276 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fterrdef.h                                                             */
-/*                                                                         */
-/*    FreeType error codes (specification).                                */
-/*                                                                         */
-/*  Copyright 2002-2017 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_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.                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Err_XXX                                                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /* generic errors */
-
-  FT_NOERRORDEF_( Ok,                                        0x00,
-                  "no error" )
-
-  FT_ERRORDEF_( Cannot_Open_Resource,                        0x01,
-                "cannot open resource" )
-  FT_ERRORDEF_( Unknown_File_Format,                         0x02,
-                "unknown file format" )
-  FT_ERRORDEF_( Invalid_File_Format,                         0x03,
-                "broken file" )
-  FT_ERRORDEF_( Invalid_Version,                             0x04,
-                "invalid FreeType version" )
-  FT_ERRORDEF_( Lower_Module_Version,                        0x05,
-                "module version is too low" )
-  FT_ERRORDEF_( Invalid_Argument,                            0x06,
-                "invalid argument" )
-  FT_ERRORDEF_( Unimplemented_Feature,                       0x07,
-                "unimplemented feature" )
-  FT_ERRORDEF_( Invalid_Table,                               0x08,
-                "broken table" )
-  FT_ERRORDEF_( Invalid_Offset,                              0x09,
-                "broken offset within table" )
-  FT_ERRORDEF_( Array_Too_Large,                             0x0A,
-                "array allocation size too large" )
-  FT_ERRORDEF_( Missing_Module,                              0x0B,
-                "missing module" )
-  FT_ERRORDEF_( Missing_Property,                            0x0C,
-                "missing property" )
-
-  /* glyph/character errors */
-
-  FT_ERRORDEF_( Invalid_Glyph_Index,                         0x10,
-                "invalid glyph index" )
-  FT_ERRORDEF_( Invalid_Character_Code,                      0x11,
-                "invalid character code" )
-  FT_ERRORDEF_( Invalid_Glyph_Format,                        0x12,
-                "unsupported glyph image format" )
-  FT_ERRORDEF_( Cannot_Render_Glyph,                         0x13,
-                "cannot render this glyph format" )
-  FT_ERRORDEF_( Invalid_Outline,                             0x14,
-                "invalid outline" )
-  FT_ERRORDEF_( Invalid_Composite,                           0x15,
-                "invalid composite glyph" )
-  FT_ERRORDEF_( Too_Many_Hints,                              0x16,
-                "too many hints" )
-  FT_ERRORDEF_( Invalid_Pixel_Size,                          0x17,
-                "invalid pixel size" )
-
-  /* handle errors */
-
-  FT_ERRORDEF_( Invalid_Handle,                              0x20,
-                "invalid object handle" )
-  FT_ERRORDEF_( Invalid_Library_Handle,                      0x21,
-                "invalid library handle" )
-  FT_ERRORDEF_( Invalid_Driver_Handle,                       0x22,
-                "invalid module handle" )
-  FT_ERRORDEF_( Invalid_Face_Handle,                         0x23,
-                "invalid face handle" )
-  FT_ERRORDEF_( Invalid_Size_Handle,                         0x24,
-                "invalid size handle" )
-  FT_ERRORDEF_( Invalid_Slot_Handle,                         0x25,
-                "invalid glyph slot handle" )
-  FT_ERRORDEF_( Invalid_CharMap_Handle,                      0x26,
-                "invalid charmap handle" )
-  FT_ERRORDEF_( Invalid_Cache_Handle,                        0x27,
-                "invalid cache manager handle" )
-  FT_ERRORDEF_( Invalid_Stream_Handle,                       0x28,
-                "invalid stream handle" )
-
-  /* driver errors */
-
-  FT_ERRORDEF_( Too_Many_Drivers,                            0x30,
-                "too many modules" )
-  FT_ERRORDEF_( Too_Many_Extensions,                         0x31,
-                "too many extensions" )
-
-  /* memory errors */
-
-  FT_ERRORDEF_( Out_Of_Memory,                               0x40,
-                "out of memory" )
-  FT_ERRORDEF_( Unlisted_Object,                             0x41,
-                "unlisted object" )
-
-  /* stream errors */
-
-  FT_ERRORDEF_( Cannot_Open_Stream,                          0x51,
-                "cannot open stream" )
-  FT_ERRORDEF_( Invalid_Stream_Seek,                         0x52,
-                "invalid stream seek" )
-  FT_ERRORDEF_( Invalid_Stream_Skip,                         0x53,
-                "invalid stream skip" )
-  FT_ERRORDEF_( Invalid_Stream_Read,                         0x54,
-                "invalid stream read" )
-  FT_ERRORDEF_( Invalid_Stream_Operation,                    0x55,
-                "invalid stream operation" )
-  FT_ERRORDEF_( Invalid_Frame_Operation,                     0x56,
-                "invalid frame operation" )
-  FT_ERRORDEF_( Nested_Frame_Access,                         0x57,
-                "nested frame access" )
-  FT_ERRORDEF_( Invalid_Frame_Read,                          0x58,
-                "invalid frame read" )
-
-  /* raster errors */
-
-  FT_ERRORDEF_( Raster_Uninitialized,                        0x60,
-                "raster uninitialized" )
-  FT_ERRORDEF_( Raster_Corrupted,                            0x61,
-                "raster corrupted" )
-  FT_ERRORDEF_( Raster_Overflow,                             0x62,
-                "raster overflow" )
-  FT_ERRORDEF_( Raster_Negative_Height,                      0x63,
-                "negative height while rastering" )
-
-  /* cache errors */
-
-  FT_ERRORDEF_( Too_Many_Caches,                             0x70,
-                "too many registered caches" )
-
-  /* TrueType and SFNT errors */
-
-  FT_ERRORDEF_( Invalid_Opcode,                              0x80,
-                "invalid opcode" )
-  FT_ERRORDEF_( Too_Few_Arguments,                           0x81,
-                "too few arguments" )
-  FT_ERRORDEF_( Stack_Overflow,                              0x82,
-                "stack overflow" )
-  FT_ERRORDEF_( Code_Overflow,                               0x83,
-                "code overflow" )
-  FT_ERRORDEF_( Bad_Argument,                                0x84,
-                "bad argument" )
-  FT_ERRORDEF_( Divide_By_Zero,                              0x85,
-                "division by zero" )
-  FT_ERRORDEF_( Invalid_Reference,                           0x86,
-                "invalid reference" )
-  FT_ERRORDEF_( Debug_OpCode,                                0x87,
-                "found debug opcode" )
-  FT_ERRORDEF_( ENDF_In_Exec_Stream,                         0x88,
-                "found ENDF opcode in execution stream" )
-  FT_ERRORDEF_( Nested_DEFS,                                 0x89,
-                "nested DEFS" )
-  FT_ERRORDEF_( Invalid_CodeRange,                           0x8A,
-                "invalid code range" )
-  FT_ERRORDEF_( Execution_Too_Long,                          0x8B,
-                "execution context too long" )
-  FT_ERRORDEF_( Too_Many_Function_Defs,                      0x8C,
-                "too many function definitions" )
-  FT_ERRORDEF_( Too_Many_Instruction_Defs,                   0x8D,
-                "too many instruction definitions" )
-  FT_ERRORDEF_( Table_Missing,                               0x8E,
-                "SFNT font table missing" )
-  FT_ERRORDEF_( Horiz_Header_Missing,                        0x8F,
-                "horizontal header (hhea) table missing" )
-  FT_ERRORDEF_( Locations_Missing,                           0x90,
-                "locations (loca) table missing" )
-  FT_ERRORDEF_( Name_Table_Missing,                          0x91,
-                "name table missing" )
-  FT_ERRORDEF_( CMap_Table_Missing,                          0x92,
-                "character map (cmap) table missing" )
-  FT_ERRORDEF_( Hmtx_Table_Missing,                          0x93,
-                "horizontal metrics (hmtx) table missing" )
-  FT_ERRORDEF_( Post_Table_Missing,                          0x94,
-                "PostScript (post) table missing" )
-  FT_ERRORDEF_( Invalid_Horiz_Metrics,                       0x95,
-                "invalid horizontal metrics" )
-  FT_ERRORDEF_( Invalid_CharMap_Format,                      0x96,
-                "invalid character map (cmap) format" )
-  FT_ERRORDEF_( Invalid_PPem,                                0x97,
-                "invalid ppem value" )
-  FT_ERRORDEF_( Invalid_Vert_Metrics,                        0x98,
-                "invalid vertical metrics" )
-  FT_ERRORDEF_( Could_Not_Find_Context,                      0x99,
-                "could not find context" )
-  FT_ERRORDEF_( Invalid_Post_Table_Format,                   0x9A,
-                "invalid PostScript (post) table format" )
-  FT_ERRORDEF_( Invalid_Post_Table,                          0x9B,
-                "invalid PostScript (post) table" )
-
-  /* CFF, CID, and Type 1 errors */
-
-  FT_ERRORDEF_( Syntax_Error,                                0xA0,
-                "opcode syntax error" )
-  FT_ERRORDEF_( Stack_Underflow,                             0xA1,
-                "argument stack underflow" )
-  FT_ERRORDEF_( Ignore,                                      0xA2,
-                "ignore" )
-  FT_ERRORDEF_( No_Unicode_Glyph_Name,                       0xA3,
-                "no Unicode glyph name found" )
-  FT_ERRORDEF_( Glyph_Too_Big,                               0xA4,
-                "glyph too big for hinting" )
-
-  /* BDF errors */
-
-  FT_ERRORDEF_( Missing_Startfont_Field,                     0xB0,
-                "`STARTFONT' field missing" )
-  FT_ERRORDEF_( Missing_Font_Field,                          0xB1,
-                "`FONT' field missing" )
-  FT_ERRORDEF_( Missing_Size_Field,                          0xB2,
-                "`SIZE' field missing" )
-  FT_ERRORDEF_( Missing_Fontboundingbox_Field,               0xB3,
-                "`FONTBOUNDINGBOX' field missing" )
-  FT_ERRORDEF_( Missing_Chars_Field,                         0xB4,
-                "`CHARS' field missing" )
-  FT_ERRORDEF_( Missing_Startchar_Field,                     0xB5,
-                "`STARTCHAR' field missing" )
-  FT_ERRORDEF_( Missing_Encoding_Field,                      0xB6,
-                "`ENCODING' field missing" )
-  FT_ERRORDEF_( Missing_Bbx_Field,                           0xB7,
-                "`BBX' field missing" )
-  FT_ERRORDEF_( Bbx_Too_Big,                                 0xB8,
-                "`BBX' too big" )
-  FT_ERRORDEF_( Corrupted_Font_Header,                       0xB9,
-                "Font header corrupted or missing fields" )
-  FT_ERRORDEF_( Corrupted_Font_Glyphs,                       0xBA,
-                "Font glyphs corrupted or missing fields" )
-
-  /* */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/fterrors.h b/third_party/freetype/include/freetype/fterrors.h
deleted file mode 100644
index 021989d..0000000
--- a/third_party/freetype/include/freetype/fterrors.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fterrors.h                                                             */
-/*                                                                         */
-/*    FreeType error code handling (specification).                        */
-/*                                                                         */
-/*  Copyright 1996-2017 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&nbsp;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&nbsp;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 backwards 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/third_party/freetype/include/freetype/ftfntfmt.h b/third_party/freetype/include/freetype/ftfntfmt.h
deleted file mode 100644
index 3377583..0000000
--- a/third_party/freetype/include/freetype/ftfntfmt.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftfntfmt.h                                                             */
-/*                                                                         */
-/*    Support functions for font formats.                                  */
-/*                                                                         */
-/*  Copyright 2002-2017 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 FTFNTFMT_H_
-#define FTFNTFMT_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>                                                             */
-  /*   font_formats                                                        */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*   Font Formats                                                        */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*   Getting the font format.                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   The single function in this section can be used to get the font     */
-  /*   format.  Note that this information is not needed normally;         */
-  /*   however, there are special cases (like in PDF devices) where it is  */
-  /*   important to differentiate, in spite of FreeType's uniform API.     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*   FT_Get_Font_Format                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   Return a string describing the format of a given face.  Possible    */
-  /*   values are `TrueType', `Type~1', `BDF', `PCF', `Type~42',           */
-  /*   `CID~Type~1', `CFF', `PFR', and `Windows~FNT'.                      */
-  /*                                                                       */
-  /*   The return value is suitable to be used as an X11 FONT_PROPERTY.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*   face ::                                                             */
-  /*     Input face handle.                                                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*   Font format string.  NULL in case of error.                         */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*   A deprecated name for the same function is                          */
-  /*   `FT_Get_X11_Font_Format'.                                           */
-  /*                                                                       */
-  FT_EXPORT( const char* )
-  FT_Get_Font_Format( FT_Face  face );
-
-
-  /* deprecated */
-  FT_EXPORT( const char* )
-  FT_Get_X11_Font_Format( FT_Face  face );
-
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTFNTFMT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftglyph.h b/third_party/freetype/include/freetype/ftglyph.h
deleted file mode 100644
index 6b51792..0000000
--- a/third_party/freetype/include/freetype/ftglyph.h
+++ /dev/null
@@ -1,605 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftglyph.h                                                              */
-/*                                                                         */
-/*    FreeType convenience functions to handle glyphs (specification).     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 contains the definition of several convenience functions    */
-  /* that can be used by client applications to easily retrieve glyph      */
-  /* bitmaps and outlines from a given face.                               */
-  /*                                                                       */
-  /* These functions should be optional if you are writing a font server   */
-  /* or text layout engine on top of FreeType.  However, they are pretty   */
-  /* handy for many other simple uses of the library.                      */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTGLYPH_H_
-#define FTGLYPH_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>                                                             */
-  /*    glyph_management                                                   */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Glyph Management                                                   */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Generic interface to manage individual glyph data.                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains definitions used to manage glyph data        */
-  /*    through generic FT_Glyph objects.  Each of them can contain a      */
-  /*    bitmap, a vector outline, or even images in other formats.         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* forward declaration to a private type */
-  typedef struct FT_Glyph_Class_  FT_Glyph_Class;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Glyph                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Handle to an object used to model generic glyph images.  It is a   */
-  /*    pointer to the @FT_GlyphRec structure and can contain a glyph      */
-  /*    bitmap or pointer.                                                 */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Glyph objects are not owned by the library.  You must thus release */
-  /*    them manually (through @FT_Done_Glyph) _before_ calling            */
-  /*    @FT_Done_FreeType.                                                 */
-  /*                                                                       */
-  typedef struct FT_GlyphRec_*  FT_Glyph;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_GlyphRec                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The root glyph structure contains a given glyph image plus its     */
-  /*    advance width in 16.16 fixed-point format.                         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    library :: A handle to the FreeType library object.                */
-  /*                                                                       */
-  /*    clazz   :: A pointer to the glyph's class.  Private.               */
-  /*                                                                       */
-  /*    format  :: The format of the glyph's image.                        */
-  /*                                                                       */
-  /*    advance :: A 16.16 vector that gives the glyph's advance width.    */
-  /*                                                                       */
-  typedef struct  FT_GlyphRec_
-  {
-    FT_Library             library;
-    const FT_Glyph_Class*  clazz;
-    FT_Glyph_Format        format;
-    FT_Vector              advance;
-
-  } FT_GlyphRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_BitmapGlyph                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an object used to model a bitmap glyph image.  This is */
-  /*    a sub-class of @FT_Glyph, and a pointer to @FT_BitmapGlyphRec.     */
-  /*                                                                       */
-  typedef struct FT_BitmapGlyphRec_*  FT_BitmapGlyph;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_BitmapGlyphRec                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used for bitmap glyph images.  This really is a        */
-  /*    `sub-class' of @FT_GlyphRec.                                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root   :: The root @FT_Glyph fields.                               */
-  /*                                                                       */
-  /*    left   :: The left-side bearing, i.e., the horizontal distance     */
-  /*              from the current pen position to the left border of the  */
-  /*              glyph bitmap.                                            */
-  /*                                                                       */
-  /*    top    :: The top-side bearing, i.e., the vertical distance from   */
-  /*              the current pen position to the top border of the glyph  */
-  /*              bitmap.  This distance is positive for upwards~y!        */
-  /*                                                                       */
-  /*    bitmap :: A descriptor for the bitmap.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You can typecast an @FT_Glyph to @FT_BitmapGlyph if you have       */
-  /*    `glyph->format == FT_GLYPH_FORMAT_BITMAP'.  This lets you access   */
-  /*    the bitmap's contents easily.                                      */
-  /*                                                                       */
-  /*    The corresponding pixel buffer is always owned by @FT_BitmapGlyph  */
-  /*    and is thus created and destroyed with it.                         */
-  /*                                                                       */
-  typedef struct  FT_BitmapGlyphRec_
-  {
-    FT_GlyphRec  root;
-    FT_Int       left;
-    FT_Int       top;
-    FT_Bitmap    bitmap;
-
-  } FT_BitmapGlyphRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_OutlineGlyph                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an object used to model an outline glyph image.  This  */
-  /*    is a sub-class of @FT_Glyph, and a pointer to @FT_OutlineGlyphRec. */
-  /*                                                                       */
-  typedef struct FT_OutlineGlyphRec_*  FT_OutlineGlyph;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_OutlineGlyphRec                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used for outline (vectorial) glyph images.  This       */
-  /*    really is a `sub-class' of @FT_GlyphRec.                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root    :: The root @FT_Glyph fields.                              */
-  /*                                                                       */
-  /*    outline :: A descriptor for the outline.                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You can typecast an @FT_Glyph to @FT_OutlineGlyph if you have      */
-  /*    `glyph->format == FT_GLYPH_FORMAT_OUTLINE'.  This lets you access  */
-  /*    the outline's content easily.                                      */
-  /*                                                                       */
-  /*    As the outline is extracted from a glyph slot, its coordinates are */
-  /*    expressed normally in 26.6 pixels, unless the flag                 */
-  /*    @FT_LOAD_NO_SCALE was used in @FT_Load_Glyph() or @FT_Load_Char(). */
-  /*                                                                       */
-  /*    The outline's tables are always owned by the object and are        */
-  /*    destroyed with it.                                                 */
-  /*                                                                       */
-  typedef struct  FT_OutlineGlyphRec_
-  {
-    FT_GlyphRec  root;
-    FT_Outline   outline;
-
-  } FT_OutlineGlyphRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Glyph                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to extract a glyph image from a slot.  Note that   */
-  /*    the created @FT_Glyph object must be released with @FT_Done_Glyph. */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    slot   :: A handle to the source glyph slot.                       */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aglyph :: A handle to the glyph object.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Glyph( FT_GlyphSlot  slot,
-                FT_Glyph     *aglyph );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Glyph_Copy                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to copy a glyph image.  Note that the created      */
-  /*    @FT_Glyph object must be released with @FT_Done_Glyph.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    source :: A handle to the source glyph object.                     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    target :: A handle to the target glyph object.  0~in case of       */
-  /*              error.                                                   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Glyph_Copy( FT_Glyph   source,
-                 FT_Glyph  *target );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Glyph_Transform                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Transform a glyph image if its format is scalable.                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    glyph  :: A handle to the target glyph object.                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    matrix :: A pointer to a 2x2 matrix to apply.                      */
-  /*                                                                       */
-  /*    delta  :: A pointer to a 2d vector to apply.  Coordinates are      */
-  /*              expressed in 1/64th of a pixel.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code (if not 0, the glyph format is not scalable).  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The 2x2 transformation matrix is also applied to the glyph's       */
-  /*    advance vector.                                                    */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Glyph_Transform( FT_Glyph    glyph,
-                      FT_Matrix*  matrix,
-                      FT_Vector*  delta );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Glyph_BBox_Mode                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The mode how the values of @FT_Glyph_Get_CBox are returned.        */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_GLYPH_BBOX_UNSCALED ::                                          */
-  /*      Return unscaled font units.                                      */
-  /*                                                                       */
-  /*    FT_GLYPH_BBOX_SUBPIXELS ::                                         */
-  /*      Return unfitted 26.6 coordinates.                                */
-  /*                                                                       */
-  /*    FT_GLYPH_BBOX_GRIDFIT ::                                           */
-  /*      Return grid-fitted 26.6 coordinates.                             */
-  /*                                                                       */
-  /*    FT_GLYPH_BBOX_TRUNCATE ::                                          */
-  /*      Return coordinates in integer pixels.                            */
-  /*                                                                       */
-  /*    FT_GLYPH_BBOX_PIXELS ::                                            */
-  /*      Return grid-fitted pixel coordinates.                            */
-  /*                                                                       */
-  typedef enum  FT_Glyph_BBox_Mode_
-  {
-    FT_GLYPH_BBOX_UNSCALED  = 0,
-    FT_GLYPH_BBOX_SUBPIXELS = 0,
-    FT_GLYPH_BBOX_GRIDFIT   = 1,
-    FT_GLYPH_BBOX_TRUNCATE  = 2,
-    FT_GLYPH_BBOX_PIXELS    = 3
-
-  } FT_Glyph_BBox_Mode;
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_Glyph_BBox_Mode' values instead                   */
-#define ft_glyph_bbox_unscaled   FT_GLYPH_BBOX_UNSCALED
-#define ft_glyph_bbox_subpixels  FT_GLYPH_BBOX_SUBPIXELS
-#define ft_glyph_bbox_gridfit    FT_GLYPH_BBOX_GRIDFIT
-#define ft_glyph_bbox_truncate   FT_GLYPH_BBOX_TRUNCATE
-#define ft_glyph_bbox_pixels     FT_GLYPH_BBOX_PIXELS
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Glyph_Get_CBox                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a glyph'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>                                                               */
-  /*    glyph :: A handle to the source glyph object.                      */
-  /*                                                                       */
-  /*    mode  :: The mode that indicates how to interpret the returned     */
-  /*             bounding box values.                                      */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    acbox :: The glyph coordinate bounding box.  Coordinates are       */
-  /*             expressed in 1/64th of pixels if it is grid-fitted.       */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Coordinates are relative to the glyph origin, using the y~upwards  */
-  /*    convention.                                                        */
-  /*                                                                       */
-  /*    If the glyph has been loaded with @FT_LOAD_NO_SCALE, `bbox_mode'   */
-  /*    must be set to @FT_GLYPH_BBOX_UNSCALED to get unscaled font        */
-  /*    units in 26.6 pixel format.  The value @FT_GLYPH_BBOX_SUBPIXELS    */
-  /*    is another name for this constant.                                 */
-  /*                                                                       */
-  /*    If the font is tricky and the glyph has been loaded with           */
-  /*    @FT_LOAD_NO_SCALE, the resulting CBox is meaningless.  To get      */
-  /*    reasonable values for the CBox it is necessary to load the glyph   */
-  /*    at a large ppem value (so that the hinting instructions can        */
-  /*    properly shift and scale the subglyphs), then extracting the CBox, */
-  /*    which can be eventually converted back to font units.              */
-  /*                                                                       */
-  /*    Note that the maximum coordinates are exclusive, which means that  */
-  /*    one can compute the width and height of the glyph image (be it in  */
-  /*    integer or 26.6 pixels) as:                                        */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      width  = bbox.xMax - bbox.xMin;                                  */
-  /*      height = bbox.yMax - bbox.yMin;                                  */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    Note also that for 26.6 coordinates, if `bbox_mode' is set to      */
-  /*    @FT_GLYPH_BBOX_GRIDFIT, the coordinates will also be grid-fitted,  */
-  /*    which corresponds to:                                              */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      bbox.xMin = FLOOR(bbox.xMin);                                    */
-  /*      bbox.yMin = FLOOR(bbox.yMin);                                    */
-  /*      bbox.xMax = CEILING(bbox.xMax);                                  */
-  /*      bbox.yMax = CEILING(bbox.yMax);                                  */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    To get the bbox in pixel coordinates, set `bbox_mode' to           */
-  /*    @FT_GLYPH_BBOX_TRUNCATE.                                           */
-  /*                                                                       */
-  /*    To get the bbox in grid-fitted pixel coordinates, set `bbox_mode'  */
-  /*    to @FT_GLYPH_BBOX_PIXELS.                                          */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Glyph_Get_CBox( FT_Glyph  glyph,
-                     FT_UInt   bbox_mode,
-                     FT_BBox  *acbox );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Glyph_To_Bitmap                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Convert a given glyph object to a bitmap glyph object.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    the_glyph   :: A pointer to a handle to the target glyph.          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    render_mode :: An enumeration that describes how the data is       */
-  /*                   rendered.                                           */
-  /*                                                                       */
-  /*    origin      :: A pointer to a vector used to translate the glyph   */
-  /*                   image before rendering.  Can be~0 (if no            */
-  /*                   translation).  The origin is expressed in           */
-  /*                   26.6 pixels.                                        */
-  /*                                                                       */
-  /*    destroy     :: A boolean that indicates that the original glyph    */
-  /*                   image should be destroyed by this function.  It is  */
-  /*                   never destroyed in case of error.                   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function does nothing if the glyph format isn't scalable.     */
-  /*                                                                       */
-  /*    The glyph image is translated with the `origin' vector before      */
-  /*    rendering.                                                         */
-  /*                                                                       */
-  /*    The first parameter is a pointer to an @FT_Glyph handle, that will */
-  /*    be _replaced_ by this function (with newly allocated data).        */
-  /*    Typically, you would use (omitting error handling):                */
-  /*                                                                       */
-  /*                                                                       */
-  /*      {                                                                */
-  /*        FT_Glyph        glyph;                                         */
-  /*        FT_BitmapGlyph  glyph_bitmap;                                  */
-  /*                                                                       */
-  /*                                                                       */
-  /*        // load glyph                                                  */
-  /*        error = FT_Load_Char( face, glyph_index, FT_LOAD_DEFAUT );     */
-  /*                                                                       */
-  /*        // extract glyph image                                         */
-  /*        error = FT_Get_Glyph( face->glyph, &glyph );                   */
-  /*                                                                       */
-  /*        // convert to a bitmap (default render mode + destroying old)  */
-  /*        if ( glyph->format != FT_GLYPH_FORMAT_BITMAP )                 */
-  /*        {                                                              */
-  /*          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL,   */
-  /*                                      0, 1 );                          */
-  /*          if ( error ) // `glyph' unchanged                            */
-  /*            ...                                                        */
-  /*        }                                                              */
-  /*                                                                       */
-  /*        // access bitmap content by typecasting                        */
-  /*        glyph_bitmap = (FT_BitmapGlyph)glyph;                          */
-  /*                                                                       */
-  /*        // do funny stuff with it, like blitting/drawing               */
-  /*        ...                                                            */
-  /*                                                                       */
-  /*        // discard glyph image (bitmap or not)                         */
-  /*        FT_Done_Glyph( glyph );                                        */
-  /*      }                                                                */
-  /*                                                                       */
-  /*                                                                       */
-  /*    Here another example, again without error handling:                */
-  /*                                                                       */
-  /*                                                                       */
-  /*      {                                                                */
-  /*        FT_Glyph  glyphs[MAX_GLYPHS]                                   */
-  /*                                                                       */
-  /*                                                                       */
-  /*        ...                                                            */
-  /*                                                                       */
-  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
-  /*          error = FT_Load_Glyph( face, idx, FT_LOAD_DEFAULT ) ||       */
-  /*                  FT_Get_Glyph ( face->glyph, &glyph[idx] );           */
-  /*                                                                       */
-  /*        ...                                                            */
-  /*                                                                       */
-  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
-  /*        {                                                              */
-  /*          FT_Glyph  bitmap = glyphs[idx];                              */
-  /*                                                                       */
-  /*                                                                       */
-  /*          ...                                                          */
-  /*                                                                       */
-  /*          // after this call, `bitmap' no longer points into           */
-  /*          // the `glyphs' array (and the old value isn't destroyed)    */
-  /*          FT_Glyph_To_Bitmap( &bitmap, FT_RENDER_MODE_MONO, 0, 0 );    */
-  /*                                                                       */
-  /*          ...                                                          */
-  /*                                                                       */
-  /*          FT_Done_Glyph( bitmap );                                     */
-  /*        }                                                              */
-  /*                                                                       */
-  /*        ...                                                            */
-  /*                                                                       */
-  /*        for ( idx = 0; i < MAX_GLYPHS; i++ )                           */
-  /*          FT_Done_Glyph( glyphs[idx] );                                */
-  /*      }                                                                */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
-                      FT_Render_Mode  render_mode,
-                      FT_Vector*      origin,
-                      FT_Bool         destroy );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Glyph                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy a given glyph.                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    glyph :: A handle to the target glyph object.                      */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Done_Glyph( FT_Glyph  glyph );
-
-  /* */
-
-
-  /* other helpful functions */
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    computations                                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Matrix_Multiply                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Perform the matrix operation `b = a*b'.                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    a :: A pointer to matrix `a'.                                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    b :: A pointer to matrix `b'.                                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The result is undefined if either `a' or `b' is zero.              */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Matrix_Multiply( const FT_Matrix*  a,
-                      FT_Matrix*        b );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Matrix_Invert                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Invert a 2x2 matrix.  Return an error if it can't be inverted.     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    matrix :: A pointer to the target matrix.  Remains untouched in    */
-  /*              case of error.                                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Matrix_Invert( FT_Matrix*  matrix );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTGLYPH_H_ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/ftgzip.h b/third_party/freetype/include/freetype/ftgzip.h
deleted file mode 100644
index bd5ceaa..0000000
--- a/third_party/freetype/include/freetype/ftgzip.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgzip.h                                                               */
-/*                                                                         */
-/*    Gzip-compressed stream support.                                      */
-/*                                                                         */
-/*  Copyright 2002-2017 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 FTGZIP_H_
-#define FTGZIP_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>                                                             */
-  /*    gzip                                                               */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    GZIP Streams                                                       */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Using gzip-compressed font files.                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of Gzip-specific functions.  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
- /************************************************************************
-  *
-  * @function:
-  *   FT_Stream_OpenGzip
-  *
-  * @description:
-  *   Open a new stream to parse gzip-compressed font files.  This is
-  *   mainly used to support the compressed `*.pcf.gz' fonts that come
-  *   with XFree86.
-  *
-  * @input:
-  *   stream ::
-  *     The target embedding stream.
-  *
-  *   source ::
-  *     The source stream.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   The source stream must be opened _before_ calling this function.
-  *
-  *   Calling the internal function `FT_Stream_Close' on the new stream will
-  *   *not* call `FT_Stream_Close' on the source stream.  None of the stream
-  *   objects will be released to the heap.
-  *
-  *   The stream implementation is very basic and resets the decompression
-  *   process each time seeking backwards is needed within the stream.
-  *
-  *   In certain builds of the library, gzip compression recognition is
-  *   automatically handled when calling @FT_New_Face or @FT_Open_Face.
-  *   This means that if no font driver is capable of handling the raw
-  *   compressed file, the library will try to open a gzipped stream from
-  *   it and re-open the face with it.
-  *
-  *   This function may return `FT_Err_Unimplemented_Feature' if your build
-  *   of FreeType was not compiled with zlib support.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Stream_OpenGzip( FT_Stream  stream,
-                      FT_Stream  source );
-
-
- /************************************************************************
-  *
-  * @function:
-  *   FT_Gzip_Uncompress
-  *
-  * @description:
-  *   Decompress a zipped input buffer into an output buffer.  This function
-  *   is modeled after zlib's `uncompress' function.
-  *
-  * @input:
-  *   memory ::
-  *     A FreeType memory handle.
-  *
-  *   input ::
-  *     The input buffer.
-  *
-  *   input_len ::
-  *     The length of the input buffer.
-  *
-  * @output:
-  *   output::
-  *     The output buffer.
-  *
-  * @inout:
-  *   output_len ::
-  *     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.
-  *
-  * @note:
-  *   This function may return `FT_Err_Unimplemented_Feature' if your build
-  *   of FreeType was not compiled with zlib support.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Gzip_Uncompress( FT_Memory       memory,
-                      FT_Byte*        output,
-                      FT_ULong*       output_len,
-                      const FT_Byte*  input,
-                      FT_ULong        input_len );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTGZIP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftimage.h b/third_party/freetype/include/freetype/ftimage.h
deleted file mode 100644
index e21a220..0000000
--- a/third_party/freetype/include/freetype/ftimage.h
+++ /dev/null
@@ -1,1205 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftimage.h                                                              */
-/*                                                                         */
-/*    FreeType glyph image formats and default raster interface            */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Note: A `raster' is simply a scan-line converter, used to render      */
-  /*       FT_Outlines into FT_Bitmaps.                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTIMAGE_H_
-#define FTIMAGE_H_
-
-
-  /* STANDALONE_ is from ftgrays.c */
-#ifndef STANDALONE_
-#include <ft2build.h>
-#endif
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    basic_types                                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Pos                                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The type FT_Pos is used to store vectorial coordinates.  Depending */
-  /*    on the context, these can represent distances in integer font      */
-  /*    units, or 16.16, or 26.6 fixed-point pixel coordinates.            */
-  /*                                                                       */
-  typedef signed long  FT_Pos;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Vector                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to store a 2D vector; coordinates are of   */
-  /*    the FT_Pos type.                                                   */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    x :: The horizontal coordinate.                                    */
-  /*    y :: The vertical coordinate.                                      */
-  /*                                                                       */
-  typedef struct  FT_Vector_
-  {
-    FT_Pos  x;
-    FT_Pos  y;
-
-  } FT_Vector;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_BBox                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to hold an outline's bounding box, i.e., the      */
-  /*    coordinates of its extrema in the horizontal and vertical          */
-  /*    directions.                                                        */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    xMin :: The horizontal minimum (left-most).                        */
-  /*                                                                       */
-  /*    yMin :: The vertical minimum (bottom-most).                        */
-  /*                                                                       */
-  /*    xMax :: The horizontal maximum (right-most).                       */
-  /*                                                                       */
-  /*    yMax :: The vertical maximum (top-most).                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The bounding box is specified with the coordinates of the lower    */
-  /*    left and the upper right corner.  In PostScript, those values are  */
-  /*    often called (llx,lly) and (urx,ury), respectively.                */
-  /*                                                                       */
-  /*    If `yMin' is negative, this value gives the glyph's descender.     */
-  /*    Otherwise, the glyph doesn't descend below the baseline.           */
-  /*    Similarly, if `ymax' is positive, this value gives the glyph's     */
-  /*    ascender.                                                          */
-  /*                                                                       */
-  /*    `xMin' gives the horizontal distance from the glyph's origin to    */
-  /*    the left edge of the glyph's bounding box.  If `xMin' is negative, */
-  /*    the glyph extends to the left of the origin.                       */
-  /*                                                                       */
-  typedef struct  FT_BBox_
-  {
-    FT_Pos  xMin, yMin;
-    FT_Pos  xMax, yMax;
-
-  } FT_BBox;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Pixel_Mode                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration type used to describe the format of pixels in a     */
-  /*    given bitmap.  Note that additional formats may be added in the    */
-  /*    future.                                                            */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_PIXEL_MODE_NONE ::                                              */
-  /*      Value~0 is reserved.                                             */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_MONO ::                                              */
-  /*      A monochrome bitmap, using 1~bit per pixel.  Note that pixels    */
-  /*      are stored in most-significant order (MSB), which means that     */
-  /*      the left-most pixel in a byte has value 128.                     */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_GRAY ::                                              */
-  /*      An 8-bit bitmap, generally used to represent anti-aliased glyph  */
-  /*      images.  Each pixel is stored in one byte.  Note that the number */
-  /*      of `gray' levels is stored in the `num_grays' field of the       */
-  /*      @FT_Bitmap structure (it generally is 256).                      */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_GRAY2 ::                                             */
-  /*      A 2-bit per pixel bitmap, used to represent embedded             */
-  /*      anti-aliased bitmaps in font files according to the OpenType     */
-  /*      specification.  We haven't found a single font using this        */
-  /*      format, however.                                                 */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_GRAY4 ::                                             */
-  /*      A 4-bit per pixel bitmap, representing embedded anti-aliased     */
-  /*      bitmaps in font files according to the OpenType specification.   */
-  /*      We haven't found a single font using this format, however.       */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_LCD ::                                               */
-  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
-  /*      used for display on LCD displays; the bitmap is three times      */
-  /*      wider than the original glyph image.  See also                   */
-  /*      @FT_RENDER_MODE_LCD.                                             */
-  /*                                                                       */
-  /*    FT_PIXEL_MODE_LCD_V ::                                             */
-  /*      An 8-bit bitmap, representing RGB or BGR decimated glyph images  */
-  /*      used for display on rotated LCD displays; the bitmap is three    */
-  /*      times taller than the original glyph image.  See also            */
-  /*      @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.                                         */
-  /*                                                                       */
-  typedef enum  FT_Pixel_Mode_
-  {
-    FT_PIXEL_MODE_NONE = 0,
-    FT_PIXEL_MODE_MONO,
-    FT_PIXEL_MODE_GRAY,
-    FT_PIXEL_MODE_GRAY2,
-    FT_PIXEL_MODE_GRAY4,
-    FT_PIXEL_MODE_LCD,
-    FT_PIXEL_MODE_LCD_V,
-    FT_PIXEL_MODE_BGRA,
-
-    FT_PIXEL_MODE_MAX      /* do not remove */
-
-  } FT_Pixel_Mode;
-
-
-  /* these constants are deprecated; use the corresponding `FT_Pixel_Mode' */
-  /* values instead.                                                       */
-#define ft_pixel_mode_none   FT_PIXEL_MODE_NONE
-#define ft_pixel_mode_mono   FT_PIXEL_MODE_MONO
-#define ft_pixel_mode_grays  FT_PIXEL_MODE_GRAY
-#define ft_pixel_mode_pal2   FT_PIXEL_MODE_GRAY2
-#define ft_pixel_mode_pal4   FT_PIXEL_MODE_GRAY4
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Bitmap                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to describe a bitmap or pixmap to the raster.     */
-  /*    Note that we now manage pixmaps of various depths through the      */
-  /*    `pixel_mode' field.                                                */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    rows         :: The number of bitmap rows.                         */
-  /*                                                                       */
-  /*    width        :: The number of pixels in bitmap row.                */
-  /*                                                                       */
-  /*    pitch        :: The pitch's absolute value is the number of bytes  */
-  /*                    taken by one bitmap row, including padding.        */
-  /*                    However, the pitch is positive when the bitmap has */
-  /*                    a `down' flow, and negative when it has an `up'    */
-  /*                    flow.  In all cases, the pitch is an offset to add */
-  /*                    to a bitmap pointer in order to go down one row.   */
-  /*                                                                       */
-  /*                    Note that `padding' means the alignment of a       */
-  /*                    bitmap to a byte border, and FreeType functions    */
-  /*                    normally align to the smallest possible integer    */
-  /*                    value.                                             */
-  /*                                                                       */
-  /*                    For the B/W rasterizer, `pitch' is always an even  */
-  /*                    number.                                            */
-  /*                                                                       */
-  /*                    To change the pitch of a bitmap (say, to make it a */
-  /*                    multiple of 4), use @FT_Bitmap_Convert.            */
-  /*                    Alternatively, you might use callback functions to */
-  /*                    directly render to the application's surface; see  */
-  /*                    the file `example2.cpp' in the tutorial for a      */
-  /*                    demonstration.                                     */
-  /*                                                                       */
-  /*    buffer       :: A typeless pointer to the bitmap buffer.  This     */
-  /*                    value should be aligned on 32-bit boundaries in    */
-  /*                    most cases.                                        */
-  /*                                                                       */
-  /*    num_grays    :: This field is only used with                       */
-  /*                    @FT_PIXEL_MODE_GRAY; it gives the number of gray   */
-  /*                    levels used in the bitmap.                         */
-  /*                                                                       */
-  /*    pixel_mode   :: The pixel mode, i.e., how pixel bits are stored.   */
-  /*                    See @FT_Pixel_Mode for possible values.            */
-  /*                                                                       */
-  /*    palette_mode :: This field is intended for paletted pixel modes;   */
-  /*                    it indicates how the palette is stored.  Not       */
-  /*                    used currently.                                    */
-  /*                                                                       */
-  /*    palette      :: A typeless pointer to the bitmap palette; this     */
-  /*                    field is intended for paletted pixel modes.  Not   */
-  /*                    used currently.                                    */
-  /*                                                                       */
-  typedef struct  FT_Bitmap_
-  {
-    unsigned int    rows;
-    unsigned int    width;
-    int             pitch;
-    unsigned char*  buffer;
-    unsigned short  num_grays;
-    unsigned char   pixel_mode;
-    unsigned char   palette_mode;
-    void*           palette;
-
-  } FT_Bitmap;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    outline_processing                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Outline                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure is used to describe an outline to the scan-line     */
-  /*    converter.                                                         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    n_contours :: The number of contours in the outline.               */
-  /*                                                                       */
-  /*    n_points   :: The number of points in the outline.                 */
-  /*                                                                       */
-  /*    points     :: A pointer to an array of `n_points' @FT_Vector       */
-  /*                  elements, giving the outline's point coordinates.    */
-  /*                                                                       */
-  /*    tags       :: A pointer to an array of `n_points' chars, giving    */
-  /*                  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    */
-  /*                  set.                                                 */
-  /*                                                                       */
-  /*                  Bit~1 is meaningful for `off' points only.  If set,  */
-  /*                  it indicates a third-order Bézier arc control point; */
-  /*                  and a second-order control point if unset.           */
-  /*                                                                       */
-  /*                  If bit~2 is set, bits 5-7 contain the drop-out mode  */
-  /*                  (as defined in the OpenType specification; the value */
-  /*                  is the same as the argument to the SCANMODE          */
-  /*                  instruction).                                        */
-  /*                                                                       */
-  /*                  Bits 3 and~4 are reserved for internal purposes.     */
-  /*                                                                       */
-  /*    contours   :: An array of `n_contours' shorts, giving the end      */
-  /*                  point of each contour within the outline.  For       */
-  /*                  example, the first contour is defined by the points  */
-  /*                  `0' to `contours[0]', the second one is defined by   */
-  /*                  the points `contours[0]+1' to `contours[1]', etc.    */
-  /*                                                                       */
-  /*    flags      :: A set of bit flags used to characterize the outline  */
-  /*                  and give hints to the scan-converter and hinter on   */
-  /*                  how to convert/grid-fit it.  See @FT_OUTLINE_XXX.    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The B/W rasterizer only checks bit~2 in the `tags' array for the   */
-  /*    first point of each contour.  The drop-out mode as given with      */
-  /*    @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, and       */
-  /*    @FT_OUTLINE_INCLUDE_STUBS in `flags' is then overridden.           */
-  /*                                                                       */
-  typedef struct  FT_Outline_
-  {
-    short       n_contours;      /* number of contours in glyph        */
-    short       n_points;        /* number of points in the glyph      */
-
-    FT_Vector*  points;          /* the outline's points               */
-    char*       tags;            /* the points flags                   */
-    short*      contours;        /* the contour end points             */
-
-    int         flags;           /* outline masks                      */
-
-  } FT_Outline;
-
-  /* */
-
-  /* Following limits must be consistent with */
-  /* FT_Outline.{n_contours,n_points}         */
-#define FT_OUTLINE_CONTOURS_MAX  SHRT_MAX
-#define FT_OUTLINE_POINTS_MAX    SHRT_MAX
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_OUTLINE_XXX                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A list of bit-field constants use for the flags in an outline's    */
-  /*    `flags' field.                                                     */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_OUTLINE_NONE ::                                                 */
-  /*      Value~0 is reserved.                                             */
-  /*                                                                       */
-  /*    FT_OUTLINE_OWNER ::                                                */
-  /*      If set, this flag indicates that the outline's field arrays      */
-  /*      (i.e., `points', `flags', and `contours') are `owned' by the     */
-  /*      outline object, and should thus be freed when it is destroyed.   */
-  /*                                                                       */
-  /*    FT_OUTLINE_EVEN_ODD_FILL ::                                        */
-  /*      By default, outlines are filled using the non-zero winding rule. */
-  /*      If set to 1, the outline will be filled using the even-odd fill  */
-  /*      rule (only works with the smooth rasterizer).                    */
-  /*                                                                       */
-  /*    FT_OUTLINE_REVERSE_FILL ::                                         */
-  /*      By default, outside contours of an outline are oriented in       */
-  /*      clock-wise direction, as defined in the TrueType specification.  */
-  /*      This flag is set if the outline uses the opposite direction      */
-  /*      (typically for Type~1 fonts).  This flag is ignored by the scan  */
-  /*      converter.                                                       */
-  /*                                                                       */
-  /*    FT_OUTLINE_IGNORE_DROPOUTS ::                                      */
-  /*      By default, the scan converter will try to detect drop-outs in   */
-  /*      an outline and correct the glyph bitmap to ensure consistent     */
-  /*      shape continuity.  If set, this flag hints the scan-line         */
-  /*      converter to ignore such cases.  See below for more information. */
-  /*                                                                       */
-  /*    FT_OUTLINE_SMART_DROPOUTS ::                                       */
-  /*      Select smart dropout control.  If unset, use simple dropout      */
-  /*      control.  Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See    */
-  /*      below for more information.                                      */
-  /*                                                                       */
-  /*    FT_OUTLINE_INCLUDE_STUBS ::                                        */
-  /*      If set, turn pixels on for `stubs', otherwise exclude them.      */
-  /*      Ignored if @FT_OUTLINE_IGNORE_DROPOUTS is set.  See below for    */
-  /*      more information.                                                */
-  /*                                                                       */
-  /*    FT_OUTLINE_HIGH_PRECISION ::                                       */
-  /*      This flag indicates that the scan-line converter should try to   */
-  /*      convert this outline to bitmaps with the highest possible        */
-  /*      quality.  It is typically set for small character sizes.  Note   */
-  /*      that this is only a hint that might be completely ignored by a   */
-  /*      given scan-converter.                                            */
-  /*                                                                       */
-  /*    FT_OUTLINE_SINGLE_PASS ::                                          */
-  /*      This flag is set to force a given scan-converter to only use a   */
-  /*      single pass over the outline to render a bitmap glyph image.     */
-  /*      Normally, it is set for very large character sizes.  It is only  */
-  /*      a hint that might be completely ignored by a given               */
-  /*      scan-converter.                                                  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The flags @FT_OUTLINE_IGNORE_DROPOUTS, @FT_OUTLINE_SMART_DROPOUTS, */
-  /*    and @FT_OUTLINE_INCLUDE_STUBS are ignored by the smooth            */
-  /*    rasterizer.                                                        */
-  /*                                                                       */
-  /*    There exists a second mechanism to pass the drop-out mode to the   */
-  /*    B/W rasterizer; see the `tags' field in @FT_Outline.               */
-  /*                                                                       */
-  /*    Please refer to the description of the `SCANTYPE' instruction in   */
-  /*    the OpenType specification (in file `ttinst1.doc') how simple      */
-  /*    drop-outs, smart drop-outs, and stubs are defined.                 */
-  /*                                                                       */
-#define FT_OUTLINE_NONE             0x0
-#define FT_OUTLINE_OWNER            0x1
-#define FT_OUTLINE_EVEN_ODD_FILL    0x2
-#define FT_OUTLINE_REVERSE_FILL     0x4
-#define FT_OUTLINE_IGNORE_DROPOUTS  0x8
-#define FT_OUTLINE_SMART_DROPOUTS   0x10
-#define FT_OUTLINE_INCLUDE_STUBS    0x20
-
-#define FT_OUTLINE_HIGH_PRECISION   0x100
-#define FT_OUTLINE_SINGLE_PASS      0x200
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_OUTLINE_XXX' values instead                       */
-#define ft_outline_none             FT_OUTLINE_NONE
-#define ft_outline_owner            FT_OUTLINE_OWNER
-#define ft_outline_even_odd_fill    FT_OUTLINE_EVEN_ODD_FILL
-#define ft_outline_reverse_fill     FT_OUTLINE_REVERSE_FILL
-#define ft_outline_ignore_dropouts  FT_OUTLINE_IGNORE_DROPOUTS
-#define ft_outline_high_precision   FT_OUTLINE_HIGH_PRECISION
-#define ft_outline_single_pass      FT_OUTLINE_SINGLE_PASS
-
-  /* */
-
-#define FT_CURVE_TAG( flag )  ( flag & 3 )
-
-#define FT_CURVE_TAG_ON            1
-#define FT_CURVE_TAG_CONIC         0
-#define FT_CURVE_TAG_CUBIC         2
-
-#define FT_CURVE_TAG_HAS_SCANMODE  4
-
-#define FT_CURVE_TAG_TOUCH_X       8  /* reserved for the TrueType hinter */
-#define FT_CURVE_TAG_TOUCH_Y      16  /* reserved for the TrueType hinter */
-
-#define FT_CURVE_TAG_TOUCH_BOTH    ( FT_CURVE_TAG_TOUCH_X | \
-                                     FT_CURVE_TAG_TOUCH_Y )
-
-#define FT_Curve_Tag_On       FT_CURVE_TAG_ON
-#define FT_Curve_Tag_Conic    FT_CURVE_TAG_CONIC
-#define FT_Curve_Tag_Cubic    FT_CURVE_TAG_CUBIC
-#define FT_Curve_Tag_Touch_X  FT_CURVE_TAG_TOUCH_X
-#define FT_Curve_Tag_Touch_Y  FT_CURVE_TAG_TOUCH_Y
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Outline_MoveToFunc                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function pointer type used to describe the signature of a `move  */
-  /*    to' function during outline walking/decomposition.                 */
-  /*                                                                       */
-  /*    A `move to' is emitted to start a new contour in an outline.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    to   :: A pointer to the target point of the `move to'.            */
-  /*                                                                       */
-  /*    user :: A typeless pointer, which is passed from the caller of the */
-  /*            decomposition function.                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  typedef int
-  (*FT_Outline_MoveToFunc)( const FT_Vector*  to,
-                            void*             user );
-
-#define FT_Outline_MoveTo_Func  FT_Outline_MoveToFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Outline_LineToFunc                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function pointer type used to describe the signature of a `line  */
-  /*    to' function during outline walking/decomposition.                 */
-  /*                                                                       */
-  /*    A `line to' is emitted to indicate a segment in the outline.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    to   :: A pointer to the target point of the `line to'.            */
-  /*                                                                       */
-  /*    user :: A typeless pointer, which is passed from the caller of the */
-  /*            decomposition function.                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  typedef int
-  (*FT_Outline_LineToFunc)( const FT_Vector*  to,
-                            void*             user );
-
-#define FT_Outline_LineTo_Func  FT_Outline_LineToFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Outline_ConicToFunc                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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   */
-  /*    the outline.                                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    control :: An intermediate control point between the last position */
-  /*               and the new target in `to'.                             */
-  /*                                                                       */
-  /*    to      :: A pointer to the target end point of the conic arc.     */
-  /*                                                                       */
-  /*    user    :: A typeless pointer, which is passed from the caller of  */
-  /*               the decomposition function.                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  typedef int
-  (*FT_Outline_ConicToFunc)( const FT_Vector*  control,
-                             const FT_Vector*  to,
-                             void*             user );
-
-#define FT_Outline_ConicTo_Func  FT_Outline_ConicToFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Outline_CubicToFunc                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    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.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    control1 :: A pointer to the first Bézier control point.           */
-  /*                                                                       */
-  /*    control2 :: A pointer to the second Bézier control point.          */
-  /*                                                                       */
-  /*    to       :: A pointer to the target end point.                     */
-  /*                                                                       */
-  /*    user     :: A typeless pointer, which is passed from the caller of */
-  /*                the decomposition function.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  typedef int
-  (*FT_Outline_CubicToFunc)( const FT_Vector*  control1,
-                             const FT_Vector*  control2,
-                             const FT_Vector*  to,
-                             void*             user );
-
-#define FT_Outline_CubicTo_Func  FT_Outline_CubicToFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Outline_Funcs                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure to hold various function pointers used during outline  */
-  /*    decomposition in order to emit segments, conic, and cubic Béziers. */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    move_to  :: The `move to' emitter.                                 */
-  /*                                                                       */
-  /*    line_to  :: The segment emitter.                                   */
-  /*                                                                       */
-  /*    conic_to :: The second-order Bézier arc emitter.                   */
-  /*                                                                       */
-  /*    cubic_to :: The third-order Bézier arc emitter.                    */
-  /*                                                                       */
-  /*    shift    :: The shift that is applied to coordinates before they   */
-  /*                are sent to the emitter.                               */
-  /*                                                                       */
-  /*    delta    :: The delta that is applied to coordinates before they   */
-  /*                are sent to the emitter, but after the shift.          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The point coordinates sent to the emitters are the transformed     */
-  /*    version of the original coordinates (this is important for high    */
-  /*    accuracy during scan-conversion).  The transformation is simple:   */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      x' = (x << shift) - delta                                        */
-  /*      y' = (x << shift) - delta                                        */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    Set the values of `shift' and `delta' to~0 to get the original     */
-  /*    point coordinates.                                                 */
-  /*                                                                       */
-  typedef struct  FT_Outline_Funcs_
-  {
-    FT_Outline_MoveToFunc   move_to;
-    FT_Outline_LineToFunc   line_to;
-    FT_Outline_ConicToFunc  conic_to;
-    FT_Outline_CubicToFunc  cubic_to;
-
-    int                     shift;
-    FT_Pos                  delta;
-
-  } FT_Outline_Funcs;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    basic_types                                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_IMAGE_TAG                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro converts four-letter tags to an unsigned long type.     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Since many 16-bit compilers don't like 32-bit enumerations, you    */
-  /*    should redefine this macro in case of problems to something like   */
-  /*    this:                                                              */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      #define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  value         */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    to get a simple enumeration without assigning special numbers.     */
-  /*                                                                       */
-#ifndef FT_IMAGE_TAG
-#define FT_IMAGE_TAG( value, _x1, _x2, _x3, _x4 )  \
-          value = ( ( (unsigned long)_x1 << 24 ) | \
-                    ( (unsigned long)_x2 << 16 ) | \
-                    ( (unsigned long)_x3 << 8  ) | \
-                      (unsigned long)_x4         )
-#endif /* FT_IMAGE_TAG */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Glyph_Format                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration type used to describe the format of a given glyph   */
-  /*    image.  Note that this version of FreeType only supports two image */
-  /*    formats, even though future font drivers will be able to register  */
-  /*    their own format.                                                  */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_GLYPH_FORMAT_NONE ::                                            */
-  /*      The value~0 is reserved.                                         */
-  /*                                                                       */
-  /*    FT_GLYPH_FORMAT_COMPOSITE ::                                       */
-  /*      The glyph image is a composite of several other images.  This    */
-  /*      format is _only_ used with @FT_LOAD_NO_RECURSE, and is used to   */
-  /*      report compound glyphs (like accented characters).               */
-  /*                                                                       */
-  /*    FT_GLYPH_FORMAT_BITMAP ::                                          */
-  /*      The glyph image is a bitmap, and can be described as an          */
-  /*      @FT_Bitmap.  You generally need to access the `bitmap' field of  */
-  /*      the @FT_GlyphSlotRec structure to read it.                       */
-  /*                                                                       */
-  /*    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      */
-  /*      generally want to access the `outline' field of the              */
-  /*      @FT_GlyphSlotRec structure to read it.                           */
-  /*                                                                       */
-  /*    FT_GLYPH_FORMAT_PLOTTER ::                                         */
-  /*      The glyph image is a vectorial path with no inside and outside   */
-  /*      contours.  Some Type~1 fonts, like those in the Hershey family,  */
-  /*      contain glyphs in this format.  These are described as           */
-  /*      @FT_Outline, but FreeType isn't currently capable of rendering   */
-  /*      them correctly.                                                  */
-  /*                                                                       */
-  typedef enum  FT_Glyph_Format_
-  {
-    FT_IMAGE_TAG( FT_GLYPH_FORMAT_NONE, 0, 0, 0, 0 ),
-
-    FT_IMAGE_TAG( FT_GLYPH_FORMAT_COMPOSITE, 'c', 'o', 'm', 'p' ),
-    FT_IMAGE_TAG( FT_GLYPH_FORMAT_BITMAP,    'b', 'i', 't', 's' ),
-    FT_IMAGE_TAG( FT_GLYPH_FORMAT_OUTLINE,   'o', 'u', 't', 'l' ),
-    FT_IMAGE_TAG( FT_GLYPH_FORMAT_PLOTTER,   'p', 'l', 'o', 't' )
-
-  } FT_Glyph_Format;
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_Glyph_Format' values instead.                     */
-#define ft_glyph_format_none       FT_GLYPH_FORMAT_NONE
-#define ft_glyph_format_composite  FT_GLYPH_FORMAT_COMPOSITE
-#define ft_glyph_format_bitmap     FT_GLYPH_FORMAT_BITMAP
-#define ft_glyph_format_outline    FT_GLYPH_FORMAT_OUTLINE
-#define ft_glyph_format_plotter    FT_GLYPH_FORMAT_PLOTTER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****            R A S T E R   D E F I N I T I O N S                *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* A raster is a scan converter, in charge of rendering an outline into  */
-  /* 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       */
-  /* details on renderers.                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    raster                                                             */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Scanline Converter                                                 */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    How vectorial outlines are converted into bitmaps and pixmaps.     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains technical definitions.                       */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Raster                                                          */
-  /*    FT_Span                                                            */
-  /*    FT_SpanFunc                                                        */
-  /*                                                                       */
-  /*    FT_Raster_Params                                                   */
-  /*    FT_RASTER_FLAG_XXX                                                 */
-  /*                                                                       */
-  /*    FT_Raster_NewFunc                                                  */
-  /*    FT_Raster_DoneFunc                                                 */
-  /*    FT_Raster_ResetFunc                                                */
-  /*    FT_Raster_SetModeFunc                                              */
-  /*    FT_Raster_RenderFunc                                               */
-  /*    FT_Raster_Funcs                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Raster                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An opaque handle (pointer) to a raster object.  Each object can be */
-  /*    used independently to convert an outline into a bitmap or pixmap.  */
-  /*                                                                       */
-  typedef struct FT_RasterRec_*  FT_Raster;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Span                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a single span of gray pixels when        */
-  /*    rendering an anti-aliased bitmap.                                  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    x        :: The span's horizontal start position.                  */
-  /*                                                                       */
-  /*    len      :: The span's length in pixels.                           */
-  /*                                                                       */
-  /*    coverage :: The span color/coverage, ranging from 0 (background)   */
-  /*                to 255 (foreground).                                   */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This structure is used by the span drawing callback type named     */
-  /*    @FT_SpanFunc that takes the y~coordinate of the span as a          */
-  /*    parameter.                                                         */
-  /*                                                                       */
-  /*    The coverage value is always between 0 and 255.  If you want less  */
-  /*    gray values, the callback function has to reduce them.             */
-  /*                                                                       */
-  typedef struct  FT_Span_
-  {
-    short           x;
-    unsigned short  len;
-    unsigned char   coverage;
-
-  } FT_Span;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_SpanFunc                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used as a call-back by the anti-aliased renderer in     */
-  /*    order to let client applications draw themselves the gray pixel    */
-  /*    spans on each scan line.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    y     :: The scanline's y~coordinate.                              */
-  /*                                                                       */
-  /*    count :: The number of spans to draw on this scanline.             */
-  /*                                                                       */
-  /*    spans :: A table of `count' spans to draw on the scanline.         */
-  /*                                                                       */
-  /*    user  :: User-supplied data that is passed to the callback.        */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This callback allows client applications to directly render the    */
-  /*    gray spans of the anti-aliased bitmap to any kind of surfaces.     */
-  /*                                                                       */
-  /*    This can be used to write anti-aliased outlines directly to a      */
-  /*    given background bitmap, and even perform translucency.            */
-  /*                                                                       */
-  typedef void
-  (*FT_SpanFunc)( int             y,
-                  int             count,
-                  const FT_Span*  spans,
-                  void*           user );
-
-#define FT_Raster_Span_Func  FT_SpanFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_BitTest_Func                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deprecated, unimplemented.                                         */
-  /*                                                                       */
-  typedef int
-  (*FT_Raster_BitTest_Func)( int    y,
-                             int    x,
-                             void*  user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_BitSet_Func                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deprecated, unimplemented.                                         */
-  /*                                                                       */
-  typedef void
-  (*FT_Raster_BitSet_Func)( int    y,
-                            int    x,
-                            void*  user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_RASTER_FLAG_XXX                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A list of bit flag constants as used in the `flags' field of a     */
-  /*    @FT_Raster_Params structure.                                       */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_RASTER_FLAG_DEFAULT :: This value is 0.                         */
-  /*                                                                       */
-  /*    FT_RASTER_FLAG_AA      :: This flag is set to indicate that an     */
-  /*                              anti-aliased glyph image should be       */
-  /*                              generated.  Otherwise, it will be        */
-  /*                              monochrome (1-bit).                      */
-  /*                                                                       */
-  /*    FT_RASTER_FLAG_DIRECT  :: This flag is set to indicate direct      */
-  /*                              rendering.  In this mode, client         */
-  /*                              applications must provide their own span */
-  /*                              callback.  This lets them directly       */
-  /*                              draw or compose over an existing bitmap. */
-  /*                              If this bit is not set, the target       */
-  /*                              pixmap's buffer _must_ be zeroed before  */
-  /*                              rendering.                               */
-  /*                                                                       */
-  /*                              Direct rendering is only possible with   */
-  /*                              anti-aliased glyphs.                     */
-  /*                                                                       */
-  /*    FT_RASTER_FLAG_CLIP    :: This flag is only used in direct         */
-  /*                              rendering mode.  If set, the output will */
-  /*                              be clipped to a box specified in the     */
-  /*                              `clip_box' field of the                  */
-  /*                              @FT_Raster_Params structure.             */
-  /*                                                                       */
-  /*                              Note that by default, the glyph bitmap   */
-  /*                              is clipped to the target pixmap, except  */
-  /*                              in direct rendering mode where all spans */
-  /*                              are generated if no clipping box is set. */
-  /*                                                                       */
-#define FT_RASTER_FLAG_DEFAULT  0x0
-#define FT_RASTER_FLAG_AA       0x1
-#define FT_RASTER_FLAG_DIRECT   0x2
-#define FT_RASTER_FLAG_CLIP     0x4
-
-  /* these constants are deprecated; use the corresponding */
-  /* `FT_RASTER_FLAG_XXX' values instead                   */
-#define ft_raster_flag_default  FT_RASTER_FLAG_DEFAULT
-#define ft_raster_flag_aa       FT_RASTER_FLAG_AA
-#define ft_raster_flag_direct   FT_RASTER_FLAG_DIRECT
-#define ft_raster_flag_clip     FT_RASTER_FLAG_CLIP
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Raster_Params                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure to hold the arguments used by a raster's render        */
-  /*    function.                                                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    target      :: The target bitmap.                                  */
-  /*                                                                       */
-  /*    source      :: A pointer to the source glyph image (e.g., an       */
-  /*                   @FT_Outline).                                       */
-  /*                                                                       */
-  /*    flags       :: The rendering flags.                                */
-  /*                                                                       */
-  /*    gray_spans  :: The gray span drawing callback.                     */
-  /*                                                                       */
-  /*    black_spans :: Unused.                                             */
-  /*                                                                       */
-  /*    bit_test    :: Unused.                                             */
-  /*                                                                       */
-  /*    bit_set     :: Unused.                                             */
-  /*                                                                       */
-  /*    user        :: User-supplied data that is passed to each drawing   */
-  /*                   callback.                                           */
-  /*                                                                       */
-  /*    clip_box    :: An optional clipping box.  It is only used in       */
-  /*                   direct rendering mode.  Note that coordinates here  */
-  /*                   should be expressed in _integer_ pixels (and not in */
-  /*                   26.6 fixed-point units).                            */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    An anti-aliased glyph bitmap is drawn if the @FT_RASTER_FLAG_AA    */
-  /*    bit flag is set in the `flags' field, otherwise a monochrome       */
-  /*    bitmap is generated.                                               */
-  /*                                                                       */
-  /*    If the @FT_RASTER_FLAG_DIRECT bit flag is set in `flags', the      */
-  /*    raster will call the `gray_spans' callback to draw gray pixel      */
-  /*    spans.  This allows direct composition over a pre-existing bitmap  */
-  /*    through user-provided callbacks to perform the span drawing and    */
-  /*    composition.    Not supported by the monochrome rasterizer.        */
-  /*                                                                       */
-  typedef struct  FT_Raster_Params_
-  {
-    const FT_Bitmap*        target;
-    const void*             source;
-    int                     flags;
-    FT_SpanFunc             gray_spans;
-    FT_SpanFunc             black_spans;  /* unused */
-    FT_Raster_BitTest_Func  bit_test;     /* unused */
-    FT_Raster_BitSet_Func   bit_set;      /* unused */
-    void*                   user;
-    FT_BBox                 clip_box;
-
-  } FT_Raster_Params;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_NewFunc                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to create a new raster object.                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the memory allocator.                        */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    raster :: A handle to the new raster object.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The `memory' parameter is a typeless pointer in order to avoid     */
-  /*    un-wanted dependencies on the rest of the FreeType code.  In       */
-  /*    practice, it is an @FT_Memory object, i.e., a handle to the        */
-  /*    standard FreeType memory allocator.  However, this field can be    */
-  /*    completely ignored by a given raster implementation.               */
-  /*                                                                       */
-  typedef int
-  (*FT_Raster_NewFunc)( void*       memory,
-                        FT_Raster*  raster );
-
-#define FT_Raster_New_Func  FT_Raster_NewFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_DoneFunc                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to destroy a given raster object.                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    raster :: A handle to the raster object.                           */
-  /*                                                                       */
-  typedef void
-  (*FT_Raster_DoneFunc)( FT_Raster  raster );
-
-#define FT_Raster_Done_Func  FT_Raster_DoneFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_ResetFunc                                                */
-  /*                                                                       */
-  /* <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.                                  */
-  /*                                                                       */
-  /*    This function is called each time the render pool changes, or just */
-  /*    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_size :: The size in bytes of the render pool.                 */
-  /*                                                                       */
-  /* <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).                                 */
-  /*                                                                       */
-  typedef void
-  (*FT_Raster_ResetFunc)( FT_Raster       raster,
-                          unsigned char*  pool_base,
-                          unsigned long   pool_size );
-
-#define FT_Raster_Reset_Func  FT_Raster_ResetFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_SetModeFunc                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is a generic facility to change modes or attributes  */
-  /*    in a given raster.  This can be used for debugging purposes, or    */
-  /*    simply to allow implementation-specific `features' in a given      */
-  /*    raster module.                                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    raster :: A handle to the new raster object.                       */
-  /*                                                                       */
-  /*    mode   :: A 4-byte tag used to name the mode or property.          */
-  /*                                                                       */
-  /*    args   :: A pointer to the new mode/property to use.               */
-  /*                                                                       */
-  typedef int
-  (*FT_Raster_SetModeFunc)( FT_Raster      raster,
-                            unsigned long  mode,
-                            void*          args );
-
-#define FT_Raster_Set_Mode_Func  FT_Raster_SetModeFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Raster_RenderFunc                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Invoke a given raster to scan-convert a given glyph image into a   */
-  /*    target bitmap.                                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    raster :: A handle to the raster object.                           */
-  /*                                                                       */
-  /*    params :: A pointer to an @FT_Raster_Params structure used to      */
-  /*              store the rendering parameters.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0~means success.                                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The exact format of the source image depends on the raster's glyph */
-  /*    format defined in its @FT_Raster_Funcs structure.  It can be an    */
-  /*    @FT_Outline or anything else in order to support a large array of  */
-  /*    glyph formats.                                                     */
-  /*                                                                       */
-  /*    Note also that the render function can fail and return a           */
-  /*    `FT_Err_Unimplemented_Feature' error code if the raster used does  */
-  /*    not support direct composition.                                    */
-  /*                                                                       */
-  /*    XXX: For now, the standard raster doesn't support direct           */
-  /*         composition but this should change for the final release (see */
-  /*         the files `demos/src/ftgrays.c' and `demos/src/ftgrays2.c'    */
-  /*         for examples of distinct implementations that support direct  */
-  /*         composition).                                                 */
-  /*                                                                       */
-  typedef int
-  (*FT_Raster_RenderFunc)( FT_Raster                raster,
-                           const FT_Raster_Params*  params );
-
-#define FT_Raster_Render_Func  FT_Raster_RenderFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Raster_Funcs                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   A structure used to describe a given raster class to the library.   */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    glyph_format  :: The supported glyph format for this raster.       */
-  /*                                                                       */
-  /*    raster_new    :: The raster constructor.                           */
-  /*                                                                       */
-  /*    raster_reset  :: Used to reset the render pool within the raster.  */
-  /*                                                                       */
-  /*    raster_render :: A function to render a glyph into a given bitmap. */
-  /*                                                                       */
-  /*    raster_done   :: The raster destructor.                            */
-  /*                                                                       */
-  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;
-    FT_Raster_RenderFunc   raster_render;
-    FT_Raster_DoneFunc     raster_done;
-
-  } FT_Raster_Funcs;
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTIMAGE_H_ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/ftincrem.h b/third_party/freetype/include/freetype/ftincrem.h
deleted file mode 100644
index f6ae2ba..0000000
--- a/third_party/freetype/include/freetype/ftincrem.h
+++ /dev/null
@@ -1,354 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftincrem.h                                                             */
-/*                                                                         */
-/*    FreeType incremental loading (specification).                        */
-/*                                                                         */
-/*  Copyright 2002-2017 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 FTINCREM_H_
-#define FTINCREM_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:
-   *    incremental
-   *
-   * @title:
-   *    Incremental Loading
-   *
-   * @abstract:
-   *    Custom Glyph Loading.
-   *
-   * @description:
-   *   This section contains various functions used to perform so-called
-   *   `incremental' glyph loading.  This is a mode where all glyphs loaded
-   *   from a given @FT_Face are provided by the client application.
-   *
-   *   Apart from that, all other tables are loaded normally from the font
-   *   file.  This mode is useful when FreeType is used within another
-   *   engine, e.g., a PostScript Imaging Processor.
-   *
-   *   To enable this mode, you must use @FT_Open_Face, passing an
-   *   @FT_Parameter with the @FT_PARAM_TAG_INCREMENTAL tag and an
-   *   @FT_Incremental_Interface value.  See the comments for
-   *   @FT_Incremental_InterfaceRec for an example.
-   *
-   */
-
-
-  /***************************************************************************
-   *
-   * @type:
-   *   FT_Incremental
-   *
-   * @description:
-   *   An opaque type describing a user-provided object used to implement
-   *   `incremental' glyph loading within FreeType.  This is used to support
-   *   embedded fonts in certain environments (e.g., PostScript interpreters),
-   *   where the glyph data isn't in the font file, or must be overridden by
-   *   different values.
-   *
-   * @note:
-   *   It is up to client applications to create and implement @FT_Incremental
-   *   objects, as long as they provide implementations for the methods
-   *   @FT_Incremental_GetGlyphDataFunc, @FT_Incremental_FreeGlyphDataFunc
-   *   and @FT_Incremental_GetGlyphMetricsFunc.
-   *
-   *   See the description of @FT_Incremental_InterfaceRec to understand how
-   *   to use incremental objects with FreeType.
-   *
-   */
-  typedef struct FT_IncrementalRec_*  FT_Incremental;
-
-
-  /***************************************************************************
-   *
-   * @struct:
-   *   FT_Incremental_MetricsRec
-   *
-   * @description:
-   *   A small structure used to contain the basic glyph metrics returned
-   *   by the @FT_Incremental_GetGlyphMetricsFunc method.
-   *
-   * @fields:
-   *   bearing_x ::
-   *     Left bearing, in font units.
-   *
-   *   bearing_y ::
-   *     Top bearing, in font units.
-   *
-   *   advance ::
-   *     Horizontal component of glyph advance, in font units.
-   *
-   *   advance_v ::
-   *     Vertical component of glyph advance, in font units.
-   *
-   * @note:
-   *   These correspond to horizontal or vertical metrics depending on the
-   *   value of the `vertical' argument to the function
-   *   @FT_Incremental_GetGlyphMetricsFunc.
-   *
-   */
-  typedef struct  FT_Incremental_MetricsRec_
-  {
-    FT_Long  bearing_x;
-    FT_Long  bearing_y;
-    FT_Long  advance;
-    FT_Long  advance_v;     /* since 2.3.12 */
-
-  } FT_Incremental_MetricsRec;
-
-
-  /***************************************************************************
-   *
-   * @struct:
-   *   FT_Incremental_Metrics
-   *
-   * @description:
-   *   A handle to an @FT_Incremental_MetricsRec structure.
-   *
-   */
-   typedef struct FT_Incremental_MetricsRec_*  FT_Incremental_Metrics;
-
-
-  /***************************************************************************
-   *
-   * @type:
-   *   FT_Incremental_GetGlyphDataFunc
-   *
-   * @description:
-   *   A function called by FreeType to access a given glyph's data bytes
-   *   during @FT_Load_Glyph or @FT_Load_Char if incremental loading is
-   *   enabled.
-   *
-   *   Note that the format of the glyph's data bytes depends on the font
-   *   file format.  For TrueType, it must correspond to the raw bytes within
-   *   the `glyf' table.  For PostScript formats, it must correspond to the
-   *   *unencrypted* charstring bytes, without any `lenIV' header.  It is
-   *   undefined for any other format.
-   *
-   * @input:
-   *   incremental ::
-   *     Handle to an opaque @FT_Incremental handle provided by the client
-   *     application.
-   *
-   *   glyph_index ::
-   *     Index of relevant glyph.
-   *
-   * @output:
-   *   adata ::
-   *     A structure describing the returned glyph data bytes (which will be
-   *     accessed as a read-only byte block).
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   If this function returns successfully the method
-   *   @FT_Incremental_FreeGlyphDataFunc will be called later to release
-   *   the data bytes.
-   *
-   *   Nested calls to @FT_Incremental_GetGlyphDataFunc can happen for
-   *   compound glyphs.
-   *
-   */
-  typedef FT_Error
-  (*FT_Incremental_GetGlyphDataFunc)( FT_Incremental  incremental,
-                                      FT_UInt         glyph_index,
-                                      FT_Data*        adata );
-
-
-  /***************************************************************************
-   *
-   * @type:
-   *   FT_Incremental_FreeGlyphDataFunc
-   *
-   * @description:
-   *   A function used to release the glyph data bytes returned by a
-   *   successful call to @FT_Incremental_GetGlyphDataFunc.
-   *
-   * @input:
-   *   incremental ::
-   *     A handle to an opaque @FT_Incremental handle provided by the client
-   *     application.
-   *
-   *   data ::
-   *     A structure describing the glyph data bytes (which will be accessed
-   *     as a read-only byte block).
-   *
-   */
-  typedef void
-  (*FT_Incremental_FreeGlyphDataFunc)( FT_Incremental  incremental,
-                                       FT_Data*        data );
-
-
-  /***************************************************************************
-   *
-   * @type:
-   *   FT_Incremental_GetGlyphMetricsFunc
-   *
-   * @description:
-   *   A function used to retrieve the basic metrics of a given glyph index
-   *   before accessing its data.  This is necessary because, in certain
-   *   formats like TrueType, the metrics are stored in a different place from
-   *   the glyph images proper.
-   *
-   * @input:
-   *   incremental ::
-   *     A handle to an opaque @FT_Incremental handle provided by the client
-   *     application.
-   *
-   *   glyph_index ::
-   *     Index of relevant glyph.
-   *
-   *   vertical ::
-   *     If true, return vertical metrics.
-   *
-   *   ametrics ::
-   *     This parameter is used for both input and output.
-   *     The original glyph metrics, if any, in font units.  If metrics are
-   *     not available all the values must be set to zero.
-   *
-   * @output:
-   *   ametrics ::
-   *     The replacement glyph metrics in font units.
-   *
-   */
-  typedef FT_Error
-  (*FT_Incremental_GetGlyphMetricsFunc)
-                      ( FT_Incremental              incremental,
-                        FT_UInt                     glyph_index,
-                        FT_Bool                     vertical,
-                        FT_Incremental_MetricsRec  *ametrics );
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Incremental_FuncsRec
-   *
-   * @description:
-   *   A table of functions for accessing fonts that load data
-   *   incrementally.  Used in @FT_Incremental_InterfaceRec.
-   *
-   * @fields:
-   *   get_glyph_data ::
-   *     The function to get glyph data.  Must not be null.
-   *
-   *   free_glyph_data ::
-   *     The function to release glyph data.  Must not be null.
-   *
-   *   get_glyph_metrics ::
-   *     The function to get glyph metrics.  May be null if the font does
-   *     not provide overriding glyph metrics.
-   *
-   */
-  typedef struct  FT_Incremental_FuncsRec_
-  {
-    FT_Incremental_GetGlyphDataFunc     get_glyph_data;
-    FT_Incremental_FreeGlyphDataFunc    free_glyph_data;
-    FT_Incremental_GetGlyphMetricsFunc  get_glyph_metrics;
-
-  } FT_Incremental_FuncsRec;
-
-
-  /***************************************************************************
-   *
-   * @struct:
-   *   FT_Incremental_InterfaceRec
-   *
-   * @description:
-   *   A structure to be used with @FT_Open_Face to indicate that the user
-   *   wants to support incremental glyph loading.  You should use it with
-   *   @FT_PARAM_TAG_INCREMENTAL as in the following example:
-   *
-   *     {
-   *       FT_Incremental_InterfaceRec  inc_int;
-   *       FT_Parameter                 parameter;
-   *       FT_Open_Args                 open_args;
-   *
-   *
-   *       // set up incremental descriptor
-   *       inc_int.funcs  = my_funcs;
-   *       inc_int.object = my_object;
-   *
-   *       // set up optional parameter
-   *       parameter.tag  = FT_PARAM_TAG_INCREMENTAL;
-   *       parameter.data = &inc_int;
-   *
-   *       // set up FT_Open_Args structure
-   *       open_args.flags      = FT_OPEN_PATHNAME | FT_OPEN_PARAMS;
-   *       open_args.pathname   = my_font_pathname;
-   *       open_args.num_params = 1;
-   *       open_args.params     = &parameter; // we use one optional argument
-   *
-   *       // open the font
-   *       error = FT_Open_Face( library, &open_args, index, &face );
-   *       ...
-   *     }
-   *
-   */
-  typedef struct  FT_Incremental_InterfaceRec_
-  {
-    const FT_Incremental_FuncsRec*  funcs;
-    FT_Incremental                  object;
-
-  } FT_Incremental_InterfaceRec;
-
-
-  /***************************************************************************
-   *
-   * @type:
-   *   FT_Incremental_Interface
-   *
-   * @description:
-   *   A pointer to an @FT_Incremental_InterfaceRec structure.
-   *
-   */
-  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_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftlcdfil.h b/third_party/freetype/include/freetype/ftlcdfil.h
deleted file mode 100644
index 928bb0f..0000000
--- a/third_party/freetype/include/freetype/ftlcdfil.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlcdfil.h                                                             */
-/*                                                                         */
-/*    FreeType API for color filtering of subpixel bitmap glyphs           */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 2006-2017 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
-
-#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:
-   *   Subpixel 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.
-   *
-   *   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 and explicitly call @FT_Library_SetLcdFilter
-   *   to enable it.
-   *
-   *   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.
-   *
-   * @since:
-   *   2.4.0
-   */
-  FT_EXPORT( FT_Error )
-  FT_Library_SetLcdFilterWeights( FT_Library      library,
-                                  unsigned char  *weights );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTLCDFIL_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftlist.h b/third_party/freetype/include/freetype/ftlist.h
deleted file mode 100644
index 5309cb1..0000000
--- a/third_party/freetype/include/freetype/ftlist.h
+++ /dev/null
@@ -1,276 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlist.h                                                               */
-/*                                                                         */
-/*    Generic list support for FreeType (specification).                   */
-/*                                                                         */
-/*  Copyright 1996-2017 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 implements functions relative to list processing.  Its     */
-  /*  data structures are defined in `freetype.h'.                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTLIST_H_
-#define FTLIST_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>                                                             */
-  /*    list_processing                                                    */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    List Processing                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Simple management of lists.                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains various definitions related to list          */
-  /*    processing using doubly-linked nodes.                              */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_List                                                            */
-  /*    FT_ListNode                                                        */
-  /*    FT_ListRec                                                         */
-  /*    FT_ListNodeRec                                                     */
-  /*                                                                       */
-  /*    FT_List_Add                                                        */
-  /*    FT_List_Insert                                                     */
-  /*    FT_List_Find                                                       */
-  /*    FT_List_Remove                                                     */
-  /*    FT_List_Up                                                         */
-  /*    FT_List_Iterate                                                    */
-  /*    FT_List_Iterator                                                   */
-  /*    FT_List_Finalize                                                   */
-  /*    FT_List_Destructor                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Find                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Find the list node for a given listed object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    list :: A pointer to the parent list.                              */
-  /*    data :: The address of the listed object.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    List node.  NULL if it wasn't found.                               */
-  /*                                                                       */
-  FT_EXPORT( FT_ListNode )
-  FT_List_Find( FT_List  list,
-                void*    data );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Add                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Append an element to the end of a list.                            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    list :: A pointer to the parent list.                              */
-  /*    node :: The node to append.                                        */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_List_Add( FT_List      list,
-               FT_ListNode  node );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Insert                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Insert an element at the head of a list.                           */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    list :: A pointer to parent list.                                  */
-  /*    node :: The node to insert.                                        */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_List_Insert( FT_List      list,
-                  FT_ListNode  node );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Remove                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Remove a node from a list.  This function doesn't check whether    */
-  /*    the node is in the list!                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    node :: The node to remove.                                        */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    list :: A pointer to the parent list.                              */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_List_Remove( FT_List      list,
-                  FT_ListNode  node );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Up                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Move a node to the head/top of a list.  Used to maintain LRU       */
-  /*    lists.                                                             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    list :: A pointer to the parent list.                              */
-  /*    node :: The node to move.                                          */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_List_Up( FT_List      list,
-              FT_ListNode  node );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_List_Iterator                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An FT_List iterator function that is called during a list parse    */
-  /*    by @FT_List_Iterate.                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    node :: The current iteration list node.                           */
-  /*                                                                       */
-  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */
-  /*            Can be used to point to the iteration's state.             */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_List_Iterator)( FT_ListNode  node,
-                       void*        user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Iterate                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Parse a list and calls a given iterator function on each element.  */
-  /*    Note that parsing is stopped as soon as one of the iterator calls  */
-  /*    returns a non-zero value.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    list     :: A handle to the list.                                  */
-  /*    iterator :: An iterator function, called on each node of the list. */
-  /*    user     :: A user-supplied field that is passed as the second     */
-  /*                argument to the iterator.                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The result (a FreeType error code) of the last iterator call.      */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_List_Iterate( FT_List           list,
-                   FT_List_Iterator  iterator,
-                   void*             user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_List_Destructor                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An @FT_List iterator function that is called during a list         */
-  /*    finalization by @FT_List_Finalize to destroy all elements in a     */
-  /*    given list.                                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    system :: The current system object.                               */
-  /*                                                                       */
-  /*    data   :: The current object to destroy.                           */
-  /*                                                                       */
-  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */
-  /*              be used to point to the iteration's state.               */
-  /*                                                                       */
-  typedef void
-  (*FT_List_Destructor)( FT_Memory  memory,
-                         void*      data,
-                         void*      user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_List_Finalize                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy all elements in the list as well as the list itself.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    list    :: A handle to the list.                                   */
-  /*                                                                       */
-  /*    destroy :: A list destructor that will be applied to each element  */
-  /*               of the list.  Set this to NULL if not needed.           */
-  /*                                                                       */
-  /*    memory  :: The current memory object that handles deallocation.    */
-  /*                                                                       */
-  /*    user    :: A user-supplied field that is passed as the last        */
-  /*               argument to the destructor.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function expects that all nodes added by @FT_List_Add or      */
-  /*    @FT_List_Insert have been dynamically allocated.                   */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_List_Finalize( FT_List             list,
-                    FT_List_Destructor  destroy,
-                    FT_Memory           memory,
-                    void*               user );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTLIST_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftmm.h b/third_party/freetype/include/freetype/ftmm.h
deleted file mode 100644
index 96dd625..0000000
--- a/third_party/freetype/include/freetype/ftmm.h
+++ /dev/null
@@ -1,489 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmm.h                                                                 */
-/*                                                                         */
-/*    FreeType Multiple Master font interface (specification).             */
-/*                                                                         */
-/*  Copyright 1996-2017 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 style 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 style.                   */
-  /*              This is an array with one entry for each axis.           */
-  /*                                                                       */
-  /*    strid  :: The entry in `name' table identifying this style.        */
-  /*                                                                       */
-  /*    psid   :: The entry in `name' table identifying a PostScript name  */
-  /*              for this style.                                          */
-  /*                                                                       */
-  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 a 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'.               */
-  /*                                                                       */
-  /*                       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 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 `free' 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_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.                             */
-  /*                                                                       */
-  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.                             */
-  /*                                                                       */
-  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.                             */
-  /*                                                                       */
-  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.                             */
-  /*                                                                       */
-  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.                             */
-  /*                                                                       */
-  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.              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Get_Var_Blend_Coordinates( FT_Face    face,
-                                FT_UInt    num_coords,
-                                FT_Fixed*  coords );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTMM_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftmodapi.h b/third_party/freetype/include/freetype/ftmodapi.h
deleted file mode 100644
index d5bf376..0000000
--- a/third_party/freetype/include/freetype/ftmodapi.h
+++ /dev/null
@@ -1,667 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmodapi.h                                                             */
-/*                                                                         */
-/*    FreeType modules public interface (specification).                   */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTMODAPI_H_
-#define FTMODAPI_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>                                                             */
-  /*    module_management                                                  */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Module Management                                                  */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    How to add, upgrade, remove, and control modules from FreeType.    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The definitions below are used to manage modules within FreeType.  */
-  /*    Modules can be added, upgraded, and removed at runtime.            */
-  /*    Additionally, some module properties can be controlled also.       */
-  /*                                                                       */
-  /*    Here is a list of possible values of the `module_name' field in    */
-  /*    the @FT_Module_Class structure.                                    */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      autofitter                                                       */
-  /*      bdf                                                              */
-  /*      cff                                                              */
-  /*      gxvalid                                                          */
-  /*      otvalid                                                          */
-  /*      pcf                                                              */
-  /*      pfr                                                              */
-  /*      psaux                                                            */
-  /*      pshinter                                                         */
-  /*      psnames                                                          */
-  /*      raster1                                                          */
-  /*      sfnt                                                             */
-  /*      smooth, smooth-lcd, smooth-lcdv                                  */
-  /*      truetype                                                         */
-  /*      type1                                                            */
-  /*      type42                                                           */
-  /*      t1cid                                                            */
-  /*      winfonts                                                         */
-  /*    }                                                                  */
-  /*                                                                       */
-  /*    Note that the FreeType Cache sub-system is not a FreeType module.  */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Module                                                          */
-  /*    FT_Module_Constructor                                              */
-  /*    FT_Module_Destructor                                               */
-  /*    FT_Module_Requester                                                */
-  /*    FT_Module_Class                                                    */
-  /*                                                                       */
-  /*    FT_Add_Module                                                      */
-  /*    FT_Get_Module                                                      */
-  /*    FT_Remove_Module                                                   */
-  /*    FT_Add_Default_Modules                                             */
-  /*                                                                       */
-  /*    FT_Property_Set                                                    */
-  /*    FT_Property_Get                                                    */
-  /*                                                                       */
-  /*    FT_New_Library                                                     */
-  /*    FT_Done_Library                                                    */
-  /*    FT_Reference_Library                                               */
-  /*                                                                       */
-  /*    FT_Renderer                                                        */
-  /*    FT_Renderer_Class                                                  */
-  /*                                                                       */
-  /*    FT_Get_Renderer                                                    */
-  /*    FT_Set_Renderer                                                    */
-  /*                                                                       */
-  /*    FT_Set_Debug_Hook                                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* module bit flags */
-#define FT_MODULE_FONT_DRIVER         1  /* this module is a font driver  */
-#define FT_MODULE_RENDERER            2  /* this module is a renderer     */
-#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      */
-                                              /* scalable fonts           */
-#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  */
-                                              /* own hinter               */
-#define FT_MODULE_DRIVER_HINTS_LIGHTLY 0x800  /* the driver's hinter      */
-                                              /* produces LIGHT hints     */
-
-
-  /* deprecated values */
-#define ft_module_font_driver         FT_MODULE_FONT_DRIVER
-#define ft_module_renderer            FT_MODULE_RENDERER
-#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_hints_lightly  FT_MODULE_DRIVER_HINTS_LIGHTLY
-
-
-  typedef FT_Pointer  FT_Module_Interface;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Module_Constructor                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to initialize (not create) a new module object.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    module :: The module to initialize.                                */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_Module_Constructor)( FT_Module  module );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Module_Destructor                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to finalize (not destroy) a given module object.   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    module :: The module to finalize.                                  */
-  /*                                                                       */
-  typedef void
-  (*FT_Module_Destructor)( FT_Module  module );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Module_Requester                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to query a given module for a specific interface.  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    module :: The module to be searched.                               */
-  /*                                                                       */
-  /*    name ::   The name of the interface in the module.                 */
-  /*                                                                       */
-  typedef FT_Module_Interface
-  (*FT_Module_Requester)( FT_Module    module,
-                          const char*  name );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Module_Class                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The module class descriptor.                                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    module_flags    :: Bit flags describing the module.                */
-  /*                                                                       */
-  /*    module_size     :: The size of one module object/instance in       */
-  /*                       bytes.                                          */
-  /*                                                                       */
-  /*    module_name     :: The name of the module.                         */
-  /*                                                                       */
-  /*    module_version  :: The version, as a 16.16 fixed number            */
-  /*                       (major.minor).                                  */
-  /*                                                                       */
-  /*    module_requires :: The version of FreeType this module requires,   */
-  /*                       as a 16.16 fixed number (major.minor).  Starts  */
-  /*                       at version 2.0, i.e., 0x20000.                  */
-  /*                                                                       */
-  /*    module_init     :: The initializing function.                      */
-  /*                                                                       */
-  /*    module_done     :: The finalizing function.                        */
-  /*                                                                       */
-  /*    get_interface   :: The interface requesting function.              */
-  /*                                                                       */
-  typedef struct  FT_Module_Class_
-  {
-    FT_ULong               module_flags;
-    FT_Long                module_size;
-    const FT_String*       module_name;
-    FT_Fixed               module_version;
-    FT_Fixed               module_requires;
-
-    const void*            module_interface;
-
-    FT_Module_Constructor  module_init;
-    FT_Module_Destructor   module_done;
-    FT_Module_Requester    get_interface;
-
-  } FT_Module_Class;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Add_Module                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Add a new module to a given library instance.                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library :: A handle to the library object.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    clazz   :: A pointer to class descriptor for the module.           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    An error will be returned if a module already exists by that name, */
-  /*    or if the module requires a version of FreeType that is too great. */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Add_Module( FT_Library              library,
-                 const FT_Module_Class*  clazz );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Module                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Find a module by its name.                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library     :: A handle to the library object.                     */
-  /*                                                                       */
-  /*    module_name :: The module's name (as an ASCII string).             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A module handle.  0~if none was found.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    FreeType's internal modules aren't documented very well, and you   */
-  /*    should look up the source code for details.                        */
-  /*                                                                       */
-  FT_EXPORT( FT_Module )
-  FT_Get_Module( FT_Library   library,
-                 const char*  module_name );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Remove_Module                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Remove a given module from a library instance.                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library :: A handle to a library object.                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    module  :: A handle to a module object.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The module object is destroyed by the function in case of success. */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Remove_Module( FT_Library  library,
-                    FT_Module   module );
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Property_Set
-   *
-   * @description:
-   *    Set a property for a given module.
-   *
-   * @input:
-   *    library ::
-   *       A handle to the library the module is part of.
-   *
-   *    module_name ::
-   *       The module name.
-   *
-   *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
-   *
-   *       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.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *    If `module_name' isn't a valid module name, or `property_name'
-   *    doesn't specify a valid property, or if `value' doesn't represent a
-   *    valid value for the given property, an error is returned.
-   *
-   *    The following example sets property `bar' (a simple integer) in
-   *    module `foo' to value~1.
-   *
-   *    {
-   *      FT_UInt  bar;
-   *
-   *
-   *      bar = 1;
-   *      FT_Property_Set( library, "foo", "bar", &bar );
-   *    }
-   *
-   *    Note that the FreeType Cache sub-system doesn't recognize module
-   *    property changes.  To avoid glyph lookup confusion within the cache
-   *    you should call @FTC_Manager_Reset to completely flush the cache if
-   *    a module property gets changed after @FTC_Manager_New has been
-   *    called.
-   *
-   *    It is not possible to set properties of the FreeType Cache
-   *    sub-system itself with FT_Property_Set; use @FTC_Property_Set
-   *    instead.
-   *
-   *  @since:
-   *    2.4.11
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FT_Property_Set( FT_Library        library,
-                   const FT_String*  module_name,
-                   const FT_String*  property_name,
-                   const void*       value );
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Property_Get
-   *
-   * @description:
-   *    Get a module's property value.
-   *
-   * @input:
-   *    library ::
-   *       A handle to the library the module is part of.
-   *
-   *    module_name ::
-   *       The module name.
-   *
-   *    property_name ::
-   *       The property name.  Properties are described in the `Synopsis'
-   *       subsection of the module's documentation.
-   *
-   * @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.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *    If `module_name' isn't a valid module name, or `property_name'
-   *    doesn't specify a valid property, or if `value' doesn't represent a
-   *    valid value for the given property, an error is returned.
-   *
-   *    The following example gets property `baz' (a range) in module `foo'.
-   *
-   *    {
-   *      typedef  range_
-   *      {
-   *        FT_Int32  min;
-   *        FT_Int32  max;
-   *
-   *      } range;
-   *
-   *      range  baz;
-   *
-   *
-   *      FT_Property_Get( library, "foo", "baz", &baz );
-   *    }
-   *
-   *    It is not possible to retrieve properties of the FreeType Cache
-   *    sub-system with FT_Property_Get; use @FTC_Property_Get instead.
-   *
-   *  @since:
-   *    2.4.11
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FT_Property_Get( FT_Library        library,
-                   const FT_String*  module_name,
-                   const FT_String*  property_name,
-                   void*             value );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Reference_Library                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A counter gets initialized to~1 at the time an @FT_Library         */
-  /*    structure is created.  This function increments the counter.       */
-  /*    @FT_Done_Library then only destroys a library if the counter is~1, */
-  /*    otherwise it simply decrements the counter.                        */
-  /*                                                                       */
-  /*    This function helps in managing life-cycles of structures that     */
-  /*    reference @FT_Library objects.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to a target library object.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Since>                                                               */
-  /*    2.4.2                                                              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Reference_Library( FT_Library  library );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Library                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used to create a new FreeType library instance    */
-  /*    from a given memory object.  It is thus possible to use libraries  */
-  /*    with distinct memory allocators within the same program.  Note,    */
-  /*    however, that the used @FT_Memory structure is expected to remain  */
-  /*    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.   */
-  /*                                                                       */
-  /*    Don't use @FT_Done_FreeType but @FT_Done_Library to destroy a      */
-  /*    library instance.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory   :: A handle to the original memory object.                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    alibrary :: A pointer to handle of a new library object.           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    See the discussion of reference counters in the description of     */
-  /*    @FT_Reference_Library.                                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Library( FT_Memory    memory,
-                  FT_Library  *alibrary );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Library                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Discard a given library object.  This closes all drivers and       */
-  /*    discards all resource objects.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to the target library.                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    See the discussion of reference counters in the description of     */
-  /*    @FT_Reference_Library.                                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Done_Library( FT_Library  library );
-
-  /* */
-
-  typedef void
-  (*FT_DebugHook_Func)( void*  arg );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Debug_Hook                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Set a debug hook function for debugging the interpreter of a font  */
-  /*    format.                                                            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    hook_index :: The index of the debug hook.  You should use the     */
-  /*                  values defined in `ftobjs.h', e.g.,                  */
-  /*                  `FT_DEBUG_HOOK_TRUETYPE'.                            */
-  /*                                                                       */
-  /*    debug_hook :: The function used to debug the interpreter.          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Currently, four debug hook slots are available, but only two (for  */
-  /*    the TrueType and the Type~1 interpreter) are defined.              */
-  /*                                                                       */
-  /*    Since the internal headers of FreeType are no longer installed,    */
-  /*    the symbol `FT_DEBUG_HOOK_TRUETYPE' isn't available publicly.      */
-  /*    This is a bug and will be fixed in a forthcoming release.          */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Set_Debug_Hook( FT_Library         library,
-                     FT_UInt            hook_index,
-                     FT_DebugHook_Func  debug_hook );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Add_Default_Modules                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Add the set of default drivers to a given library object.          */
-  /*    This is only useful when you create a library object with          */
-  /*    @FT_New_Library (usually to plug a custom memory manager).         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library :: A handle to a new library object.                       */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Add_Default_Modules( FT_Library  library );
-
-
-
-  /**************************************************************************
-   *
-   * @section:
-   *   truetype_engine
-   *
-   * @title:
-   *   The TrueType Engine
-   *
-   * @abstract:
-   *   TrueType bytecode support.
-   *
-   * @description:
-   *   This section contains a function used to query the level of TrueType
-   *   bytecode support compiled in this version of the library.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   *  @enum:
-   *     FT_TrueTypeEngineType
-   *
-   *  @description:
-   *     A list of values describing which kind of TrueType bytecode
-   *     engine is implemented in a given FT_Library instance.  It is used
-   *     by the @FT_Get_TrueType_Engine_Type function.
-   *
-   *  @values:
-   *     FT_TRUETYPE_ENGINE_TYPE_NONE ::
-   *       The library doesn't implement any kind of bytecode interpreter.
-   *
-   *     FT_TRUETYPE_ENGINE_TYPE_UNPATENTED ::
-   *       Deprecated and removed.
-   *
-   *     FT_TRUETYPE_ENGINE_TYPE_PATENTED ::
-   *       The library implements a bytecode interpreter that covers
-   *       the full instruction set of the TrueType virtual machine (this
-   *       was governed by patents until May 2010, hence the name).
-   *
-   *  @since:
-   *     2.2
-   *
-   */
-  typedef enum  FT_TrueTypeEngineType_
-  {
-    FT_TRUETYPE_ENGINE_TYPE_NONE = 0,
-    FT_TRUETYPE_ENGINE_TYPE_UNPATENTED,
-    FT_TRUETYPE_ENGINE_TYPE_PATENTED
-
-  } FT_TrueTypeEngineType;
-
-
-  /**************************************************************************
-   *
-   *  @func:
-   *     FT_Get_TrueType_Engine_Type
-   *
-   *  @description:
-   *     Return an @FT_TrueTypeEngineType value to indicate which level of
-   *     the TrueType virtual machine a given library instance supports.
-   *
-   *  @input:
-   *     library ::
-   *       A library instance.
-   *
-   *  @return:
-   *     A value indicating which level is supported.
-   *
-   *  @since:
-   *     2.2
-   *
-   */
-  FT_EXPORT( FT_TrueTypeEngineType )
-  FT_Get_TrueType_Engine_Type( FT_Library  library );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTMODAPI_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftmoderr.h b/third_party/freetype/include/freetype/ftmoderr.h
deleted file mode 100644
index 7f60837..0000000
--- a/third_party/freetype/include/freetype/ftmoderr.h
+++ /dev/null
@@ -1,194 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmoderr.h                                                             */
-/*                                                                         */
-/*    FreeType module error offsets (specification).                       */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the FreeType module error codes.          */
-  /*                                                                       */
-  /* If the macro FT_CONFIG_OPTION_USE_MODULE_ERRORS in `ftoption.h' is    */
-  /* set, the lower byte of an error value identifies the error code as    */
-  /* usual.  In addition, the higher byte identifies the module.  For      */
-  /* example, the error `FT_Err_Invalid_File_Format' has value 0x0003, the */
-  /* error `TT_Err_Invalid_File_Format' has value 0x1303, the error        */
-  /* `T1_Err_Invalid_File_Format' has value 0x1403, etc.                   */
-  /*                                                                       */
-  /* Note that `FT_Err_Ok', `TT_Err_Ok', etc. are always equal to zero,    */
-  /* including the high byte.                                              */
-  /*                                                                       */
-  /* If FT_CONFIG_OPTION_USE_MODULE_ERRORS isn't set, the higher byte of   */
-  /* an error value is set to zero.                                        */
-  /*                                                                       */
-  /* To hide the various `XXX_Err_' prefixes in the source code, FreeType  */
-  /* provides some macros in `fttypes.h'.                                  */
-  /*                                                                       */
-  /*   FT_ERR( err )                                                       */
-  /*     Add current error module prefix (as defined with the              */
-  /*     `FT_ERR_PREFIX' macro) to `err'.  For example, in the BDF module  */
-  /*     the line                                                          */
-  /*                                                                       */
-  /*       error = FT_ERR( Invalid_Outline );                              */
-  /*                                                                       */
-  /*     expands to                                                        */
-  /*                                                                       */
-  /*       error = BDF_Err_Invalid_Outline;                                */
-  /*                                                                       */
-  /*     For simplicity, you can always use `FT_Err_Ok' directly instead   */
-  /*     of `FT_ERR( Ok )'.                                                */
-  /*                                                                       */
-  /*   FT_ERR_EQ( errcode, err )                                           */
-  /*   FT_ERR_NEQ( errcode, err )                                          */
-  /*     Compare error code `errcode' with the error `err' for equality    */
-  /*     and inequality, respectively.  Example:                           */
-  /*                                                                       */
-  /*       if ( FT_ERR_EQ( error, Invalid_Outline ) )                      */
-  /*         ...                                                           */
-  /*                                                                       */
-  /*     Using this macro you don't have to think about error prefixes.    */
-  /*     Of course, if module errors are not active, the above example is  */
-  /*     the same as                                                       */
-  /*                                                                       */
-  /*       if ( error == FT_Err_Invalid_Outline )                          */
-  /*         ...                                                           */
-  /*                                                                       */
-  /*   FT_ERROR_BASE( errcode )                                            */
-  /*   FT_ERROR_MODULE( errcode )                                          */
-  /*     Get base error and module error code, respectively.               */
-  /*                                                                       */
-  /*                                                                       */
-  /* It can also be used to create a module error message table easily     */
-  /* with something like                                                   */
-  /*                                                                       */
-  /*   {                                                                   */
-  /*     #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 } };                      */
-  /*                                                                       */
-  /*     const struct                                                      */
-  /*     {                                                                 */
-  /*       int          mod_err_offset;                                    */
-  /*       const char*  mod_err_msg                                        */
-  /*     } ft_mod_errors[] =                                               */
-  /*                                                                       */
-  /*     #include FT_MODULE_ERRORS_H                                       */
-  /*   }                                                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTMODERR_H_
-#define FTMODERR_H_
-
-
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****                       SETUP MACROS                      *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
-
-
-#undef  FT_NEED_EXTERN_C
-
-#ifndef FT_MODERRDEF
-
-#ifdef FT_CONFIG_OPTION_USE_MODULE_ERRORS
-#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = v,
-#else
-#define FT_MODERRDEF( e, v, s )  FT_Mod_Err_ ## e = 0,
-#endif
-
-#define FT_MODERR_START_LIST  enum {
-#define FT_MODERR_END_LIST    FT_Mod_Err_Max };
-
-#ifdef __cplusplus
-#define FT_NEED_EXTERN_C
-  extern "C" {
-#endif
-
-#endif /* !FT_MODERRDEF */
-
-
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****               LIST MODULE ERROR BASES                   *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
-
-
-#ifdef FT_MODERR_START_LIST
-  FT_MODERR_START_LIST
-#endif
-
-
-  FT_MODERRDEF( Base,      0x000, "base module" )
-  FT_MODERRDEF( Autofit,   0x100, "autofitter module" )
-  FT_MODERRDEF( BDF,       0x200, "BDF module" )
-  FT_MODERRDEF( Bzip2,     0x300, "Bzip2 module" )
-  FT_MODERRDEF( Cache,     0x400, "cache module" )
-  FT_MODERRDEF( CFF,       0x500, "CFF module" )
-  FT_MODERRDEF( CID,       0x600, "CID module" )
-  FT_MODERRDEF( Gzip,      0x700, "Gzip module" )
-  FT_MODERRDEF( LZW,       0x800, "LZW module" )
-  FT_MODERRDEF( OTvalid,   0x900, "OpenType validation module" )
-  FT_MODERRDEF( PCF,       0xA00, "PCF module" )
-  FT_MODERRDEF( PFR,       0xB00, "PFR module" )
-  FT_MODERRDEF( PSaux,     0xC00, "PS auxiliary module" )
-  FT_MODERRDEF( PShinter,  0xD00, "PS hinter module" )
-  FT_MODERRDEF( PSnames,   0xE00, "PS names module" )
-  FT_MODERRDEF( Raster,    0xF00, "raster module" )
-  FT_MODERRDEF( SFNT,     0x1000, "SFNT module" )
-  FT_MODERRDEF( Smooth,   0x1100, "smooth raster module" )
-  FT_MODERRDEF( TrueType, 0x1200, "TrueType module" )
-  FT_MODERRDEF( Type1,    0x1300, "Type 1 module" )
-  FT_MODERRDEF( Type42,   0x1400, "Type 42 module" )
-  FT_MODERRDEF( Winfonts, 0x1500, "Windows FON/FNT module" )
-  FT_MODERRDEF( GXvalid,  0x1600, "GX validation module" )
-
-
-#ifdef FT_MODERR_END_LIST
-  FT_MODERR_END_LIST
-#endif
-
-
-  /*******************************************************************/
-  /*******************************************************************/
-  /*****                                                         *****/
-  /*****                      CLEANUP                            *****/
-  /*****                                                         *****/
-  /*******************************************************************/
-  /*******************************************************************/
-
-
-#ifdef FT_NEED_EXTERN_C
-  }
-#endif
-
-#undef FT_MODERR_START_LIST
-#undef FT_MODERR_END_LIST
-#undef FT_MODERRDEF
-#undef FT_NEED_EXTERN_C
-
-
-#endif /* FTMODERR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftotval.h b/third_party/freetype/include/freetype/ftotval.h
deleted file mode 100644
index b5d27cf..0000000
--- a/third_party/freetype/include/freetype/ftotval.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftotval.h                                                              */
-/*                                                                         */
-/*    FreeType API for validating OpenType tables (specification).         */
-/*                                                                         */
-/*  Copyright 2004-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-/***************************************************************************/
-/*                                                                         */
-/*                                                                         */
-/* Warning: This module might be moved to a different library in the       */
-/*          future to avoid a tight dependency between FreeType and the    */
-/*          OpenType specification.                                        */
-/*                                                                         */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef FTOTVAL_H_
-#define FTOTVAL_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>                                                             */
-  /*    ot_validation                                                      */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    OpenType Validation                                                */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    An API to validate OpenType tables.                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of functions to validate     */
-  /*    some OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).         */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_OpenType_Validate                                               */
-  /*    FT_OpenType_Free                                                   */
-  /*                                                                       */
-  /*    FT_VALIDATE_OTXXX                                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
- /**********************************************************************
-  *
-  * @enum:
-  *    FT_VALIDATE_OTXXX
-  *
-  * @description:
-  *    A list of bit-field constants used with @FT_OpenType_Validate to
-  *    indicate which OpenType tables should be validated.
-  *
-  * @values:
-  *    FT_VALIDATE_BASE ::
-  *      Validate BASE table.
-  *
-  *    FT_VALIDATE_GDEF ::
-  *      Validate GDEF table.
-  *
-  *    FT_VALIDATE_GPOS ::
-  *      Validate GPOS table.
-  *
-  *    FT_VALIDATE_GSUB ::
-  *      Validate GSUB table.
-  *
-  *    FT_VALIDATE_JSTF ::
-  *      Validate JSTF table.
-  *
-  *    FT_VALIDATE_MATH ::
-  *      Validate MATH table.
-  *
-  *    FT_VALIDATE_OT ::
-  *      Validate all OpenType tables (BASE, GDEF, GPOS, GSUB, JSTF, MATH).
-  *
-  */
-#define FT_VALIDATE_BASE  0x0100
-#define FT_VALIDATE_GDEF  0x0200
-#define FT_VALIDATE_GPOS  0x0400
-#define FT_VALIDATE_GSUB  0x0800
-#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 )
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_OpenType_Validate
-  *
-  * @description:
-  *    Validate various OpenType tables to assure that all offsets and
-  *    indices are valid.  The idea is that a higher-level library that
-  *    actually does the text layout can access those tables without
-  *    error checking (which can be quite time consuming).
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  *    validation_flags ::
-  *       A bit field that specifies the tables to be validated.  See
-  *       @FT_VALIDATE_OTXXX for possible values.
-  *
-  * @output:
-  *    BASE_table ::
-  *       A pointer to the BASE table.
-  *
-  *    GDEF_table ::
-  *       A pointer to the GDEF table.
-  *
-  *    GPOS_table ::
-  *       A pointer to the GPOS table.
-  *
-  *    GSUB_table ::
-  *       A pointer to the GSUB table.
-  *
-  *    JSTF_table ::
-  *       A pointer to the JSTF table.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   This function only works with OpenType fonts, returning an error
-  *   otherwise.
-  *
-  *   After use, the application should deallocate the five tables with
-  *   @FT_OpenType_Free.  A NULL value indicates that the table either
-  *   doesn't exist in the font, or the application hasn't asked for
-  *   validation.
-  */
-  FT_EXPORT( FT_Error )
-  FT_OpenType_Validate( FT_Face    face,
-                        FT_UInt    validation_flags,
-                        FT_Bytes  *BASE_table,
-                        FT_Bytes  *GDEF_table,
-                        FT_Bytes  *GPOS_table,
-                        FT_Bytes  *GSUB_table,
-                        FT_Bytes  *JSTF_table );
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_OpenType_Free
-  *
-  * @description:
-  *    Free the buffer allocated by OpenType validator.
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  *    table ::
-  *       The pointer to the buffer that is allocated by
-  *       @FT_OpenType_Validate.
-  *
-  * @note:
-  *   This function must be used to free the buffer allocated by
-  *   @FT_OpenType_Validate only.
-  */
-  FT_EXPORT( void )
-  FT_OpenType_Free( FT_Face   face,
-                    FT_Bytes  table );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTOTVAL_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftoutln.h b/third_party/freetype/include/freetype/ftoutln.h
deleted file mode 100644
index 07f73eb..0000000
--- a/third_party/freetype/include/freetype/ftoutln.h
+++ /dev/null
@@ -1,582 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftoutln.h                                                              */
-/*                                                                         */
-/*    Support for the FT_Outline type used to store glyph shapes of        */
-/*    most scalable font formats (specification).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTOUTLN_H_
-#define FTOUTLN_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>                                                             */
-  /*    outline_processing                                                 */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Outline Processing                                                 */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Functions to create, transform, and render vectorial glyph images. */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains routines used to create and destroy scalable */
-  /*    glyph images known as `outlines'.  These can also be measured,     */
-  /*    transformed, and converted into bitmaps and pixmaps.               */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Outline                                                         */
-  /*    FT_Outline_New                                                     */
-  /*    FT_Outline_Done                                                    */
-  /*    FT_Outline_Copy                                                    */
-  /*    FT_Outline_Translate                                               */
-  /*    FT_Outline_Transform                                               */
-  /*    FT_Outline_Embolden                                                */
-  /*    FT_Outline_EmboldenXY                                              */
-  /*    FT_Outline_Reverse                                                 */
-  /*    FT_Outline_Check                                                   */
-  /*                                                                       */
-  /*    FT_Outline_Get_CBox                                                */
-  /*    FT_Outline_Get_BBox                                                */
-  /*                                                                       */
-  /*    FT_Outline_Get_Bitmap                                              */
-  /*    FT_Outline_Render                                                  */
-  /*    FT_Outline_Decompose                                               */
-  /*    FT_Outline_Funcs                                                   */
-  /*    FT_Outline_MoveToFunc                                              */
-  /*    FT_Outline_LineToFunc                                              */
-  /*    FT_Outline_ConicToFunc                                             */
-  /*    FT_Outline_CubicToFunc                                             */
-  /*                                                                       */
-  /*    FT_Orientation                                                     */
-  /*    FT_Outline_Get_Orientation                                         */
-  /*                                                                       */
-  /*    FT_OUTLINE_XXX                                                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Decompose                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Walk over an outline's structure to decompose it into individual   */
-  /*    segments and Bézier arcs.  This function also emits `move to'      */
-  /*    operations to indicate the start of new contours in the outline.   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    outline        :: A pointer to the source target.                  */
-  /*                                                                       */
-  /*    func_interface :: A table of `emitters', i.e., function pointers   */
-  /*                      called during decomposition to indicate path     */
-  /*                      operations.                                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user           :: A typeless pointer that is passed to each        */
-  /*                      emitter during the decomposition.  It can be     */
-  /*                      used to store the state during the               */
-  /*                      decomposition.                                   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    A contour that contains a single point only is represented by a    */
-  /*    `move to' operation followed by `line to' to the same point.  In   */
-  /*    most cases, it is best to filter this out before using the         */
-  /*    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,
-                        void*                    user );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_New                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new outline of a given size.                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library     :: A handle to the library object from where the       */
-  /*                   outline is allocated.  Note however that the new    */
-  /*                   outline will *not* necessarily be *freed*, when     */
-  /*                   destroying the library, by @FT_Done_FreeType.       */
-  /*                                                                       */
-  /*    numPoints   :: The maximum number of points within the outline.    */
-  /*                   Must be smaller than or equal to 0xFFFF (65535).    */
-  /*                                                                       */
-  /*    numContours :: The maximum number of contours within the outline.  */
-  /*                   This value must be in the range 0 to `numPoints'.   */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    anoutline   :: A handle to the new outline.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The reason why this function takes a `library' parameter is simply */
-  /*    to use the library's memory allocator.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_New( FT_Library   library,
-                  FT_UInt      numPoints,
-                  FT_Int       numContours,
-                  FT_Outline  *anoutline );
-
-
-  FT_EXPORT( FT_Error )
-  FT_Outline_New_Internal( FT_Memory    memory,
-                           FT_UInt      numPoints,
-                           FT_Int       numContours,
-                           FT_Outline  *anoutline );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Done                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy an outline created with @FT_Outline_New.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle of the library object used to allocate the     */
-  /*               outline.                                                */
-  /*                                                                       */
-  /*    outline :: A pointer to the outline object to be discarded.        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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 );
-
-
-  FT_EXPORT( FT_Error )
-  FT_Outline_Done_Internal( FT_Memory    memory,
-                            FT_Outline*  outline );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Check                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Check the contents of an outline descriptor.                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    outline :: A handle to a source outline.                           */
-  /*                                                                       */
-  /* <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 );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <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.           */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Outline_Get_CBox( const FT_Outline*  outline,
-                       FT_BBox           *acbox );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Translate                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Apply a simple translation to the points of an outline.            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    outline :: A pointer to the target outline descriptor.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    xOffset :: The horizontal offset.                                  */
-  /*                                                                       */
-  /*    yOffset :: The vertical offset.                                    */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Outline_Translate( const FT_Outline*  outline,
-                        FT_Pos             xOffset,
-                        FT_Pos             yOffset );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Copy                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Copy an outline into another one.  Both objects must have the      */
-  /*    same sizes (number of points & number of contours) when this       */
-  /*    function is called.                                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    source :: A handle to the source outline.                          */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    target :: A handle to the target outline.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_Copy( const FT_Outline*  source,
-                   FT_Outline        *target );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Transform                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Apply a simple 2x2 matrix to all of an outline's points.  Useful   */
-  /*    for applying rotations, slanting, flipping, etc.                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    outline :: A pointer to the target outline descriptor.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    matrix  :: A pointer to the transformation matrix.                 */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You can use @FT_Outline_Translate if you need to translate the     */
-  /*    outline's points.                                                  */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Outline_Transform( const FT_Outline*  outline,
-                        const FT_Matrix*   matrix );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Embolden                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Embolden an outline.  The new outline will be at most 4~times      */
-  /*    `strength' pixels wider and higher.  You may think of the left and */
-  /*    bottom borders as unchanged.                                       */
-  /*                                                                       */
-  /*    Negative `strength' values to reduce the outline thickness are     */
-  /*    possible also.                                                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    outline  :: A handle to the target outline.                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    strength :: How strong the glyph is emboldened.  Expressed in      */
-  /*                26.6 pixel format.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The used algorithm to increase or decrease the thickness of the    */
-  /*    glyph doesn't change the number of points; this means that certain */
-  /*    situations like acute angles or intersections are sometimes        */
-  /*    handled incorrectly.                                               */
-  /*                                                                       */
-  /*    If you need `better' metrics values you should call                */
-  /*    @FT_Outline_Get_CBox or @FT_Outline_Get_BBox.                      */
-  /*                                                                       */
-  /*    Example call:                                                      */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      FT_Load_Glyph( face, index, FT_LOAD_DEFAULT );                   */
-  /*      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    */
-  /*    functions like @FT_Set_Char_Size before calling FT_Render_Glyph.   */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_Embolden( FT_Outline*  outline,
-                       FT_Pos       strength );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_EmboldenXY                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Embolden an outline.  The new outline will be `xstrength' pixels   */
-  /*    wider and `ystrength' pixels higher.  Otherwise, it is similar to  */
-  /*    @FT_Outline_Embolden, which uses the same strength in both         */
-  /*    directions.                                                        */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_EmboldenXY( FT_Outline*  outline,
-                         FT_Pos       xstrength,
-                         FT_Pos       ystrength );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Reverse                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Reverse the drawing direction of an outline.  This is used to      */
-  /*    ensure consistent fill conventions for mirrored glyphs.            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    outline :: A pointer to the target outline descriptor.             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function toggles the bit flag @FT_OUTLINE_REVERSE_FILL in     */
-  /*    the outline's `flags' field.                                       */
-  /*                                                                       */
-  /*    It shouldn't be used by a normal client application, unless it     */
-  /*    knows what it is doing.                                            */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FT_Outline_Reverse( FT_Outline*  outline );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Get_Bitmap                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Render an outline within a bitmap.  The outline's image is simply  */
-  /*    OR-ed to the target bitmap.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to a FreeType library object.                  */
-  /*                                                                       */
-  /*    outline :: A pointer to the source outline descriptor.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    abitmap :: A pointer to the target bitmap descriptor.              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function does NOT CREATE the bitmap, it only renders an       */
-  /*    outline image within the one you pass to it!  Consequently, the    */
-  /*    various fields in `abitmap' should be set accordingly.             */
-  /*                                                                       */
-  /*    It will use the raster corresponding to the default glyph format.  */
-  /*                                                                       */
-  /*    The value of the `num_grays' field in `abitmap' is ignored.  If    */
-  /*    you select the gray-level rasterizer, and you want less than 256   */
-  /*    gray levels, you have to use @FT_Outline_Render directly.          */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_Get_Bitmap( FT_Library        library,
-                         FT_Outline*       outline,
-                         const FT_Bitmap  *abitmap );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Render                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Render an outline within a bitmap using the current scan-convert.  */
-  /*    This function uses an @FT_Raster_Params structure as an argument,  */
-  /*    allowing advanced features like direct composition, translucency,  */
-  /*    etc.                                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to a FreeType library object.                  */
-  /*                                                                       */
-  /*    outline :: A pointer to the source outline descriptor.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    params  :: A pointer to an @FT_Raster_Params structure used to     */
-  /*               describe the rendering operation.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You should know what you are doing and how @FT_Raster_Params works */
-  /*    to use this function.                                              */
-  /*                                                                       */
-  /*    The field `params.source' will be set to `outline' before the scan */
-  /*    converter is called, which means that the value you give to it is  */
-  /*    actually ignored.                                                  */
-  /*                                                                       */
-  /*    The gray-level rasterizer always uses 256 gray levels.  If you     */
-  /*    want less gray levels, you have to provide your own span callback. */
-  /*    See the @FT_RASTER_FLAG_DIRECT value of the `flags' field in the   */
-  /*    @FT_Raster_Params structure for more details.                      */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_Render( FT_Library         library,
-                     FT_Outline*        outline,
-                     FT_Raster_Params*  params );
-
-
- /**************************************************************************
-  *
-  * @enum:
-  *   FT_Orientation
-  *
-  * @description:
-  *   A list of values used to describe an outline's contour orientation.
-  *
-  *   The TrueType and PostScript specifications use different conventions
-  *   to determine whether outline contours should be filled or unfilled.
-  *
-  * @values:
-  *   FT_ORIENTATION_TRUETYPE ::
-  *     According to the TrueType specification, clockwise contours must
-  *     be filled, and counter-clockwise ones must be unfilled.
-  *
-  *   FT_ORIENTATION_POSTSCRIPT ::
-  *     According to the PostScript specification, counter-clockwise contours
-  *     must be filled, and clockwise ones must be unfilled.
-  *
-  *   FT_ORIENTATION_FILL_RIGHT ::
-  *     This is identical to @FT_ORIENTATION_TRUETYPE, but is used to
-  *     remember that in TrueType, everything that is to the right of
-  *     the drawing direction of a contour must be filled.
-  *
-  *   FT_ORIENTATION_FILL_LEFT ::
-  *     This is identical to @FT_ORIENTATION_POSTSCRIPT, but is used to
-  *     remember that in PostScript, everything that is to the left of
-  *     the drawing direction of a contour must be filled.
-  *
-  *   FT_ORIENTATION_NONE ::
-  *     The orientation cannot be determined.  That is, different parts of
-  *     the glyph have different orientation.
-  *
-  */
-  typedef enum  FT_Orientation_
-  {
-    FT_ORIENTATION_TRUETYPE   = 0,
-    FT_ORIENTATION_POSTSCRIPT = 1,
-    FT_ORIENTATION_FILL_RIGHT = FT_ORIENTATION_TRUETYPE,
-    FT_ORIENTATION_FILL_LEFT  = FT_ORIENTATION_POSTSCRIPT,
-    FT_ORIENTATION_NONE
-
-  } FT_Orientation;
-
-
- /**************************************************************************
-  *
-  * @function:
-  *   FT_Outline_Get_Orientation
-  *
-  * @description:
-  *   This function analyzes a glyph outline and tries to compute its
-  *   fill orientation (see @FT_Orientation).  This is done by integrating
-  *   the total area covered by the outline. The positive integral
-  *   corresponds to the clockwise orientation and @FT_ORIENTATION_POSTSCRIPT
-  *   is returned. The negative integral corresponds to the counter-clockwise
-  *   orientation and @FT_ORIENTATION_TRUETYPE is returned.
-  *
-  *   Note that this will return @FT_ORIENTATION_TRUETYPE for empty
-  *   outlines.
-  *
-  * @input:
-  *   outline ::
-  *     A handle to the source outline.
-  *
-  * @return:
-  *   The orientation.
-  *
-  */
-  FT_EXPORT( FT_Orientation )
-  FT_Outline_Get_Orientation( FT_Outline*  outline );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTOUTLN_H_ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/ftrender.h b/third_party/freetype/include/freetype/ftrender.h
deleted file mode 100644
index 9608375..0000000
--- a/third_party/freetype/include/freetype/ftrender.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftrender.h                                                             */
-/*                                                                         */
-/*    FreeType renderer modules public interface (specification).          */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTRENDER_H_
-#define FTRENDER_H_
-
-
-#include <ft2build.h>
-#include FT_MODULE_H
-#include FT_GLYPH_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    module_management                                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* create a new glyph object */
-  typedef FT_Error
-  (*FT_Glyph_InitFunc)( FT_Glyph      glyph,
-                        FT_GlyphSlot  slot );
-
-  /* destroys a given glyph object */
-  typedef void
-  (*FT_Glyph_DoneFunc)( FT_Glyph  glyph );
-
-  typedef void
-  (*FT_Glyph_TransformFunc)( FT_Glyph          glyph,
-                             const FT_Matrix*  matrix,
-                             const FT_Vector*  delta );
-
-  typedef void
-  (*FT_Glyph_GetBBoxFunc)( FT_Glyph  glyph,
-                           FT_BBox*  abbox );
-
-  typedef FT_Error
-  (*FT_Glyph_CopyFunc)( FT_Glyph   source,
-                        FT_Glyph   target );
-
-  typedef FT_Error
-  (*FT_Glyph_PrepareFunc)( FT_Glyph      glyph,
-                           FT_GlyphSlot  slot );
-
-/* deprecated */
-#define FT_Glyph_Init_Func       FT_Glyph_InitFunc
-#define FT_Glyph_Done_Func       FT_Glyph_DoneFunc
-#define FT_Glyph_Transform_Func  FT_Glyph_TransformFunc
-#define FT_Glyph_BBox_Func       FT_Glyph_GetBBoxFunc
-#define FT_Glyph_Copy_Func       FT_Glyph_CopyFunc
-#define FT_Glyph_Prepare_Func    FT_Glyph_PrepareFunc
-
-
-  struct  FT_Glyph_Class_
-  {
-    FT_Long                 glyph_size;
-    FT_Glyph_Format         glyph_format;
-
-    FT_Glyph_InitFunc       glyph_init;
-    FT_Glyph_DoneFunc       glyph_done;
-    FT_Glyph_CopyFunc       glyph_copy;
-    FT_Glyph_TransformFunc  glyph_transform;
-    FT_Glyph_GetBBoxFunc    glyph_bbox;
-    FT_Glyph_PrepareFunc    glyph_prepare;
-  };
-
-
-  typedef FT_Error
-  (*FT_Renderer_RenderFunc)( FT_Renderer       renderer,
-                             FT_GlyphSlot      slot,
-                             FT_UInt           mode,
-                             const FT_Vector*  origin );
-
-  typedef FT_Error
-  (*FT_Renderer_TransformFunc)( FT_Renderer       renderer,
-                                FT_GlyphSlot      slot,
-                                const FT_Matrix*  matrix,
-                                const FT_Vector*  delta );
-
-
-  typedef void
-  (*FT_Renderer_GetCBoxFunc)( FT_Renderer   renderer,
-                              FT_GlyphSlot  slot,
-                              FT_BBox*      cbox );
-
-
-  typedef FT_Error
-  (*FT_Renderer_SetModeFunc)( FT_Renderer  renderer,
-                              FT_ULong     mode_tag,
-                              FT_Pointer   mode_ptr );
-
-/* deprecated identifiers */
-#define FTRenderer_render  FT_Renderer_RenderFunc
-#define FTRenderer_transform  FT_Renderer_TransformFunc
-#define FTRenderer_getCBox  FT_Renderer_GetCBoxFunc
-#define FTRenderer_setMode  FT_Renderer_SetModeFunc
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Renderer_Class                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The renderer module class descriptor.                              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root            :: The root @FT_Module_Class fields.               */
-  /*                                                                       */
-  /*    glyph_format    :: The glyph image format this renderer handles.   */
-  /*                                                                       */
-  /*    render_glyph    :: A method used to render the image that is in a  */
-  /*                       given glyph slot into a bitmap.                 */
-  /*                                                                       */
-  /*    transform_glyph :: A method used to transform the image that is in */
-  /*                       a given glyph slot.                             */
-  /*                                                                       */
-  /*    get_glyph_cbox  :: A method used to access the glyph's cbox.       */
-  /*                                                                       */
-  /*    set_mode        :: A method used to pass additional parameters.    */
-  /*                                                                       */
-  /*    raster_class    :: For @FT_GLYPH_FORMAT_OUTLINE renderers only.    */
-  /*                       This is a pointer to its raster's class.        */
-  /*                                                                       */
-  typedef struct  FT_Renderer_Class_
-  {
-    FT_Module_Class            root;
-
-    FT_Glyph_Format            glyph_format;
-
-    FT_Renderer_RenderFunc     render_glyph;
-    FT_Renderer_TransformFunc  transform_glyph;
-    FT_Renderer_GetCBoxFunc    get_glyph_cbox;
-    FT_Renderer_SetModeFunc    set_mode;
-
-    FT_Raster_Funcs*           raster_class;
-
-  } FT_Renderer_Class;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Renderer                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the current renderer for a given glyph format.            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library :: A handle to the library object.                         */
-  /*                                                                       */
-  /*    format  :: The glyph format.                                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A renderer handle.  0~if none found.                               */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    An error will be returned if a module already exists by that name, */
-  /*    or if the module requires a version of FreeType that is too great. */
-  /*                                                                       */
-  /*    To add a new renderer, simply use @FT_Add_Module.  To retrieve a   */
-  /*    renderer by its name, use @FT_Get_Module.                          */
-  /*                                                                       */
-  FT_EXPORT( FT_Renderer )
-  FT_Get_Renderer( FT_Library       library,
-                   FT_Glyph_Format  format );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Set_Renderer                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Set the current renderer to use, and set additional mode.          */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    renderer   :: A handle to the renderer object.                     */
-  /*                                                                       */
-  /*    num_params :: The number of additional parameters.                 */
-  /*                                                                       */
-  /*    parameters :: Additional parameters.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    In case of success, the renderer will be used to convert glyph     */
-  /*    images in the renderer's known format into bitmaps.                */
-  /*                                                                       */
-  /*    This doesn't change the current renderer for other formats.        */
-  /*                                                                       */
-  /*    Currently, no FreeType renderer module uses `parameters'; you      */
-  /*    should thus always pass NULL as the value.                         */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Set_Renderer( FT_Library     library,
-                   FT_Renderer    renderer,
-                   FT_UInt        num_params,
-                   FT_Parameter*  parameters );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTRENDER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftsizes.h b/third_party/freetype/include/freetype/ftsizes.h
deleted file mode 100644
index 2f3958a..0000000
--- a/third_party/freetype/include/freetype/ftsizes.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsizes.h                                                              */
-/*                                                                         */
-/*    FreeType size objects management (specification).                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Typical application would normally not need to use these functions.   */
-  /* However, they have been placed in a public API for the rare cases     */
-  /* where they are needed.                                                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTSIZES_H_
-#define FTSIZES_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>                                                             */
-  /*    sizes_management                                                   */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Size Management                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Managing multiple sizes per face.                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    When creating a new face object (e.g., with @FT_New_Face), an      */
-  /*    @FT_Size object is automatically created and used to store all     */
-  /*    pixel-size dependent information, available in the `face->size'    */
-  /*    field.                                                             */
-  /*                                                                       */
-  /*    It is however possible to create more sizes for a given face,      */
-  /*    mostly in order to manage several character pixel sizes of the     */
-  /*    same font family and style.  See @FT_New_Size and @FT_Done_Size.   */
-  /*                                                                       */
-  /*    Note that @FT_Set_Pixel_Sizes and @FT_Set_Char_Size only           */
-  /*    modify the contents of the current `active' size; you thus need    */
-  /*    to use @FT_Activate_Size to change it.                             */
-  /*                                                                       */
-  /*    99% of applications won't need the functions provided here,        */
-  /*    especially if they use the caching sub-system, so be cautious      */
-  /*    when using these.                                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Size                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new size object from a given face object.                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to a parent face object.                          */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    asize :: A handle to a new size object.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You need to call @FT_Activate_Size in order to select the new size */
-  /*    for upcoming calls to @FT_Set_Pixel_Sizes, @FT_Set_Char_Size,      */
-  /*    @FT_Load_Glyph, @FT_Load_Char, etc.                                */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Size( FT_Face   face,
-               FT_Size*  size );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Size                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Discard a given size object.  Note that @FT_Done_Face              */
-  /*    automatically discards all size objects allocated with             */
-  /*    @FT_New_Size.                                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to a target size object.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Done_Size( FT_Size  size );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Activate_Size                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Even though it is possible to create several size objects for a    */
-  /*    given face (see @FT_New_Size for details), functions like          */
-  /*    @FT_Load_Glyph or @FT_Load_Char only use the one that has been     */
-  /*    activated last to determine the `current character pixel size'.    */
-  /*                                                                       */
-  /*    This function can be used to `activate' a previously created size  */
-  /*    object.                                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to a target size object.                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    If `face' is the size's parent face object, this function changes  */
-  /*    the value of `face->size' to the input size handle.                */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Activate_Size( FT_Size  size );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTSIZES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftsnames.h b/third_party/freetype/include/freetype/ftsnames.h
deleted file mode 100644
index f6daf8c..0000000
--- a/third_party/freetype/include/freetype/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-2017 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
-
-#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.  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.                                   */
-  /*                                                                       */
-  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 /* FTSNAMES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftsynth.h b/third_party/freetype/include/freetype/ftsynth.h
deleted file mode 100644
index 1863fa2..0000000
--- a/third_party/freetype/include/freetype/ftsynth.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsynth.h                                                              */
-/*                                                                         */
-/*    FreeType synthesizing code for emboldening and slanting              */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 2000-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*********                                                       *********/
-  /*********        WARNING, THIS IS ALPHA CODE!  THIS API         *********/
-  /*********    IS DUE TO CHANGE UNTIL STRICTLY NOTIFIED BY THE    *********/
-  /*********            FREETYPE DEVELOPMENT TEAM                  *********/
-  /*********                                                       *********/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* Main reason for not lifting the functions in this module to a  */
-  /* `standard' API is that the used parameters for emboldening and */
-  /* slanting are not configurable.  Consider the functions as a    */
-  /* code resource that should be copied into the application and   */
-  /* adapted to the particular needs.                               */
-
-
-#ifndef FTSYNTH_H_
-#define FTSYNTH_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
-
-  /* Embolden a glyph by a `reasonable' value (which is highly a matter of */
-  /* taste).  This function is actually a convenience function, providing  */
-  /* a wrapper for @FT_Outline_Embolden and @FT_Bitmap_Embolden.           */
-  /*                                                                       */
-  /* For emboldened outlines the height, width, and advance metrics are    */
-  /* increased by the strength of the emboldening -- this even affects     */
-  /* mono-width fonts!                                                     */
-  /*                                                                       */
-  /* You can also call @FT_Outline_Get_CBox to get precise values.         */
-  FT_EXPORT( void )
-  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot );
-
-  /* Slant an outline glyph to the right by about 12 degrees. */
-  FT_EXPORT( void )
-  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTSYNTH_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftsystem.h b/third_party/freetype/include/freetype/ftsystem.h
deleted file mode 100644
index 1aa4762..0000000
--- a/third_party/freetype/include/freetype/ftsystem.h
+++ /dev/null
@@ -1,355 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsystem.h                                                             */
-/*                                                                         */
-/*    FreeType low-level system interface definition (specification).      */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTSYSTEM_H_
-#define FTSYSTEM_H_
-
-
-#include <ft2build.h>
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*   system_interface                                                    */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*   System Interface                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*   How FreeType manages memory and i/o.                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   This section contains various definitions related to memory         */
-  /*   management and i/o access.  You need to understand this             */
-  /*   information if you want to use a custom memory manager or you own   */
-  /*   i/o streams.                                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                  M E M O R Y   M A N A G E M E N T                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   FT_Memory
-   *
-   * @description:
-   *   A handle to a given memory manager object, defined with an
-   *   @FT_MemoryRec structure.
-   *
-   */
-  typedef struct FT_MemoryRec_*  FT_Memory;
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   FT_Alloc_Func
-   *
-   * @description:
-   *   A function used to allocate `size' bytes from `memory'.
-   *
-   * @input:
-   *   memory ::
-   *     A handle to the source memory manager.
-   *
-   *   size ::
-   *     The size in bytes to allocate.
-   *
-   * @return:
-   *   Address of new memory block.  0~in case of failure.
-   *
-   */
-  typedef void*
-  (*FT_Alloc_Func)( FT_Memory  memory,
-                    long       size );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   FT_Free_Func
-   *
-   * @description:
-   *   A function used to release a given block of memory.
-   *
-   * @input:
-   *   memory ::
-   *     A handle to the source memory manager.
-   *
-   *   block ::
-   *     The address of the target memory block.
-   *
-   */
-  typedef void
-  (*FT_Free_Func)( FT_Memory  memory,
-                   void*      block );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   FT_Realloc_Func
-   *
-   * @description:
-   *   A function used to re-allocate a given block of memory.
-   *
-   * @input:
-   *   memory ::
-   *     A handle to the source memory manager.
-   *
-   *   cur_size ::
-   *     The block's current size in bytes.
-   *
-   *   new_size ::
-   *     The block's requested new size.
-   *
-   *   block ::
-   *     The block's current address.
-   *
-   * @return:
-   *   New block address.  0~in case of memory shortage.
-   *
-   * @note:
-   *   In case of error, the old block must still be available.
-   *
-   */
-  typedef void*
-  (*FT_Realloc_Func)( FT_Memory  memory,
-                      long       cur_size,
-                      long       new_size,
-                      void*      block );
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   FT_MemoryRec
-   *
-   * @description:
-   *   A structure used to describe a given memory manager to FreeType~2.
-   *
-   * @fields:
-   *   user ::
-   *     A generic typeless pointer for user data.
-   *
-   *   alloc ::
-   *     A pointer type to an allocation function.
-   *
-   *   free ::
-   *     A pointer type to an memory freeing function.
-   *
-   *   realloc ::
-   *     A pointer type to a reallocation function.
-   *
-   */
-  struct  FT_MemoryRec_
-  {
-    void*            user;
-    FT_Alloc_Func    alloc;
-    FT_Free_Func     free;
-    FT_Realloc_Func  realloc;
-  };
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                       I / O   M A N A G E M E N T                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   FT_Stream
-   *
-   * @description:
-   *   A handle to an input stream.
-   *
-   * @also:
-   *   See @FT_StreamRec for the publicly accessible fields of a given
-   *   stream object.
-   *
-   */
-  typedef struct FT_StreamRec_*  FT_Stream;
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   FT_StreamDesc
-   *
-   * @description:
-   *   A union type used to store either a long or a pointer.  This is used
-   *   to store a file descriptor or a `FILE*' in an input stream.
-   *
-   */
-  typedef union  FT_StreamDesc_
-  {
-    long   value;
-    void*  pointer;
-
-  } FT_StreamDesc;
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   FT_Stream_IoFunc
-   *
-   * @description:
-   *   A function used to seek and read data from a given input stream.
-   *
-   * @input:
-   *   stream ::
-   *     A handle to the source stream.
-   *
-   *   offset ::
-   *     The offset of read in stream (always from start).
-   *
-   *   buffer ::
-   *     The address of the read buffer.
-   *
-   *   count ::
-   *     The number of bytes to read from the stream.
-   *
-   * @return:
-   *   The number of bytes effectively read by the stream.
-   *
-   * @note:
-   *   This function might be called to perform a seek or skip operation
-   *   with a `count' of~0.  A non-zero return value then indicates an
-   *   error.
-   *
-   */
-  typedef unsigned long
-  (*FT_Stream_IoFunc)( FT_Stream       stream,
-                       unsigned long   offset,
-                       unsigned char*  buffer,
-                       unsigned long   count );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   FT_Stream_CloseFunc
-   *
-   * @description:
-   *   A function used to close a given input stream.
-   *
-   * @input:
-   *  stream ::
-   *     A handle to the target stream.
-   *
-   */
-  typedef void
-  (*FT_Stream_CloseFunc)( FT_Stream  stream );
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   FT_StreamRec
-   *
-   * @description:
-   *   A structure used to describe an input stream.
-   *
-   * @input:
-   *   base ::
-   *     For memory-based streams, this is the address of the first stream
-   *     byte in memory.  This field should always be set to NULL for
-   *     disk-based streams.
-   *
-   *   size ::
-   *     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.
-   *     (Note that this size value can occur for normal streams also; it is
-   *     thus just a hint.)
-   *
-   *   pos ::
-   *     The current position within the stream.
-   *
-   *   descriptor ::
-   *     This field is a union that can hold an integer or a pointer.  It is
-   *     used by stream implementations to store file descriptors or `FILE*'
-   *     pointers.
-   *
-   *   pathname ::
-   *     This field is completely ignored by FreeType.  However, it is often
-   *     useful during debugging to use it to store the stream's filename
-   *     (where available).
-   *
-   *   read ::
-   *     The stream's input function.
-   *
-   *   close ::
-   *     The stream's close function.
-   *
-   *   memory ::
-   *     The memory manager to use to preload frames.  This is set
-   *     internally by FreeType and shouldn't be touched by stream
-   *     implementations.
-   *
-   *   cursor ::
-   *     This field is set and used internally by FreeType when parsing
-   *     frames.
-   *
-   *   limit ::
-   *     This field is set and used internally by FreeType when parsing
-   *     frames.
-   *
-   */
-  typedef struct  FT_StreamRec_
-  {
-    unsigned char*       base;
-    unsigned long        size;
-    unsigned long        pos;
-
-    FT_StreamDesc        descriptor;
-    FT_StreamDesc        pathname;
-    FT_Stream_IoFunc     read;
-    FT_Stream_CloseFunc  close;
-
-    FT_Memory            memory;
-    unsigned char*       cursor;
-    unsigned char*       limit;
-
-  } FT_StreamRec;
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTSYSTEM_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/fttrigon.h b/third_party/freetype/include/freetype/fttrigon.h
deleted file mode 100644
index 89f0350..0000000
--- a/third_party/freetype/include/freetype/fttrigon.h
+++ /dev/null
@@ -1,350 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fttrigon.h                                                             */
-/*                                                                         */
-/*    FreeType trigonometric functions (specification).                    */
-/*                                                                         */
-/*  Copyright 2001-2017 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 FTTRIGON_H_
-#define FTTRIGON_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>                                                             */
-  /*   computations                                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   FT_Angle
-   *
-   * @description:
-   *   This type is used to model angle values in FreeType.  Note that the
-   *   angle is a 16.16 fixed-point value expressed in degrees.
-   *
-   */
-  typedef FT_Fixed  FT_Angle;
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ANGLE_PI
-   *
-   * @description:
-   *   The angle pi expressed in @FT_Angle units.
-   *
-   */
-#define FT_ANGLE_PI  ( 180L << 16 )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ANGLE_2PI
-   *
-   * @description:
-   *   The angle 2*pi expressed in @FT_Angle units.
-   *
-   */
-#define FT_ANGLE_2PI  ( FT_ANGLE_PI * 2 )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ANGLE_PI2
-   *
-   * @description:
-   *   The angle pi/2 expressed in @FT_Angle units.
-   *
-   */
-#define FT_ANGLE_PI2  ( FT_ANGLE_PI / 2 )
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_ANGLE_PI4
-   *
-   * @description:
-   *   The angle pi/4 expressed in @FT_Angle units.
-   *
-   */
-#define FT_ANGLE_PI4  ( FT_ANGLE_PI / 4 )
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Sin
-   *
-   * @description:
-   *   Return the sinus of a given angle in fixed-point format.
-   *
-   * @input:
-   *   angle ::
-   *     The input angle.
-   *
-   * @return:
-   *   The sinus value.
-   *
-   * @note:
-   *   If you need both the sinus and cosinus for a given angle, use the
-   *   function @FT_Vector_Unit.
-   *
-   */
-  FT_EXPORT( FT_Fixed )
-  FT_Sin( FT_Angle  angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Cos
-   *
-   * @description:
-   *   Return the cosinus of a given angle in fixed-point format.
-   *
-   * @input:
-   *   angle ::
-   *     The input angle.
-   *
-   * @return:
-   *   The cosinus value.
-   *
-   * @note:
-   *   If you need both the sinus and cosinus for a given angle, use the
-   *   function @FT_Vector_Unit.
-   *
-   */
-  FT_EXPORT( FT_Fixed )
-  FT_Cos( FT_Angle  angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Tan
-   *
-   * @description:
-   *   Return the tangent of a given angle in fixed-point format.
-   *
-   * @input:
-   *   angle ::
-   *     The input angle.
-   *
-   * @return:
-   *   The tangent value.
-   *
-   */
-  FT_EXPORT( FT_Fixed )
-  FT_Tan( FT_Angle  angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Atan2
-   *
-   * @description:
-   *   Return the arc-tangent corresponding to a given vector (x,y) in
-   *   the 2d plane.
-   *
-   * @input:
-   *   x ::
-   *     The horizontal vector coordinate.
-   *
-   *   y ::
-   *     The vertical vector coordinate.
-   *
-   * @return:
-   *   The arc-tangent value (i.e. angle).
-   *
-   */
-  FT_EXPORT( FT_Angle )
-  FT_Atan2( FT_Fixed  x,
-            FT_Fixed  y );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Angle_Diff
-   *
-   * @description:
-   *   Return the difference between two angles.  The result is always
-   *   constrained to the ]-PI..PI] interval.
-   *
-   * @input:
-   *   angle1 ::
-   *     First angle.
-   *
-   *   angle2 ::
-   *     Second angle.
-   *
-   * @return:
-   *   Constrained value of `value2-value1'.
-   *
-   */
-  FT_EXPORT( FT_Angle )
-  FT_Angle_Diff( FT_Angle  angle1,
-                 FT_Angle  angle2 );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Vector_Unit
-   *
-   * @description:
-   *   Return the unit vector corresponding to a given angle.  After the
-   *   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.
-   *
-   * @output:
-   *   vec ::
-   *     The address of target vector.
-   *
-   * @input:
-   *   angle ::
-   *     The input angle.
-   *
-   */
-  FT_EXPORT( void )
-  FT_Vector_Unit( FT_Vector*  vec,
-                  FT_Angle    angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Vector_Rotate
-   *
-   * @description:
-   *   Rotate a vector by a given angle.
-   *
-   * @inout:
-   *   vec ::
-   *     The address of target vector.
-   *
-   * @input:
-   *   angle ::
-   *     The input angle.
-   *
-   */
-  FT_EXPORT( void )
-  FT_Vector_Rotate( FT_Vector*  vec,
-                    FT_Angle    angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Vector_Length
-   *
-   * @description:
-   *   Return the length of a given vector.
-   *
-   * @input:
-   *   vec ::
-   *     The address of target vector.
-   *
-   * @return:
-   *   The vector length, expressed in the same units that the original
-   *   vector coordinates.
-   *
-   */
-  FT_EXPORT( FT_Fixed )
-  FT_Vector_Length( FT_Vector*  vec );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Vector_Polarize
-   *
-   * @description:
-   *   Compute both the length and angle of a given vector.
-   *
-   * @input:
-   *   vec ::
-   *     The address of source vector.
-   *
-   * @output:
-   *   length ::
-   *     The vector length.
-   *
-   *   angle ::
-   *     The vector angle.
-   *
-   */
-  FT_EXPORT( void )
-  FT_Vector_Polarize( FT_Vector*  vec,
-                      FT_Fixed   *length,
-                      FT_Angle   *angle );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FT_Vector_From_Polar
-   *
-   * @description:
-   *   Compute vector coordinates from a length and angle.
-   *
-   * @output:
-   *   vec ::
-   *     The address of source vector.
-   *
-   * @input:
-   *   length ::
-   *     The vector length.
-   *
-   *   angle ::
-   *     The vector angle.
-   *
-   */
-  FT_EXPORT( void )
-  FT_Vector_From_Polar( FT_Vector*  vec,
-                        FT_Fixed    length,
-                        FT_Angle    angle );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* FTTRIGON_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftttdrv.h b/third_party/freetype/include/freetype/ftttdrv.h
deleted file mode 100644
index a7b937f..0000000
--- a/third_party/freetype/include/freetype/ftttdrv.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftttdrv.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the TrueType driver                     */
-/*    (specification only).                                                */
-/*                                                                         */
-/*  Copyright 2013-2017 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'.
-   *
-   *   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_ _Backwards_ _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
-   *   http://www.microsoft.com/typography/cleartype/truetypecleartype.aspx.
-   *   This technique is not to be confused with ClearType compatible
-   *   widths.  ClearType backwards 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 backwards
-   *   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.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @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
-   *   `http://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').
-   */
-
-
-  /**************************************************************************
-   *
-   * @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
-   *   FT_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
-
- /* */
-
-
-FT_END_HEADER
-
-
-#endif /* FTTTDRV_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/fttypes.h b/third_party/freetype/include/freetype/fttypes.h
deleted file mode 100644
index eab8ada..0000000
--- a/third_party/freetype/include/freetype/fttypes.h
+++ /dev/null
@@ -1,602 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fttypes.h                                                              */
-/*                                                                         */
-/*    FreeType simple types definitions (specification only).              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTTYPES_H_
-#define FTTYPES_H_
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_SYSTEM_H
-#include FT_IMAGE_H
-
-#include <stddef.h>
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    basic_types                                                        */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Basic Data Types                                                   */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    The basic data types defined by the library.                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the basic data types defined by FreeType~2,  */
-  /*    ranging from simple scalar types to bitmap descriptors.  More      */
-  /*    font-specific structures are defined in a different section.       */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_Byte                                                            */
-  /*    FT_Bytes                                                           */
-  /*    FT_Char                                                            */
-  /*    FT_Int                                                             */
-  /*    FT_UInt                                                            */
-  /*    FT_Int16                                                           */
-  /*    FT_UInt16                                                          */
-  /*    FT_Int32                                                           */
-  /*    FT_UInt32                                                          */
-  /*    FT_Int64                                                           */
-  /*    FT_UInt64                                                          */
-  /*    FT_Short                                                           */
-  /*    FT_UShort                                                          */
-  /*    FT_Long                                                            */
-  /*    FT_ULong                                                           */
-  /*    FT_Bool                                                            */
-  /*    FT_Offset                                                          */
-  /*    FT_PtrDist                                                         */
-  /*    FT_String                                                          */
-  /*    FT_Tag                                                             */
-  /*    FT_Error                                                           */
-  /*    FT_Fixed                                                           */
-  /*    FT_Pointer                                                         */
-  /*    FT_Pos                                                             */
-  /*    FT_Vector                                                          */
-  /*    FT_BBox                                                            */
-  /*    FT_Matrix                                                          */
-  /*    FT_FWord                                                           */
-  /*    FT_UFWord                                                          */
-  /*    FT_F2Dot14                                                         */
-  /*    FT_UnitVector                                                      */
-  /*    FT_F26Dot6                                                         */
-  /*    FT_Data                                                            */
-  /*                                                                       */
-  /*    FT_MAKE_TAG                                                        */
-  /*                                                                       */
-  /*    FT_Generic                                                         */
-  /*    FT_Generic_Finalizer                                               */
-  /*                                                                       */
-  /*    FT_Bitmap                                                          */
-  /*    FT_Pixel_Mode                                                      */
-  /*    FT_Palette_Mode                                                    */
-  /*    FT_Glyph_Format                                                    */
-  /*    FT_IMAGE_TAG                                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Bool                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef of unsigned char, used for simple booleans.  As usual,   */
-  /*    values 1 and~0 represent true and false, respectively.             */
-  /*                                                                       */
-  typedef unsigned char  FT_Bool;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_FWord                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A signed 16-bit integer used to store a distance in original font  */
-  /*    units.                                                             */
-  /*                                                                       */
-  typedef signed short  FT_FWord;   /* distance in FUnits */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UFWord                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An unsigned 16-bit integer used to store a distance in original    */
-  /*    font units.                                                        */
-  /*                                                                       */
-  typedef unsigned short  FT_UFWord;  /* unsigned distance */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Char                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple typedef for the _signed_ char type.                       */
-  /*                                                                       */
-  typedef signed char  FT_Char;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Byte                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple typedef for the _unsigned_ char type.                     */
-  /*                                                                       */
-  typedef unsigned char  FT_Byte;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Bytes                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for constant memory areas.                               */
-  /*                                                                       */
-  typedef const FT_Byte*  FT_Bytes;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Tag                                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for 32-bit tags (as used in the SFNT format).            */
-  /*                                                                       */
-  typedef FT_UInt32  FT_Tag;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_String                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple typedef for the char type, usually used for strings.      */
-  /*                                                                       */
-  typedef char  FT_String;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Short                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for signed short.                                        */
-  /*                                                                       */
-  typedef signed short  FT_Short;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UShort                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for unsigned short.                                      */
-  /*                                                                       */
-  typedef unsigned short  FT_UShort;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Int                                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for the int type.                                        */
-  /*                                                                       */
-  typedef signed int  FT_Int;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_UInt                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for the unsigned int type.                               */
-  /*                                                                       */
-  typedef unsigned int  FT_UInt;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Long                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for signed long.                                         */
-  /*                                                                       */
-  typedef signed long  FT_Long;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_ULong                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A typedef for unsigned long.                                       */
-  /*                                                                       */
-  typedef unsigned long  FT_ULong;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_F2Dot14                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A signed 2.14 fixed-point type used for unit vectors.              */
-  /*                                                                       */
-  typedef signed short  FT_F2Dot14;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_F26Dot6                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A signed 26.6 fixed-point type used for vectorial pixel            */
-  /*    coordinates.                                                       */
-  /*                                                                       */
-  typedef signed long  FT_F26Dot6;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Fixed                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This type is used to store 16.16 fixed-point values, like scaling  */
-  /*    values or matrix coefficients.                                     */
-  /*                                                                       */
-  typedef signed long  FT_Fixed;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Error                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The FreeType error code type.  A value of~0 is always interpreted  */
-  /*    as a successful operation.                                         */
-  /*                                                                       */
-  typedef int  FT_Error;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Pointer                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple typedef for a typeless pointer.                           */
-  /*                                                                       */
-  typedef void*  FT_Pointer;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_Offset                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This is equivalent to the ANSI~C `size_t' type, i.e., the largest  */
-  /*    _unsigned_ integer type used to express a file size or position,   */
-  /*    or a memory block size.                                            */
-  /*                                                                       */
-  typedef size_t  FT_Offset;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_PtrDist                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This is equivalent to the ANSI~C `ptrdiff_t' type, i.e., the       */
-  /*    largest _signed_ integer type used to express the distance         */
-  /*    between two pointers.                                              */
-  /*                                                                       */
-  typedef ft_ptrdiff_t  FT_PtrDist;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_UnitVector                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to store a 2D vector unit vector.  Uses    */
-  /*    FT_F2Dot14 types.                                                  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    x :: Horizontal coordinate.                                        */
-  /*                                                                       */
-  /*    y :: Vertical coordinate.                                          */
-  /*                                                                       */
-  typedef struct  FT_UnitVector_
-  {
-    FT_F2Dot14  x;
-    FT_F2Dot14  y;
-
-  } FT_UnitVector;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Matrix                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure used to store a 2x2 matrix.  Coefficients are   */
-  /*    in 16.16 fixed-point format.  The computation performed is:        */
-  /*                                                                       */
-  /*       {                                                               */
-  /*          x' = x*xx + y*xy                                             */
-  /*          y' = x*yx + y*yy                                             */
-  /*       }                                                               */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    xx :: Matrix coefficient.                                          */
-  /*                                                                       */
-  /*    xy :: Matrix coefficient.                                          */
-  /*                                                                       */
-  /*    yx :: Matrix coefficient.                                          */
-  /*                                                                       */
-  /*    yy :: Matrix coefficient.                                          */
-  /*                                                                       */
-  typedef struct  FT_Matrix_
-  {
-    FT_Fixed  xx, xy;
-    FT_Fixed  yx, yy;
-
-  } FT_Matrix;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Data                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Read-only binary data represented as a pointer and a length.       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    pointer :: The data.                                               */
-  /*                                                                       */
-  /*    length  :: The length of the data in bytes.                        */
-  /*                                                                       */
-  typedef struct  FT_Data_
-  {
-    const FT_Byte*  pointer;
-    FT_Int          length;
-
-  } FT_Data;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Generic_Finalizer                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Describe a function used to destroy the `client' data of any       */
-  /*    FreeType object.  See the description of the @FT_Generic type for  */
-  /*    details of usage.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    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);
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Generic                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Client applications often need to associate their own data to a    */
-  /*    variety of FreeType core objects.  For example, a text layout API  */
-  /*    might want to associate a glyph cache to a given size object.      */
-  /*                                                                       */
-  /*    Some FreeType object contains a `generic' field, of type           */
-  /*    FT_Generic, which usage is left to client applications and font    */
-  /*    servers.                                                           */
-  /*                                                                       */
-  /*    It can be used to store a pointer to client-specific data, as well */
-  /*    as the address of a `finalizer' function, which will be called by  */
-  /*    FreeType when the object is destroyed (for example, the previous   */
-  /*    client example would put the address of the glyph cache destructor */
-  /*    in the `finalizer' field).                                         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    data      :: A typeless pointer to any client-specified data. This */
-  /*                 field is completely ignored by the FreeType library.  */
-  /*                                                                       */
-  /*    finalizer :: A pointer to a `generic finalizer' function, which    */
-  /*                 will be called when the object is destroyed.  If this */
-  /*                 field is set to NULL, no code will be called.         */
-  /*                                                                       */
-  typedef struct  FT_Generic_
-  {
-    void*                 data;
-    FT_Generic_Finalizer  finalizer;
-
-  } FT_Generic;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_MAKE_TAG                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro converts four-letter tags that are used to label        */
-  /*    TrueType tables into an unsigned long, to be used within FreeType. */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The produced values *must* be 32-bit integers.  Don't redefine     */
-  /*    this macro.                                                        */
-  /*                                                                       */
-#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
-          (FT_Tag)                        \
-          ( ( (FT_ULong)_x1 << 24 ) |     \
-            ( (FT_ULong)_x2 << 16 ) |     \
-            ( (FT_ULong)_x3 <<  8 ) |     \
-              (FT_ULong)_x4         )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*                                                                       */
-  /*                    L I S T   M A N A G E M E N T                      */
-  /*                                                                       */
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    list_processing                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_ListNode                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*     Many elements and objects in FreeType are listed through an       */
-  /*     @FT_List record (see @FT_ListRec).  As its name suggests, an      */
-  /*     FT_ListNode is a handle to a single list element.                 */
-  /*                                                                       */
-  typedef struct FT_ListNodeRec_*  FT_ListNode;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FT_List                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a list record (see @FT_ListRec).                       */
-  /*                                                                       */
-  typedef struct FT_ListRec_*  FT_List;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_ListNodeRec                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to hold a single list element.                    */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    prev :: The previous element in the list.  NULL if first.          */
-  /*                                                                       */
-  /*    next :: The next element in the list.  NULL if last.               */
-  /*                                                                       */
-  /*    data :: A typeless pointer to the listed object.                   */
-  /*                                                                       */
-  typedef struct  FT_ListNodeRec_
-  {
-    FT_ListNode  prev;
-    FT_ListNode  next;
-    void*        data;
-
-  } FT_ListNodeRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_ListRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to hold a simple doubly-linked list.  These are   */
-  /*    used in many parts of FreeType.                                    */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    head :: The head (first element) of doubly-linked list.            */
-  /*                                                                       */
-  /*    tail :: The tail (last element) of doubly-linked list.             */
-  /*                                                                       */
-  typedef struct  FT_ListRec_
-  {
-    FT_ListNode  head;
-    FT_ListNode  tail;
-
-  } FT_ListRec;
-
-  /* */
-
-
-#define FT_IS_EMPTY( list )  ( (list).head == 0 )
-#define FT_BOOL( x )  ( (FT_Bool)( x ) )
-
-  /* concatenate C tokens */
-#define FT_ERR_XCAT( x, y )  x ## y
-#define FT_ERR_CAT( x, y )   FT_ERR_XCAT( x, y )
-
-  /* see `ftmoderr.h' for descriptions of the following macros */
-
-#define FT_ERR( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
-
-#define FT_ERROR_BASE( x )    ( (x) & 0xFF )
-#define FT_ERROR_MODULE( x )  ( (x) & 0xFF00U )
-
-#define FT_ERR_EQ( x, e )                                        \
-          ( FT_ERROR_BASE( x ) == FT_ERROR_BASE( FT_ERR( e ) ) )
-#define FT_ERR_NEQ( x, e )                                       \
-          ( FT_ERROR_BASE( x ) != FT_ERROR_BASE( FT_ERR( e ) ) )
-
-
-FT_END_HEADER
-
-#endif /* FTTYPES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/autohint.h b/third_party/freetype/include/freetype/internal/autohint.h
deleted file mode 100644
index bae83e7..0000000
--- a/third_party/freetype/include/freetype/internal/autohint.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  autohint.h                                                             */
-/*                                                                         */
-/*    High-level `autohint' module-specific interface (specification).     */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The auto-hinter is used to load and automatically hint glyphs if a    */
-  /* format-specific hinter isn't available.                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef AUTOHINT_H_
-#define AUTOHINT_H_
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* A small technical note regarding automatic hinting in order to        */
-  /* clarify this module interface.                                        */
-  /*                                                                       */
-  /* An automatic hinter might compute two kinds of data for a given face: */
-  /*                                                                       */
-  /* - global hints: Usually some metrics that describe global properties  */
-  /*                 of the face.  It is computed by scanning more or less */
-  /*                 aggressively the glyphs in the face, and thus can be  */
-  /*                 very slow to compute (even if the size of global      */
-  /*                 hints is really small).                               */
-  /*                                                                       */
-  /* - glyph hints:  These describe some important features of the glyph   */
-  /*                 outline, as well as how to align them.  They are      */
-  /*                 generally much faster to compute than global hints.   */
-  /*                                                                       */
-  /* The current FreeType auto-hinter does a pretty good job while         */
-  /* performing fast computations for both global and glyph hints.         */
-  /* However, we might be interested in introducing more complex and       */
-  /* powerful algorithms in the future, like the one described in the John */
-  /* D. Hobby paper, which unfortunately requires a lot more horsepower.   */
-  /*                                                                       */
-  /* Because a sufficiently sophisticated font management system would     */
-  /* typically implement an LRU cache of opened face objects to reduce     */
-  /* memory usage, it is a good idea to be able to avoid recomputing       */
-  /* global hints every time the same face is re-opened.                   */
-  /*                                                                       */
-  /* We thus provide the ability to cache global hints outside of the face */
-  /* object, in order to speed up font re-opening time.  Of course, this   */
-  /* feature is purely optional, so most client programs won't even notice */
-  /* it.                                                                   */
-  /*                                                                       */
-  /* I initially thought that it would be a good idea to cache the glyph   */
-  /* hints too.  However, my general idea now is that if you really need   */
-  /* to cache these too, you are simply in need of a new font format,      */
-  /* where all this information could be stored within the font file and   */
-  /* decoded on the fly.                                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
-  typedef struct FT_AutoHinterRec_  *FT_AutoHinter;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_AutoHinter_GlobalGetFunc                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the global hints computed for a given face object.  The   */
-  /*    resulting data is dissociated from the face and will survive a     */
-  /*    call to FT_Done_Face().  It must be discarded through the API      */
-  /*    FT_AutoHinter_GlobalDoneFunc().                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    hinter       :: A handle to the source auto-hinter.                */
-  /*                                                                       */
-  /*    face         :: A handle to the source face object.                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    global_hints :: A typeless pointer to the global hints.            */
-  /*                                                                       */
-  /*    global_len   :: The size in bytes of the global hints.             */
-  /*                                                                       */
-  typedef void
-  (*FT_AutoHinter_GlobalGetFunc)( FT_AutoHinter  hinter,
-                                  FT_Face        face,
-                                  void**         global_hints,
-                                  long*          global_len );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_AutoHinter_GlobalDoneFunc                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Discard the global hints retrieved through                         */
-  /*    FT_AutoHinter_GlobalGetFunc().  This is the only way these hints   */
-  /*    are freed from memory.                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    hinter :: A handle to the auto-hinter module.                      */
-  /*                                                                       */
-  /*    global :: A pointer to retrieved global hints to discard.          */
-  /*                                                                       */
-  typedef void
-  (*FT_AutoHinter_GlobalDoneFunc)( FT_AutoHinter  hinter,
-                                   void*          global );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_AutoHinter_GlobalResetFunc                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used to recompute the global metrics in a given   */
-  /*    font.  This is useful when global font data changes (e.g. Multiple */
-  /*    Masters fonts where blend coordinates change).                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    hinter :: A handle to the source auto-hinter.                      */
-  /*                                                                       */
-  /*    face   :: A handle to the face.                                    */
-  /*                                                                       */
-  typedef void
-  (*FT_AutoHinter_GlobalResetFunc)( FT_AutoHinter  hinter,
-                                    FT_Face        face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_AutoHinter_GlyphLoadFunc                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used to load, scale, and automatically hint a     */
-  /*    glyph from a given face.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to the face.                               */
-  /*                                                                       */
-  /*    glyph_index :: The glyph index.                                    */
-  /*                                                                       */
-  /*    load_flags  :: The load flags.                                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function is capable of loading composite glyphs by hinting    */
-  /*    each sub-glyph independently (which improves quality).             */
-  /*                                                                       */
-  /*    It will call the font driver with @FT_Load_Glyph, with             */
-  /*    @FT_LOAD_NO_SCALE set.                                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_AutoHinter_GlyphLoadFunc)( FT_AutoHinter  hinter,
-                                  FT_GlyphSlot   slot,
-                                  FT_Size        size,
-                                  FT_UInt        glyph_index,
-                                  FT_Int32       load_flags );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_AutoHinter_InterfaceRec                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The auto-hinter module's interface.                                */
-  /*                                                                       */
-  typedef struct  FT_AutoHinter_InterfaceRec_
-  {
-    FT_AutoHinter_GlobalResetFunc  reset_face;
-    FT_AutoHinter_GlobalGetFunc    get_global_hints;
-    FT_AutoHinter_GlobalDoneFunc   done_global_hints;
-    FT_AutoHinter_GlyphLoadFunc    load_glyph;
-
-  } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface;
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_AUTOHINTER_INTERFACE(       \
-          class_,                             \
-          reset_face_,                        \
-          get_global_hints_,                  \
-          done_global_hints_,                 \
-          load_glyph_ )                       \
-  FT_CALLBACK_TABLE_DEF                       \
-  const FT_AutoHinter_InterfaceRec  class_ =  \
-  {                                           \
-    reset_face_,                              \
-    get_global_hints_,                        \
-    done_global_hints_,                       \
-    load_glyph_                               \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_AUTOHINTER_INTERFACE(                            \
-          class_,                                                  \
-          reset_face_,                                             \
-          get_global_hints_,                                       \
-          done_global_hints_,                                      \
-          load_glyph_ )                                            \
-  void                                                             \
-  FT_Init_Class_ ## class_( FT_Library                   library,  \
-                            FT_AutoHinter_InterfaceRec*  clazz )   \
-  {                                                                \
-    FT_UNUSED( library );                                          \
-                                                                   \
-    clazz->reset_face        = reset_face_;                        \
-    clazz->get_global_hints  = get_global_hints_;                  \
-    clazz->done_global_hints = done_global_hints_;                 \
-    clazz->load_glyph        = load_glyph_;                        \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-FT_END_HEADER
-
-#endif /* AUTOHINT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftcalc.h b/third_party/freetype/include/freetype/internal/ftcalc.h
deleted file mode 100644
index c9ac9d8..0000000
--- a/third_party/freetype/include/freetype/internal/ftcalc.h
+++ /dev/null
@@ -1,418 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcalc.h                                                               */
-/*                                                                         */
-/*    Arithmetic computations (specification).                             */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTCALC_H_
-#define FTCALC_H_
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FT_MulDiv() and FT_MulFix() are declared in freetype.h.               */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
-  /* Provide assembler fragments for performance-critical functions. */
-  /* These must be defined `static __inline__' with GCC.             */
-
-#if defined( __CC_ARM ) || defined( __ARMCC__ )  /* RVCT */
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
-
-  /* documentation is in freetype.h */
-
-  static __inline FT_Int32
-  FT_MulFix_arm( FT_Int32  a,
-                 FT_Int32  b )
-  {
-    FT_Int32  t, t2;
-
-
-    __asm
-    {
-      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
-      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
-      add   a,  a,  #0x8000         /* a  += 0x8000 */
-      adds  t2, t2, a               /* t2 += a */
-      adc   t,  t,  #0              /* t  += carry */
-      mov   a,  t2, lsr #16         /* a   = t2 >> 16 */
-      orr   a,  a,  t,  lsl #16     /* a  |= t << 16 */
-    }
-    return a;
-  }
-
-#endif /* __CC_ARM || __ARMCC__ */
-
-
-#ifdef __GNUC__
-
-#if defined( __arm__ )                                 && \
-    ( !defined( __thumb__ ) || defined( __thumb2__ ) ) && \
-    !( defined( __CC_ARM ) || defined( __ARMCC__ ) )
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_arm
-
-  /* documentation is in freetype.h */
-
-  static __inline__ FT_Int32
-  FT_MulFix_arm( FT_Int32  a,
-                 FT_Int32  b )
-  {
-    FT_Int32  t, t2;
-
-
-    __asm__ __volatile__ (
-      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
-      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
-#if defined( __clang__ ) && defined( __thumb2__ )
-      "add.w  %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
-#else
-      "add    %0, %0, #0x8000\n\t"      /* %0 += 0x8000 */
-#endif
-      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
-      "adc    %2, %2, #0\n\t"           /* %2 += carry */
-      "mov    %0, %1, lsr #16\n\t"      /* %0  = %1 >> 16 */
-      "orr    %0, %0, %2, lsl #16\n\t"  /* %0 |= %2 << 16 */
-      : "=r"(a), "=&r"(t2), "=&r"(t)
-      : "r"(a), "r"(b)
-      : "cc" );
-    return a;
-  }
-
-#endif /* __arm__                      && */
-       /* ( __thumb2__ || !__thumb__ ) && */
-       /* !( __CC_ARM || __ARMCC__ )      */
-
-
-#if defined( __i386__ )
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
-
-  /* documentation is in freetype.h */
-
-  static __inline__ FT_Int32
-  FT_MulFix_i386( FT_Int32  a,
-                  FT_Int32  b )
-  {
-    FT_Int32  result;
-
-
-    __asm__ __volatile__ (
-      "imul  %%edx\n"
-      "movl  %%edx, %%ecx\n"
-      "sarl  $31, %%ecx\n"
-      "addl  $0x8000, %%ecx\n"
-      "addl  %%ecx, %%eax\n"
-      "adcl  $0, %%edx\n"
-      "shrl  $16, %%eax\n"
-      "shll  $16, %%edx\n"
-      "addl  %%edx, %%eax\n"
-      : "=a"(result), "=d"(b)
-      : "a"(a), "d"(b)
-      : "%ecx", "cc" );
-    return result;
-  }
-
-#endif /* i386 */
-
-#endif /* __GNUC__ */
-
-
-#ifdef _MSC_VER /* Visual C++ */
-
-#ifdef _M_IX86
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_i386
-
-  /* documentation is in freetype.h */
-
-  static __inline FT_Int32
-  FT_MulFix_i386( FT_Int32  a,
-                  FT_Int32  b )
-  {
-    FT_Int32  result;
-
-    __asm
-    {
-      mov eax, a
-      mov edx, b
-      imul edx
-      mov ecx, edx
-      sar ecx, 31
-      add ecx, 8000h
-      add eax, ecx
-      adc edx, 0
-      shr eax, 16
-      shl edx, 16
-      add eax, edx
-      mov result, eax
-    }
-    return result;
-  }
-
-#endif /* _M_IX86 */
-
-#endif /* _MSC_VER */
-
-
-#if defined( __GNUC__ ) && defined( __x86_64__ )
-
-#define FT_MULFIX_ASSEMBLER  FT_MulFix_x86_64
-
-  static __inline__ FT_Int32
-  FT_MulFix_x86_64( FT_Int32  a,
-                    FT_Int32  b )
-  {
-    /* Temporarily disable the warning that C90 doesn't support */
-    /* `long long'.                                             */
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wlong-long"
-#endif
-
-#if 1
-    /* Technically not an assembly fragment, but GCC does a really good */
-    /* job at inlining it and generating good machine code for it.      */
-    long long  ret, tmp;
-
-
-    ret  = (long long)a * b;
-    tmp  = ret >> 63;
-    ret += 0x8000 + tmp;
-
-    return (FT_Int32)( ret >> 16 );
-#else
-
-    /* For some reason, GCC 4.6 on Ubuntu 12.04 generates invalid machine  */
-    /* code from the lines below.  The main issue is that `wide_a' is not  */
-    /* properly initialized by sign-extending `a'.  Instead, the generated */
-    /* machine code assumes that the register that contains `a' on input   */
-    /* can be used directly as a 64-bit value, which is wrong most of the  */
-    /* time.                                                               */
-    long long  wide_a = (long long)a;
-    long long  wide_b = (long long)b;
-    long long  result;
-
-
-    __asm__ __volatile__ (
-      "imul %2, %1\n"
-      "mov %1, %0\n"
-      "sar $63, %0\n"
-      "lea 0x8000(%1, %0), %0\n"
-      "sar $16, %0\n"
-      : "=&r"(result), "=&r"(wide_a)
-      : "r"(wide_b)
-      : "cc" );
-
-    return (FT_Int32)result;
-#endif
-
-#if __GNUC__ > 4 || ( __GNUC__ == 4 && __GNUC_MINOR__ >= 6 )
-#pragma GCC diagnostic pop
-#endif
-  }
-
-#endif /* __GNUC__ && __x86_64__ */
-
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
-
-#ifdef FT_CONFIG_OPTION_INLINE_MULFIX
-#ifdef FT_MULFIX_ASSEMBLER
-#define FT_MulFix( a, b )  FT_MULFIX_ASSEMBLER( (FT_Int32)(a), (FT_Int32)(b) )
-#endif
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_MulDiv_No_Round                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A very simple function used to perform the computation `(a*b)/c'   */
-  /*    (without rounding) with maximum accuracy (it uses 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>                                                              */
-  /*    The result of `(a*b)/c'.  This function never traps when trying to */
-  /*    divide by zero; it simply returns `MaxInt' or `MinInt' depending   */
-  /*    on the signs of `a' and `b'.                                       */
-  /*                                                                       */
-  FT_BASE( FT_Long )
-  FT_MulDiv_No_Round( FT_Long  a,
-                      FT_Long  b,
-                      FT_Long  c );
-
-
-  /*
-   *  A variant of FT_Matrix_Multiply which scales its result afterwards.
-   *  The idea is that both `a' and `b' are scaled by factors of 10 so that
-   *  the values are as precise as possible to get a correct result during
-   *  the 64bit multiplication.  Let `sa' and `sb' be the scaling factors of
-   *  `a' and `b', respectively, then the scaling factor of the result is
-   *  `sa*sb'.
-   */
-  FT_BASE( void )
-  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
-                             FT_Matrix        *b,
-                             FT_Long           scaling );
-
-
-  /*
-   *  A variant of FT_Vector_Transform.  See comments for
-   *  FT_Matrix_Multiply_Scaled.
-   */
-  FT_BASE( void )
-  FT_Vector_Transform_Scaled( FT_Vector*        vector,
-                              const FT_Matrix*  matrix,
-                              FT_Long           scaling );
-
-
-  /*
-   *  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
-   *  left, -1 to the right, and 0 for undecidable cases.
-   */
-  FT_BASE( FT_Int )
-  ft_corner_orientation( FT_Pos  in_x,
-                         FT_Pos  in_y,
-                         FT_Pos  out_x,
-                         FT_Pos  out_y );
-
-
-  /*
-   *  Return TRUE if a corner is flat or nearly flat.  This is equivalent to
-   *  saying that the corner point is close to its neighbors, or inside an
-   *  ellipse defined by the neighbor focal points to be more precise.
-   */
-  FT_BASE( FT_Int )
-  ft_corner_is_flat( FT_Pos  in_x,
-                     FT_Pos  in_y,
-                     FT_Pos  out_x,
-                     FT_Pos  out_y );
-
-
-  /*
-   *  Return the most significant bit index.
-   */
-
-#ifndef  FT_CONFIG_OPTION_NO_ASSEMBLER
-#if defined( __GNUC__ )                                          && \
-    ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) )
-
-#if FT_SIZEOF_INT == 4
-
-#define FT_MSB( x )  ( 31 - __builtin_clz( x ) )
-
-#elif FT_SIZEOF_LONG == 4
-
-#define FT_MSB( x )  ( 31 - __builtin_clzl( x ) )
-
-#endif
-
-#endif /* __GNUC__ */
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
-#ifndef FT_MSB
-
-  FT_BASE( FT_Int )
-  FT_MSB( FT_UInt32  z );
-
-#endif
-
-
-  /*
-   *  Return sqrt(x*x+y*y), which is the same as `FT_Vector_Length' but uses
-   *  two fixed-point arguments instead.
-   */
-  FT_BASE( FT_Fixed )
-  FT_Hypot( FT_Fixed  x,
-            FT_Fixed  y );
-
-
-#if 0
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_SqrtFixed                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the square root of a 16.16 fixed-point value.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    x :: The value to compute the root for.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The result of `sqrt(x)'.                                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function is not very fast.                                    */
-  /*                                                                       */
-  FT_BASE( FT_Int32 )
-  FT_SqrtFixed( FT_Int32  x );
-
-#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 FIXED_TO_INT( x )      ( FT_RoundFix( x ) >> 16 )
-
-#define ROUND_F26DOT6( x )     ( x >= 0 ? (    ( (x) + 32 ) & -64 )     \
-                                        : ( -( ( 32 - (x) ) & -64 ) ) )
-
-
-FT_END_HEADER
-
-#endif /* FTCALC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftdebug.h b/third_party/freetype/include/freetype/internal/ftdebug.h
deleted file mode 100644
index 5dcd2b1..0000000
--- a/third_party/freetype/include/freetype/internal/ftdebug.h
+++ /dev/null
@@ -1,255 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftdebug.h                                                              */
-/*                                                                         */
-/*    Debugging and logging component (specification).                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/*                                                                         */
-/*  IMPORTANT: A description of FreeType's debugging support can be        */
-/*             found in `docs/DEBUG.TXT'.  Read it if you need to use or   */
-/*             understand this code.                                       */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef FTDEBUG_H_
-#define FTDEBUG_H_
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* force the definition of FT_DEBUG_LEVEL_ERROR if FT_DEBUG_LEVEL_TRACE */
-  /* is already defined; this simplifies the following #ifdefs            */
-  /*                                                                      */
-#ifdef FT_DEBUG_LEVEL_TRACE
-#undef  FT_DEBUG_LEVEL_ERROR
-#define FT_DEBUG_LEVEL_ERROR
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define the trace enums as well as the trace levels array when they    */
-  /* are needed.                                                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-#define FT_TRACE_DEF( x )  trace_ ## x ,
-
-  /* defining the enumeration */
-  typedef enum  FT_Trace_
-  {
-#include FT_INTERNAL_TRACE_H
-    trace_count
-
-  } FT_Trace;
-
-
-  /* defining the array of trace levels, provided by `src/base/ftdebug.c' */
-  extern int  ft_trace_levels[trace_count];
-
-#undef FT_TRACE_DEF
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define the FT_TRACE macro                                             */
-  /*                                                                       */
-  /* IMPORTANT!                                                            */
-  /*                                                                       */
-  /* Each component must define the macro FT_COMPONENT to a valid FT_Trace */
-  /* value before using any TRACE macro.                                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-#define FT_TRACE( level, varformat )                      \
-          do                                              \
-          {                                               \
-            if ( ft_trace_levels[FT_COMPONENT] >= level ) \
-              FT_Message varformat;                       \
-          } while ( 0 )
-
-#else /* !FT_DEBUG_LEVEL_TRACE */
-
-#define FT_TRACE( level, varformat )  do { } while ( 0 )      /* nothing */
-
-#endif /* !FT_DEBUG_LEVEL_TRACE */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Trace_Get_Count                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the number of available trace components.                   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The number of trace components.  0 if FreeType 2 is not built with */
-  /*    FT_DEBUG_LEVEL_TRACE definition.                                   */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function may be useful if you want to access elements of      */
-  /*    the internal `ft_trace_levels' array by an index.                  */
-  /*                                                                       */
-  FT_BASE( FT_Int )
-  FT_Trace_Get_Count( void );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Trace_Get_Name                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the name of a trace component.                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    The index of the trace component.                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The name of the trace component.  This is a statically allocated   */
-  /*    C string, so do not free it after use.  NULL if FreeType 2 is not  */
-  /*    built with FT_DEBUG_LEVEL_TRACE definition.                        */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Use @FT_Trace_Get_Count to get the number of available trace       */
-  /*    components.                                                        */
-  /*                                                                       */
-  /*    This function may be useful if you want to control FreeType 2's    */
-  /*    debug level in your application.                                   */
-  /*                                                                       */
-  FT_BASE( const char* )
-  FT_Trace_Get_Name( FT_Int  idx );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* You need two opening and closing parentheses!                         */
-  /*                                                                       */
-  /* Example: FT_TRACE0(( "Value is %i", foo ))                            */
-  /*                                                                       */
-  /* Output of the FT_TRACEX macros is sent to stderr.                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-#define FT_TRACE0( varformat )  FT_TRACE( 0, varformat )
-#define FT_TRACE1( varformat )  FT_TRACE( 1, varformat )
-#define FT_TRACE2( varformat )  FT_TRACE( 2, varformat )
-#define FT_TRACE3( varformat )  FT_TRACE( 3, varformat )
-#define FT_TRACE4( varformat )  FT_TRACE( 4, varformat )
-#define FT_TRACE5( varformat )  FT_TRACE( 5, varformat )
-#define FT_TRACE6( varformat )  FT_TRACE( 6, varformat )
-#define FT_TRACE7( varformat )  FT_TRACE( 7, varformat )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define the FT_ERROR macro.                                            */
-  /*                                                                       */
-  /* Output of this macro is sent to stderr.                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-
-#define FT_ERROR( varformat )  FT_Message  varformat
-
-#else  /* !FT_DEBUG_LEVEL_ERROR */
-
-#define FT_ERROR( varformat )  do { } while ( 0 )      /* nothing */
-
-#endif /* !FT_DEBUG_LEVEL_ERROR */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define the FT_ASSERT and FT_THROW macros.  The call to `FT_Throw'     */
-  /* makes it possible to easily set a breakpoint at this function.        */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-
-#define FT_ASSERT( condition )                                      \
-          do                                                        \
-          {                                                         \
-            if ( !( condition ) )                                   \
-              FT_Panic( "assertion failed on line %d of file %s\n", \
-                        __LINE__, __FILE__ );                       \
-          } while ( 0 )
-
-#define FT_THROW( e )                                   \
-          ( FT_Throw( FT_ERR_CAT( FT_ERR_PREFIX, e ),   \
-                      __LINE__,                         \
-                      __FILE__ )                      | \
-            FT_ERR_CAT( FT_ERR_PREFIX, e )            )
-
-#else /* !FT_DEBUG_LEVEL_ERROR */
-
-#define FT_ASSERT( condition )  do { } while ( 0 )
-
-#define FT_THROW( e )  FT_ERR_CAT( FT_ERR_PREFIX, e )
-
-#endif /* !FT_DEBUG_LEVEL_ERROR */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define `FT_Message' and `FT_Panic' when needed.                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-
-#include "stdio.h"  /* for vfprintf() */
-
-  /* print a message */
-  FT_BASE( void )
-  FT_Message( const char*  fmt,
-              ... );
-
-  /* print a message and exit */
-  FT_BASE( void )
-  FT_Panic( const char*  fmt,
-            ... );
-
-  /* report file name and line number of an error */
-  FT_BASE( int )
-  FT_Throw( FT_Error     error,
-            int          line,
-            const char*  file );
-
-#endif /* FT_DEBUG_LEVEL_ERROR */
-
-
-  FT_BASE( void )
-  ft_debug_init( void );
-
-FT_END_HEADER
-
-#endif /* FTDEBUG_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftdriver.h b/third_party/freetype/include/freetype/internal/ftdriver.h
deleted file mode 100644
index e82fa8d..0000000
--- a/third_party/freetype/include/freetype/internal/ftdriver.h
+++ /dev/null
@@ -1,400 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftdriver.h                                                             */
-/*                                                                         */
-/*    FreeType font driver interface (specification).                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-
-  typedef FT_Error
-  (*FT_Face_InitFunc)( FT_Stream      stream,
-                       FT_Face        face,
-                       FT_Int         typeface_index,
-                       FT_Int         num_params,
-                       FT_Parameter*  parameters );
-
-  typedef void
-  (*FT_Face_DoneFunc)( FT_Face  face );
-
-
-  typedef FT_Error
-  (*FT_Size_InitFunc)( FT_Size  size );
-
-  typedef void
-  (*FT_Size_DoneFunc)( FT_Size  size );
-
-
-  typedef FT_Error
-  (*FT_Slot_InitFunc)( FT_GlyphSlot  slot );
-
-  typedef void
-  (*FT_Slot_DoneFunc)( FT_GlyphSlot  slot );
-
-
-  typedef FT_Error
-  (*FT_Size_RequestFunc)( FT_Size          size,
-                          FT_Size_Request  req );
-
-  typedef FT_Error
-  (*FT_Size_SelectFunc)( FT_Size   size,
-                         FT_ULong  size_index );
-
-  typedef FT_Error
-  (*FT_Slot_LoadFunc)( FT_GlyphSlot  slot,
-                       FT_Size       size,
-                       FT_UInt       glyph_index,
-                       FT_Int32      load_flags );
-
-
-  typedef FT_Error
-  (*FT_Face_GetKerningFunc)( FT_Face     face,
-                             FT_UInt     left_glyph,
-                             FT_UInt     right_glyph,
-                             FT_Vector*  kerning );
-
-
-  typedef FT_Error
-  (*FT_Face_AttachFunc)( FT_Face    face,
-                         FT_Stream  stream );
-
-
-  typedef FT_Error
-  (*FT_Face_GetAdvancesFunc)( FT_Face    face,
-                              FT_UInt    first,
-                              FT_UInt    count,
-                              FT_Int32   flags,
-                              FT_Fixed*  advances );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Driver_ClassRec                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The font driver class.  This structure mostly contains pointers to */
-  /*    driver methods.                                                    */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root             :: The parent module.                             */
-  /*                                                                       */
-  /*    face_object_size :: The size of a face object in bytes.            */
-  /*                                                                       */
-  /*    size_object_size :: The size of a size object in bytes.            */
-  /*                                                                       */
-  /*    slot_object_size :: The size of a glyph object in bytes.           */
-  /*                                                                       */
-  /*    init_face        :: The format-specific face constructor.          */
-  /*                                                                       */
-  /*    done_face        :: The format-specific face destructor.           */
-  /*                                                                       */
-  /*    init_size        :: The format-specific size constructor.          */
-  /*                                                                       */
-  /*    done_size        :: The format-specific size destructor.           */
-  /*                                                                       */
-  /*    init_slot        :: The format-specific slot constructor.          */
-  /*                                                                       */
-  /*    done_slot        :: The format-specific slot destructor.           */
-  /*                                                                       */
-  /*                                                                       */
-  /*    load_glyph       :: A function handle to load a glyph to a slot.   */
-  /*                        This field is mandatory!                       */
-  /*                                                                       */
-  /*    get_kerning      :: A function handle to return the unscaled       */
-  /*                        kerning for a given pair of glyphs.  Can be    */
-  /*                        set to 0 if the format doesn't support         */
-  /*                        kerning.                                       */
-  /*                                                                       */
-  /*    attach_file      :: This function handle is used to read           */
-  /*                        additional data for a face from another        */
-  /*                        file/stream.  For example, this can be used to */
-  /*                        add data from AFM or PFM files on a Type 1     */
-  /*                        face, or a CIDMap on a CID-keyed face.         */
-  /*                                                                       */
-  /*    get_advances     :: A function handle used to return advance       */
-  /*                        widths of `count' glyphs (in font units),      */
-  /*                        starting at `first'.  The `vertical' flag must */
-  /*                        be set to get vertical advance heights.  The   */
-  /*                        `advances' buffer is caller-allocated.         */
-  /*                        The idea of this function is to be able to     */
-  /*                        perform device-independent text layout without */
-  /*                        loading a single glyph image.                  */
-  /*                                                                       */
-  /*    request_size     :: A handle to a function used to request the new */
-  /*                        character size.  Can be set to 0 if the        */
-  /*                        scaling done in the base layer suffices.       */
-  /*                                                                       */
-  /*    select_size      :: A handle to a function used to select a new    */
-  /*                        fixed size.  It is used only if                */
-  /*                        @FT_FACE_FLAG_FIXED_SIZES is set.  Can be set  */
-  /*                        to 0 if the scaling done in the base layer     */
-  /*                        suffices.                                      */
-  /* <Note>                                                                */
-  /*    Most function pointers, with the exception of `load_glyph', can be */
-  /*    set to 0 to indicate a default behaviour.                          */
-  /*                                                                       */
-  typedef struct  FT_Driver_ClassRec_
-  {
-    FT_Module_Class          root;
-
-    FT_Long                  face_object_size;
-    FT_Long                  size_object_size;
-    FT_Long                  slot_object_size;
-
-    FT_Face_InitFunc         init_face;
-    FT_Face_DoneFunc         done_face;
-
-    FT_Size_InitFunc         init_size;
-    FT_Size_DoneFunc         done_size;
-
-    FT_Slot_InitFunc         init_slot;
-    FT_Slot_DoneFunc         done_slot;
-
-    FT_Slot_LoadFunc         load_glyph;
-
-    FT_Face_GetKerningFunc   get_kerning;
-    FT_Face_AttachFunc       attach_file;
-    FT_Face_GetAdvancesFunc  get_advances;
-
-    /* since version 2.2 */
-    FT_Size_RequestFunc      request_size;
-    FT_Size_SelectFunc       select_size;
-
-  } FT_Driver_ClassRec, *FT_Driver_Class;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DECLARE_DRIVER                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to create a forward declaration of an FT_Driver_ClassRec      */
-  /*    struct instance.                                                   */
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_DRIVER                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of FT_Driver_ClassRec struct.       */
-  /*                                                                       */
-  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function has 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.                                 */
-  /*                                                                       */
-  /*    `ftinit.c' (ft_create_default_module_classes) already contains a   */
-  /*    mechanism to call these functions for the default modules          */
-  /*    described in `ftmodule.h'.                                         */
-  /*                                                                       */
-  /*    Notice that the created `create' and `destroy' functions call      */
-  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
-  /*    initialize any additional global data, like a module specific      */
-  /*    interface, and put them in the global pic container defined in     */
-  /*    `ftpic.h'.  If you don't need them just implement the functions as */
-  /*    empty to resolve the link error.  Also the `pic_init' and          */
-  /*    `pic_free' functions should be declared in `pic.h', to be referred */
-  /*    by driver definition calling `FT_DEFINE_DRIVER' in following.      */
-  /*                                                                       */
-  /*    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).                                                             */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DECLARE_DRIVER( class_ )  \
-  FT_CALLBACK_TABLE                  \
-  const FT_Driver_ClassRec  class_;
-
-#define FT_DEFINE_DRIVER(                    \
-          class_,                            \
-          flags_,                            \
-          size_,                             \
-          name_,                             \
-          version_,                          \
-          requires_,                         \
-          interface_,                        \
-          init_,                             \
-          done_,                             \
-          get_interface_,                    \
-          face_object_size_,                 \
-          size_object_size_,                 \
-          slot_object_size_,                 \
-          init_face_,                        \
-          done_face_,                        \
-          init_size_,                        \
-          done_size_,                        \
-          init_slot_,                        \
-          done_slot_,                        \
-          load_glyph_,                       \
-          get_kerning_,                      \
-          attach_file_,                      \
-          get_advances_,                     \
-          request_size_,                     \
-          select_size_ )                     \
-  FT_CALLBACK_TABLE_DEF                      \
-  const FT_Driver_ClassRec  class_ =         \
-  {                                          \
-    FT_DEFINE_ROOT_MODULE( flags_,           \
-                           size_,            \
-                           name_,            \
-                           version_,         \
-                           requires_,        \
-                           interface_,       \
-                           init_,            \
-                           done_,            \
-                           get_interface_ )  \
-                                             \
-    face_object_size_,                       \
-    size_object_size_,                       \
-    slot_object_size_,                       \
-                                             \
-    init_face_,                              \
-    done_face_,                              \
-                                             \
-    init_size_,                              \
-    done_size_,                              \
-                                             \
-    init_slot_,                              \
-    done_slot_,                              \
-                                             \
-    load_glyph_,                             \
-                                             \
-    get_kerning_,                            \
-    attach_file_,                            \
-    get_advances_,                           \
-                                             \
-    request_size_,                           \
-    select_size_                             \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DECLARE_DRIVER( class_ )  FT_DECLARE_MODULE( class_ )
-
-#define FT_DEFINE_DRIVER(                                        \
-          class_,                                                \
-          flags_,                                                \
-          size_,                                                 \
-          name_,                                                 \
-          version_,                                              \
-          requires_,                                             \
-          interface_,                                            \
-          init_,                                                 \
-          done_,                                                 \
-          get_interface_,                                        \
-          face_object_size_,                                     \
-          size_object_size_,                                     \
-          slot_object_size_,                                     \
-          init_face_,                                            \
-          done_face_,                                            \
-          init_size_,                                            \
-          done_size_,                                            \
-          init_slot_,                                            \
-          done_slot_,                                            \
-          load_glyph_,                                           \
-          get_kerning_,                                          \
-          attach_file_,                                          \
-          get_advances_,                                         \
-          request_size_,                                         \
-          select_size_ )                                         \
-  void                                                           \
-  FT_Destroy_Class_ ## class_( FT_Library        library,        \
-                               FT_Module_Class*  clazz )         \
-  {                                                              \
-    FT_Memory        memory = library->memory;                   \
-    FT_Driver_Class  dclazz = (FT_Driver_Class)clazz;            \
-                                                                 \
-                                                                 \
-    class_ ## _pic_free( library );                              \
-    if ( dclazz )                                                \
-      FT_FREE( dclazz );                                         \
-  }                                                              \
-                                                                 \
-                                                                 \
-  FT_Error                                                       \
-  FT_Create_Class_ ## class_( FT_Library         library,        \
-                              FT_Module_Class**  output_class )  \
-  {                                                              \
-    FT_Driver_Class  clazz  = NULL;                              \
-    FT_Error         error;                                      \
-    FT_Memory        memory = library->memory;                   \
-                                                                 \
-                                                                 \
-    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
-      return error;                                              \
-                                                                 \
-    error = class_ ## _pic_init( library );                      \
-    if ( error )                                                 \
-    {                                                            \
-      FT_FREE( clazz );                                          \
-      return error;                                              \
-    }                                                            \
-                                                                 \
-    FT_DEFINE_ROOT_MODULE( flags_,                               \
-                           size_,                                \
-                           name_,                                \
-                           version_,                             \
-                           requires_,                            \
-                           interface_,                           \
-                           init_,                                \
-                           done_,                                \
-                           get_interface_ )                      \
-                                                                 \
-    clazz->face_object_size = face_object_size_;                 \
-    clazz->size_object_size = size_object_size_;                 \
-    clazz->slot_object_size = slot_object_size_;                 \
-                                                                 \
-    clazz->init_face        = init_face_;                        \
-    clazz->done_face        = done_face_;                        \
-                                                                 \
-    clazz->init_size        = init_size_;                        \
-    clazz->done_size        = done_size_;                        \
-                                                                 \
-    clazz->init_slot        = init_slot_;                        \
-    clazz->done_slot        = done_slot_;                        \
-                                                                 \
-    clazz->load_glyph       = load_glyph_;                       \
-                                                                 \
-    clazz->get_kerning      = get_kerning_;                      \
-    clazz->attach_file      = attach_file_;                      \
-    clazz->get_advances     = get_advances_;                     \
-                                                                 \
-    clazz->request_size     = request_size_;                     \
-    clazz->select_size      = select_size_;                      \
-                                                                 \
-    *output_class = (FT_Module_Class*)clazz;                     \
-                                                                 \
-    return FT_Err_Ok;                                            \
-  }
-
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-FT_END_HEADER
-
-#endif /* FTDRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftgloadr.h b/third_party/freetype/include/freetype/internal/ftgloadr.h
deleted file mode 100644
index f41c3df..0000000
--- a/third_party/freetype/include/freetype/internal/ftgloadr.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgloadr.h                                                             */
-/*                                                                         */
-/*    The FreeType glyph loader (specification).                           */
-/*                                                                         */
-/*  Copyright 2002-2017 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 FTGLOADR_H_
-#define FTGLOADR_H_
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_GlyphLoader                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The glyph loader is an internal object used to load several glyphs */
-  /*    together (for example, in the case of composites).                 */
-  /*                                                                       */
-  typedef struct  FT_SubGlyphRec_
-  {
-    FT_Int     index;
-    FT_UShort  flags;
-    FT_Int     arg1;
-    FT_Int     arg2;
-    FT_Matrix  transform;
-
-  } FT_SubGlyphRec;
-
-
-  typedef struct  FT_GlyphLoadRec_
-  {
-    FT_Outline   outline;       /* outline                   */
-    FT_Vector*   extra_points;  /* extra points table        */
-    FT_Vector*   extra_points2; /* second extra points table */
-    FT_UInt      num_subglyphs; /* number of subglyphs       */
-    FT_SubGlyph  subglyphs;     /* subglyphs                 */
-
-  } FT_GlyphLoadRec, *FT_GlyphLoad;
-
-
-  typedef struct  FT_GlyphLoaderRec_
-  {
-    FT_Memory        memory;
-    FT_UInt          max_points;
-    FT_UInt          max_contours;
-    FT_UInt          max_subglyphs;
-    FT_Bool          use_extra;
-
-    FT_GlyphLoadRec  base;
-    FT_GlyphLoadRec  current;
-
-    void*            other;            /* for possible future extension? */
-
-  } FT_GlyphLoaderRec, *FT_GlyphLoader;
-
-
-  /* create new empty glyph loader */
-  FT_BASE( FT_Error )
-  FT_GlyphLoader_New( FT_Memory        memory,
-                      FT_GlyphLoader  *aloader );
-
-  /* add an extra points table to a glyph loader */
-  FT_BASE( FT_Error )
-  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader );
-
-  /* destroy a glyph loader */
-  FT_BASE( void )
-  FT_GlyphLoader_Done( FT_GlyphLoader  loader );
-
-  /* reset a glyph loader (frees everything int it) */
-  FT_BASE( void )
-  FT_GlyphLoader_Reset( FT_GlyphLoader  loader );
-
-  /* rewind a glyph loader */
-  FT_BASE( void )
-  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader );
-
-  /* check that there is enough space to add `n_points' and `n_contours' */
-  /* to the glyph loader                                                 */
-  FT_BASE( FT_Error )
-  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
-                              FT_UInt         n_points,
-                              FT_UInt         n_contours );
-
-
-#define FT_GLYPHLOADER_CHECK_P( _loader, _count )       \
-  ( (_count) == 0                                    || \
-    ( (FT_UInt)(_loader)->base.outline.n_points    +    \
-      (FT_UInt)(_loader)->current.outline.n_points +    \
-      (FT_UInt)(_count) ) <= (_loader)->max_points   )
-
-#define FT_GLYPHLOADER_CHECK_C( _loader, _count )         \
-  ( (_count) == 0                                      || \
-    ( (FT_UInt)(_loader)->base.outline.n_contours    +    \
-      (FT_UInt)(_loader)->current.outline.n_contours +    \
-      (FT_UInt)(_count) ) <= (_loader)->max_contours   )
-
-#define FT_GLYPHLOADER_CHECK_POINTS( _loader, _points, _contours ) \
-  ( ( FT_GLYPHLOADER_CHECK_P( _loader, _points )   &&              \
-      FT_GLYPHLOADER_CHECK_C( _loader, _contours ) )               \
-    ? 0                                                            \
-    : FT_GlyphLoader_CheckPoints( (_loader),                       \
-                                  (FT_UInt)(_points),              \
-                                  (FT_UInt)(_contours) ) )
-
-
-  /* check that there is enough space to add `n_subs' sub-glyphs to */
-  /* a glyph loader                                                 */
-  FT_BASE( FT_Error )
-  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
-                                 FT_UInt         n_subs );
-
-  /* prepare a glyph loader, i.e. empty the current glyph */
-  FT_BASE( void )
-  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader );
-
-  /* add the current glyph to the base glyph */
-  FT_BASE( void )
-  FT_GlyphLoader_Add( FT_GlyphLoader  loader );
-
-  /* copy points from one glyph loader to another */
-  FT_BASE( FT_Error )
-  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
-                             FT_GlyphLoader  source );
-
- /* */
-
-
-FT_END_HEADER
-
-#endif /* FTGLOADR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/fthash.h b/third_party/freetype/include/freetype/internal/fthash.h
deleted file mode 100644
index f22f9d5..0000000
--- a/third_party/freetype/include/freetype/internal/fthash.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  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/third_party/freetype/include/freetype/internal/ftmemory.h b/third_party/freetype/include/freetype/internal/ftmemory.h
deleted file mode 100644
index 59e5b58..0000000
--- a/third_party/freetype/include/freetype/internal/ftmemory.h
+++ /dev/null
@@ -1,393 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmemory.h                                                             */
-/*                                                                         */
-/*    The FreeType memory management macros (specification).               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTMEMORY_H_
-#define FTMEMORY_H_
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_SET_ERROR                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This macro is used to set an implicit `error' variable to a given  */
-  /*    expression's value (usually a function call), and convert it to a  */
-  /*    boolean which is set whenever the value is != 0.                   */
-  /*                                                                       */
-#undef  FT_SET_ERROR
-#define FT_SET_ERROR( expression ) \
-          ( ( error = (expression) ) != 0 )
-
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                           M E M O R Y                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*
-   *  C++ refuses to handle statements like p = (void*)anything, with `p' a
-   *  typed pointer.  Since we don't have a `typeof' operator in standard
-   *  C++, we have to use a template to emulate it.
-   */
-
-#ifdef __cplusplus
-
-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) )
-
-#else
-
-#define FT_ASSIGNP( p, val )  (p) = (val)
-
-#endif
-
-
-
-#ifdef FT_DEBUG_MEMORY
-
-  FT_BASE( const char* )  _ft_debug_file;
-  FT_BASE( long )         _ft_debug_lineno;
-
-#define FT_DEBUG_INNER( exp )  ( _ft_debug_file   = __FILE__, \
-                                 _ft_debug_lineno = __LINE__, \
-                                 (exp) )
-
-#define FT_ASSIGNP_INNER( p, exp )  ( _ft_debug_file   = __FILE__, \
-                                      _ft_debug_lineno = __LINE__, \
-                                      FT_ASSIGNP( p, exp ) )
-
-#else /* !FT_DEBUG_MEMORY */
-
-#define FT_DEBUG_INNER( exp )       (exp)
-#define FT_ASSIGNP_INNER( p, exp )  FT_ASSIGNP( p, exp )
-
-#endif /* !FT_DEBUG_MEMORY */
-
-
-  /*
-   *  The allocation functions return a pointer, and the error code
-   *  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,
-                FT_Error  *p_error );
-
-  FT_BASE( FT_Pointer )
-  ft_mem_qalloc( FT_Memory  memory,
-                 FT_Long    size,
-                 FT_Error  *p_error );
-
-  FT_BASE( FT_Pointer )
-  ft_mem_realloc( FT_Memory  memory,
-                  FT_Long    item_size,
-                  FT_Long    cur_count,
-                  FT_Long    new_count,
-                  void*      block,
-                  FT_Error  *p_error );
-
-  FT_BASE( FT_Pointer )
-  ft_mem_qrealloc( FT_Memory  memory,
-                   FT_Long    item_size,
-                   FT_Long    cur_count,
-                   FT_Long    new_count,
-                   void*      block,
-                   FT_Error  *p_error );
-
-  FT_BASE( void )
-  ft_mem_free( FT_Memory    memory,
-               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), \
-                                               &error ) )
-
-#define FT_MEM_FREE( ptr )                \
-          FT_BEGIN_STMNT                  \
-            ft_mem_free( memory, (ptr) ); \
-            (ptr) = NULL;                 \
-          FT_END_STMNT
-
-#define FT_MEM_NEW( ptr )                        \
-          FT_MEM_ALLOC( ptr, sizeof ( *(ptr) ) )
-
-#define FT_MEM_REALLOC( ptr, cursz, newsz )                        \
-          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,           \
-                                                 1,                \
-                                                 (FT_Long)(cursz), \
-                                                 (FT_Long)(newsz), \
-                                                 (ptr),            \
-                                                 &error ) )
-
-#define FT_MEM_QALLOC( ptr, size )                               \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qalloc( memory,          \
-                                                (FT_Long)(size), \
-                                                &error ) )
-
-#define FT_MEM_QNEW( ptr )                        \
-          FT_MEM_QALLOC( ptr, sizeof ( *(ptr) ) )
-
-#define FT_MEM_QREALLOC( ptr, cursz, newsz )                        \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,           \
-                                                  1,                \
-                                                  (FT_Long)(cursz), \
-                                                  (FT_Long)(newsz), \
-                                                  (ptr),            \
-                                                  &error ) )
-
-#define FT_MEM_ALLOC_MULT( ptr, count, item_size )                     \
-          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,               \
-                                                 (FT_Long)(item_size), \
-                                                 0,                    \
-                                                 (FT_Long)(count),     \
-                                                 NULL,                 \
-                                                 &error ) )
-
-#define FT_MEM_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )           \
-          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
-                                                 (FT_Long)(itmsz),  \
-                                                 (FT_Long)(oldcnt), \
-                                                 (FT_Long)(newcnt), \
-                                                 (ptr),             \
-                                                 &error ) )
-
-#define FT_MEM_QALLOC_MULT( ptr, count, item_size )                     \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,               \
-                                                  (FT_Long)(item_size), \
-                                                  0,                    \
-                                                  (FT_Long)(count),     \
-                                                  NULL,                 \
-                                                  &error ) )
-
-#define FT_MEM_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz)            \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
-                                                  (FT_Long)(itmsz),  \
-                                                  (FT_Long)(oldcnt), \
-                                                  (FT_Long)(newcnt), \
-                                                  (ptr),             \
-                                                  &error ) )
-
-
-#define FT_MEM_SET_ERROR( cond )  ( (cond), error != 0 )
-
-
-#define FT_MEM_SET( dest, byte, count )               \
-          ft_memset( dest, byte, (FT_Offset)(count) )
-
-#define FT_MEM_COPY( dest, source, count )              \
-          ft_memcpy( dest, source, (FT_Offset)(count) )
-
-#define FT_MEM_MOVE( dest, source, count )               \
-          ft_memmove( dest, source, (FT_Offset)(count) )
-
-
-#define FT_MEM_ZERO( dest, count )  FT_MEM_SET( dest, 0, count )
-
-#define FT_ZERO( p )                FT_MEM_ZERO( p, sizeof ( *(p) ) )
-
-
-#define FT_ARRAY_ZERO( dest, count )                             \
-          FT_MEM_ZERO( dest,                                     \
-                       (FT_Offset)(count) * sizeof ( *(dest) ) )
-
-#define FT_ARRAY_COPY( dest, source, count )                     \
-          FT_MEM_COPY( dest,                                     \
-                       source,                                   \
-                       (FT_Offset)(count) * sizeof ( *(dest) ) )
-
-#define FT_ARRAY_MOVE( dest, source, count )                     \
-          FT_MEM_MOVE( dest,                                     \
-                       source,                                   \
-                       (FT_Offset)(count) * sizeof ( *(dest) ) )
-
-
-  /*
-   *  Return the maximum number of addressable elements in an array.
-   *  We limit ourselves to INT_MAX, rather than UINT_MAX, to avoid
-   *  any problems.
-   */
-#define FT_ARRAY_MAX( ptr )           ( FT_INT_MAX / sizeof ( *(ptr) ) )
-
-#define FT_ARRAY_CHECK( ptr, count )  ( (count) <= FT_ARRAY_MAX( ptr ) )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The following functions macros expect that their pointer argument is  */
-  /* _typed_ in order to automatically compute array element sizes.        */
-  /*                                                                       */
-
-#define FT_MEM_NEW_ARRAY( ptr, count )                              \
-          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
-                                                 sizeof ( *(ptr) ), \
-                                                 0,                 \
-                                                 (FT_Long)(count),  \
-                                                 NULL,              \
-                                                 &error ) )
-
-#define FT_MEM_RENEW_ARRAY( ptr, cursz, newsz )                     \
-          FT_ASSIGNP_INNER( ptr, ft_mem_realloc( memory,            \
-                                                 sizeof ( *(ptr) ), \
-                                                 (FT_Long)(cursz),  \
-                                                 (FT_Long)(newsz),  \
-                                                 (ptr),             \
-                                                 &error ) )
-
-#define FT_MEM_QNEW_ARRAY( ptr, count )                              \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
-                                                  sizeof ( *(ptr) ), \
-                                                  0,                 \
-                                                  (FT_Long)(count),  \
-                                                  NULL,              \
-                                                  &error ) )
-
-#define FT_MEM_QRENEW_ARRAY( ptr, cursz, newsz )                     \
-          FT_ASSIGNP_INNER( ptr, ft_mem_qrealloc( memory,            \
-                                                  sizeof ( *(ptr) ), \
-                                                  (FT_Long)(cursz),  \
-                                                  (FT_Long)(newsz),  \
-                                                  (ptr),             \
-                                                  &error ) )
-
-#define FT_ALLOC( ptr, size )                           \
-          FT_MEM_SET_ERROR( FT_MEM_ALLOC( ptr, size ) )
-
-#define FT_REALLOC( ptr, cursz, newsz )                           \
-          FT_MEM_SET_ERROR( FT_MEM_REALLOC( ptr, cursz, newsz ) )
-
-#define FT_ALLOC_MULT( ptr, count, item_size )                           \
-          FT_MEM_SET_ERROR( FT_MEM_ALLOC_MULT( ptr, count, item_size ) )
-
-#define FT_REALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
-          FT_MEM_SET_ERROR( FT_MEM_REALLOC_MULT( ptr, oldcnt,      \
-                                                 newcnt, itmsz ) )
-
-#define FT_QALLOC( ptr, size )                           \
-          FT_MEM_SET_ERROR( FT_MEM_QALLOC( ptr, size ) )
-
-#define FT_QREALLOC( ptr, cursz, newsz )                           \
-          FT_MEM_SET_ERROR( FT_MEM_QREALLOC( ptr, cursz, newsz ) )
-
-#define FT_QALLOC_MULT( ptr, count, item_size )                           \
-          FT_MEM_SET_ERROR( FT_MEM_QALLOC_MULT( ptr, count, item_size ) )
-
-#define FT_QREALLOC_MULT( ptr, oldcnt, newcnt, itmsz )              \
-          FT_MEM_SET_ERROR( FT_MEM_QREALLOC_MULT( ptr, oldcnt,      \
-                                                  newcnt, itmsz ) )
-
-#define FT_FREE( ptr )  FT_MEM_FREE( ptr )
-
-#define FT_NEW( ptr )  FT_MEM_SET_ERROR( FT_MEM_NEW( ptr ) )
-
-#define FT_NEW_ARRAY( ptr, count )                           \
-          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
-
-#define FT_RENEW_ARRAY( ptr, curcnt, newcnt )                           \
-          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
-
-#define FT_QNEW( ptr )                           \
-          FT_MEM_SET_ERROR( FT_MEM_QNEW( ptr ) )
-
-#define FT_QNEW_ARRAY( ptr, count )                          \
-          FT_MEM_SET_ERROR( FT_MEM_NEW_ARRAY( ptr, count ) )
-
-#define FT_QRENEW_ARRAY( ptr, curcnt, newcnt )                          \
-          FT_MEM_SET_ERROR( FT_MEM_RENEW_ARRAY( ptr, curcnt, newcnt ) )
-
-
-  FT_BASE( FT_Pointer )
-  ft_mem_strdup( FT_Memory    memory,
-                 const char*  str,
-                 FT_Error    *p_error );
-
-  FT_BASE( FT_Pointer )
-  ft_mem_dup( FT_Memory    memory,
-              const void*  address,
-              FT_ULong     size,
-              FT_Error    *p_error );
-
-
-#define FT_MEM_STRDUP( dst, str )                                            \
-          (dst) = (char*)ft_mem_strdup( memory, (const char*)(str), &error )
-
-#define FT_STRDUP( dst, str )                           \
-          FT_MEM_SET_ERROR( FT_MEM_STRDUP( dst, str ) )
-
-#define FT_MEM_DUP( dst, address, size )                                    \
-          (dst) = ft_mem_dup( memory, (address), (FT_ULong)(size), &error )
-
-#define FT_DUP( dst, address, size )                           \
-          FT_MEM_SET_ERROR( FT_MEM_DUP( dst, address, size ) )
-
-
-  /* Return >= 1 if a truncation occurs.            */
-  /* Return 0 if the source string fits the buffer. */
-  /* This is *not* the same as strlcpy().           */
-  FT_BASE( FT_Int )
-  ft_mem_strcpyn( char*        dst,
-                  const char*  src,
-                  FT_ULong     size );
-
-#define FT_STRCPYN( dst, src, size )                                         \
-          ft_mem_strcpyn( (char*)dst, (const char*)(src), (FT_ULong)(size) )
-
- /* */
-
-
-FT_END_HEADER
-
-#endif /* FTMEMORY_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftobjs.h b/third_party/freetype/include/freetype/internal/ftobjs.h
deleted file mode 100644
index 772d82c..0000000
--- a/third_party/freetype/include/freetype/internal/ftobjs.h
+++ /dev/null
@@ -1,1570 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftobjs.h                                                               */
-/*                                                                         */
-/*    The FreeType private base classes (specification).                   */
-/*                                                                         */
-/*  Copyright 1996-2017 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 contains the definition of all internal FreeType classes.  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTOBJS_H_
-#define FTOBJS_H_
-
-#include <ft2build.h>
-#include FT_RENDER_H
-#include FT_SIZES_H
-#include FT_LCD_FILTER_H
-#include FT_INTERNAL_MEMORY_H
-#include FT_INTERNAL_GLYPH_LOADER_H
-#include FT_INTERNAL_DRIVER_H
-#include FT_INTERNAL_AUTOHINT_H
-#include FT_INTERNAL_SERVICE_H
-#include FT_INTERNAL_PIC_H
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-#include FT_INCREMENTAL_H
-#endif
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Some generic definitions.                                             */
-  /*                                                                       */
-#ifndef TRUE
-#define TRUE  1
-#endif
-
-#ifndef FALSE
-#define FALSE  0
-#endif
-
-#ifndef NULL
-#define NULL  (void*)0
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The min and max functions missing in C.  As usual, be careful not to  */
-  /* write things like FT_MIN( a++, b++ ) to avoid side effects.           */
-  /*                                                                       */
-#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) )
-
-  /*
-   *  Approximate sqrt(x*x+y*y) using the `alpha max plus beta min'
-   *  algorithm.  We use alpha = 1, beta = 3/8, giving us results with a
-   *  largest error less than 7% compared to the exact value.
-   */
-#define FT_HYPOT( x, y )                 \
-          ( x = FT_ABS( x ),             \
-            y = FT_ABS( y ),             \
-            x > y ? x + ( 3 * y >> 3 )   \
-                  : y + ( 3 * x >> 3 ) )
-
-  /* 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) & ~FT_TYPEOF( x )63 )
-#define FT_PIX_ROUND( x )     FT_PIX_FLOOR( (x) + 32 )
-#define FT_PIX_CEIL( x )      FT_PIX_FLOOR( (x) + 63 )
-
-
-  /*
-   *  character classification functions -- since these are used to parse
-   *  font files, we must not use those in <ctypes.h> which are
-   *  locale-dependent
-   */
-#define  ft_isdigit( x )   ( ( (unsigned)(x) - '0' ) < 10U )
-
-#define  ft_isxdigit( x )  ( ( (unsigned)(x) - '0' ) < 10U || \
-                             ( (unsigned)(x) - 'a' ) < 6U  || \
-                             ( (unsigned)(x) - 'A' ) < 6U  )
-
-  /* the next two macros assume ASCII representation */
-#define  ft_isupper( x )  ( ( (unsigned)(x) - 'A' ) < 26U )
-#define  ft_islower( x )  ( ( (unsigned)(x) - 'a' ) < 26U )
-
-#define  ft_isalpha( x )  ( ft_isupper( x ) || ft_islower( x ) )
-#define  ft_isalnum( x )  ( ft_isdigit( x ) || ft_isalpha( x ) )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                       C H A R M A P S                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* handle to internal charmap object */
-  typedef struct FT_CMapRec_*              FT_CMap;
-
-  /* handle to charmap class structure */
-  typedef const struct FT_CMap_ClassRec_*  FT_CMap_Class;
-
-  /* internal charmap object structure */
-  typedef struct  FT_CMapRec_
-  {
-    FT_CharMapRec  charmap;
-    FT_CMap_Class  clazz;
-
-  } FT_CMapRec;
-
-  /* typecase 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
-#define FT_CMAP_ENCODING_ID( x )  FT_CMAP( x )->charmap.encoding_id
-#define FT_CMAP_ENCODING( x )     FT_CMAP( x )->charmap.encoding
-#define FT_CMAP_FACE( x )         FT_CMAP( x )->charmap.face
-
-
-  /* class method definitions */
-  typedef FT_Error
-  (*FT_CMap_InitFunc)( FT_CMap     cmap,
-                       FT_Pointer  init_data );
-
-  typedef void
-  (*FT_CMap_DoneFunc)( FT_CMap  cmap );
-
-  typedef FT_UInt
-  (*FT_CMap_CharIndexFunc)( FT_CMap    cmap,
-                            FT_UInt32  char_code );
-
-  typedef FT_UInt
-  (*FT_CMap_CharNextFunc)( FT_CMap     cmap,
-                           FT_UInt32  *achar_code );
-
-  typedef FT_UInt
-  (*FT_CMap_CharVarIndexFunc)( FT_CMap    cmap,
-                               FT_CMap    unicode_cmap,
-                               FT_UInt32  char_code,
-                               FT_UInt32  variant_selector );
-
-  typedef FT_Bool
-  (*FT_CMap_CharVarIsDefaultFunc)( FT_CMap    cmap,
-                                   FT_UInt32  char_code,
-                                   FT_UInt32  variant_selector );
-
-  typedef FT_UInt32 *
-  (*FT_CMap_VariantListFunc)( FT_CMap    cmap,
-                              FT_Memory  mem );
-
-  typedef FT_UInt32 *
-  (*FT_CMap_CharVariantListFunc)( FT_CMap    cmap,
-                                  FT_Memory  mem,
-                                  FT_UInt32  char_code );
-
-  typedef FT_UInt32 *
-  (*FT_CMap_VariantCharListFunc)( FT_CMap    cmap,
-                                  FT_Memory  mem,
-                                  FT_UInt32  variant_selector );
-
-
-  typedef struct  FT_CMap_ClassRec_
-  {
-    FT_ULong               size;
-
-    FT_CMap_InitFunc       init;
-    FT_CMap_DoneFunc       done;
-    FT_CMap_CharIndexFunc  char_index;
-    FT_CMap_CharNextFunc   char_next;
-
-    /* Subsequent entries are special ones for format 14 -- the variant */
-    /* selector subtable which behaves like no other                    */
-
-    FT_CMap_CharVarIndexFunc      char_var_index;
-    FT_CMap_CharVarIsDefaultFunc  char_var_default;
-    FT_CMap_VariantListFunc       variant_list;
-    FT_CMap_CharVariantListFunc   charvariant_list;
-    FT_CMap_VariantCharListFunc   variantchar_list;
-
-  } FT_CMap_ClassRec;
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DECLARE_CMAP_CLASS( class_ )              \
-  FT_CALLBACK_TABLE const  FT_CMap_ClassRec class_;
-
-#define FT_DEFINE_CMAP_CLASS(       \
-          class_,                   \
-          size_,                    \
-          init_,                    \
-          done_,                    \
-          char_index_,              \
-          char_next_,               \
-          char_var_index_,          \
-          char_var_default_,        \
-          variant_list_,            \
-          charvariant_list_,        \
-          variantchar_list_ )       \
-  FT_CALLBACK_TABLE_DEF             \
-  const FT_CMap_ClassRec  class_ =  \
-  {                                 \
-    size_,                          \
-    init_,                          \
-    done_,                          \
-    char_index_,                    \
-    char_next_,                     \
-    char_var_index_,                \
-    char_var_default_,              \
-    variant_list_,                  \
-    charvariant_list_,              \
-    variantchar_list_               \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DECLARE_CMAP_CLASS( class_ )                  \
-  void                                                   \
-  FT_Init_Class_ ## class_( FT_Library         library,  \
-                            FT_CMap_ClassRec*  clazz );
-
-#define FT_DEFINE_CMAP_CLASS(                            \
-          class_,                                        \
-          size_,                                         \
-          init_,                                         \
-          done_,                                         \
-          char_index_,                                   \
-          char_next_,                                    \
-          char_var_index_,                               \
-          char_var_default_,                             \
-          variant_list_,                                 \
-          charvariant_list_,                             \
-          variantchar_list_ )                            \
-  void                                                   \
-  FT_Init_Class_ ## class_( FT_Library         library,  \
-                            FT_CMap_ClassRec*  clazz )   \
-  {                                                      \
-    FT_UNUSED( library );                                \
-                                                         \
-    clazz->size             = size_;                     \
-    clazz->init             = init_;                     \
-    clazz->done             = done_;                     \
-    clazz->char_index       = char_index_;               \
-    clazz->char_next        = char_next_;                \
-    clazz->char_var_index   = char_var_index_;           \
-    clazz->char_var_default = char_var_default_;         \
-    clazz->variant_list     = variant_list_;             \
-    clazz->charvariant_list = charvariant_list_;         \
-    clazz->variantchar_list = variantchar_list_;         \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /* create a new charmap and add it to charmap->face */
-  FT_BASE( FT_Error )
-  FT_CMap_New( FT_CMap_Class  clazz,
-               FT_Pointer     init_data,
-               FT_CharMap     charmap,
-               FT_CMap       *acmap );
-
-  /* destroy a charmap and remove it from face's list */
-  FT_BASE( void )
-  FT_CMap_Done( FT_CMap  cmap );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Face_InternalRec                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure contains the internal fields of each FT_Face        */
-  /*    object.  These fields may change between different releases of     */
-  /*    FreeType.                                                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    max_points ::                                                      */
-  /*      The maximum number of points used to store the vectorial outline */
-  /*      of any glyph in this face.  If this value cannot be known in     */
-  /*      advance, or if the face isn't scalable, this should be set to 0. */
-  /*      Only relevant for scalable formats.                              */
-  /*                                                                       */
-  /*    max_contours ::                                                    */
-  /*      The maximum number of contours used to store the vectorial       */
-  /*      outline of any glyph in this face.  If this value cannot be      */
-  /*      known in advance, or if the face isn't scalable, this should be  */
-  /*      set to 0.  Only relevant for scalable formats.                   */
-  /*                                                                       */
-  /*    transform_matrix ::                                                */
-  /*      A 2x2 matrix of 16.16 coefficients used to transform glyph       */
-  /*      outlines after they are loaded from the font.  Only used by the  */
-  /*      convenience functions.                                           */
-  /*                                                                       */
-  /*    transform_delta ::                                                 */
-  /*      A translation vector used to transform glyph outlines after they */
-  /*      are loaded from the font.  Only used by the convenience          */
-  /*      functions.                                                       */
-  /*                                                                       */
-  /*    transform_flags ::                                                 */
-  /*      Some flags used to classify the transform.  Only used by the     */
-  /*      convenience functions.                                           */
-  /*                                                                       */
-  /*    services ::                                                        */
-  /*      A cache for frequently used services.  It should be only         */
-  /*      accessed with the macro `FT_FACE_LOOKUP_SERVICE'.                */
-  /*                                                                       */
-  /*    incremental_interface ::                                           */
-  /*      If non-null, the interface through which glyph data and metrics  */
-  /*      are loaded incrementally for faces that do not provide all of    */
-  /*      this data when first opened.  This field exists only if          */
-  /*      @FT_CONFIG_OPTION_INCREMENTAL is defined.                        */
-  /*                                                                       */
-  /*    refcount ::                                                        */
-  /*      A counter initialized to~1 at the time an @FT_Face structure is  */
-  /*      created.  @FT_Reference_Face increments this counter, and        */
-  /*      @FT_Done_Face only destroys a face if the counter is~1,          */
-  /*      otherwise it simply decrements it.                               */
-  /*                                                                       */
-  typedef struct  FT_Face_InternalRec_
-  {
-    FT_Matrix           transform_matrix;
-    FT_Vector           transform_delta;
-    FT_Int              transform_flags;
-
-    FT_ServiceCacheRec  services;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_InterfaceRec*  incremental_interface;
-#endif
-
-    FT_Int              refcount;
-
-  } FT_Face_InternalRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Slot_InternalRec                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure contains the internal fields of each FT_GlyphSlot   */
-  /*    object.  These fields may change between different releases of     */
-  /*    FreeType.                                                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    loader            :: The glyph loader object used to load outlines */
-  /*                         into the glyph slot.                          */
-  /*                                                                       */
-  /*    flags             :: Possible values are zero or                   */
-  /*                         FT_GLYPH_OWN_BITMAP.  The latter indicates    */
-  /*                         that the FT_GlyphSlot structure owns the      */
-  /*                         bitmap buffer.                                */
-  /*                                                                       */
-  /*    glyph_transformed :: Boolean.  Set to TRUE when the loaded glyph   */
-  /*                         must be transformed through a specific        */
-  /*                         font transformation.  This is _not_ the same  */
-  /*                         as the face transform set through             */
-  /*                         FT_Set_Transform().                           */
-  /*                                                                       */
-  /*    glyph_matrix      :: The 2x2 matrix corresponding to the glyph     */
-  /*                         transformation, if necessary.                 */
-  /*                                                                       */
-  /*    glyph_delta       :: The 2d translation vector corresponding to    */
-  /*                         the glyph transformation, if necessary.       */
-  /*                                                                       */
-  /*    glyph_hints       :: Format-specific glyph hints management.       */
-  /*                                                                       */
-
-#define FT_GLYPH_OWN_BITMAP  0x1U
-
-  typedef struct  FT_Slot_InternalRec_
-  {
-    FT_GlyphLoader  loader;
-    FT_UInt         flags;
-    FT_Bool         glyph_transformed;
-    FT_Matrix       glyph_matrix;
-    FT_Vector       glyph_delta;
-    void*           glyph_hints;
-
-  } FT_GlyphSlot_InternalRec;
-
-
-#if 0
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_Size_InternalRec                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure contains the internal fields of each FT_Size        */
-  /*    object.  Currently, it's empty.                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-  typedef struct  FT_Size_InternalRec_
-  {
-    /* empty */
-
-  } FT_Size_InternalRec;
-
-#endif
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                         M O D U L E S                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_ModuleRec                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A module object instance.                                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    clazz   :: A pointer to the module's class.                        */
-  /*                                                                       */
-  /*    library :: A handle to the parent library object.                  */
-  /*                                                                       */
-  /*    memory  :: A handle to the memory manager.                         */
-  /*                                                                       */
-  typedef struct  FT_ModuleRec_
-  {
-    FT_Module_Class*  clazz;
-    FT_Library        library;
-    FT_Memory         memory;
-
-  } FT_ModuleRec;
-
-
-  /* typecast an object to an FT_Module */
-#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
-
-
-#define FT_MODULE_IS_DRIVER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
-                                    FT_MODULE_FONT_DRIVER )
-
-#define FT_MODULE_IS_RENDERER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
-                                      FT_MODULE_RENDERER )
-
-#define FT_MODULE_IS_HINTER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
-                                    FT_MODULE_HINTER )
-
-#define FT_MODULE_IS_STYLER( x )  ( FT_MODULE_CLASS( x )->module_flags & \
-                                    FT_MODULE_STYLER )
-
-#define FT_DRIVER_IS_SCALABLE( x )  ( FT_MODULE_CLASS( x )->module_flags & \
-                                      FT_MODULE_DRIVER_SCALABLE )
-
-#define FT_DRIVER_USES_OUTLINES( x )  !( FT_MODULE_CLASS( x )->module_flags & \
-                                         FT_MODULE_DRIVER_NO_OUTLINES )
-
-#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 )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Module_Interface                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finds a module and returns its specific interface as a typeless    */
-  /*    pointer.                                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library     :: A handle to the library object.                     */
-  /*                                                                       */
-  /*    module_name :: The module's name (as an ASCII string).             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A module-specific interface if available, 0 otherwise.             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    You should better be familiar with FreeType internals to know      */
-  /*    which module to look for, and what its interface is :-)            */
-  /*                                                                       */
-  FT_BASE( const void* )
-  FT_Get_Module_Interface( FT_Library   library,
-                           const char*  mod_name );
-
-  FT_BASE( FT_Pointer )
-  ft_module_get_service( FT_Module    module,
-                         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
-
-  /* */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****   F A C E,   S I Z E   &   G L Y P H   S L O T   O B J E C T S  ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* 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_DRIVER( x )   FT_FACE( x )->driver
-#define FT_FACE_LIBRARY( x )  FT_FACE_DRIVER( x )->root.library
-#define FT_FACE_MEMORY( x )   FT_FACE( x )->memory
-#define FT_FACE_STREAM( x )   FT_FACE( x )->stream
-
-#define FT_SIZE_FACE( x )     FT_SIZE( x )->face
-#define FT_SLOT_FACE( x )     FT_SLOT( x )->face
-
-#define FT_FACE_SLOT( x )     FT_FACE( x )->glyph
-#define FT_FACE_SIZE( x )     FT_FACE( x )->size
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_GlyphSlot                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    It is sometimes useful to have more than one glyph slot for a      */
-  /*    given face object.  This function is used to create additional     */
-  /*    slots.  All of them are automatically discarded when the face is   */
-  /*    destroyed.                                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face  :: A handle to a parent face object.                         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aslot :: A handle to a new glyph slot object.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_BASE( FT_Error )
-  FT_New_GlyphSlot( FT_Face        face,
-                    FT_GlyphSlot  *aslot );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_GlyphSlot                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroys a given glyph slot.  Remember however that all slots are  */
-  /*    automatically destroyed with its parent.  Using this function is   */
-  /*    not always mandatory.                                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    slot :: A handle to a target glyph slot.                           */
-  /*                                                                       */
-  FT_BASE( void )
-  FT_Done_GlyphSlot( FT_GlyphSlot  slot );
-
- /* */
-
-#define FT_REQUEST_WIDTH( req )                                            \
-          ( (req)->horiResolution                                          \
-              ? ( (req)->width * (FT_Pos)(req)->horiResolution + 36 ) / 72 \
-              : (req)->width )
-
-#define FT_REQUEST_HEIGHT( req )                                            \
-          ( (req)->vertResolution                                           \
-              ? ( (req)->height * (FT_Pos)(req)->vertResolution + 36 ) / 72 \
-              : (req)->height )
-
-
-  /* Set the metrics according to a bitmap strike. */
-  FT_BASE( void )
-  FT_Select_Metrics( FT_Face   face,
-                     FT_ULong  strike_index );
-
-
-  /* Set the metrics according to a size request. */
-  FT_BASE( void )
-  FT_Request_Metrics( FT_Face          face,
-                      FT_Size_Request  req );
-
-
-  /* Match a size request against `available_sizes'. */
-  FT_BASE( FT_Error )
-  FT_Match_Size( FT_Face          face,
-                 FT_Size_Request  req,
-                 FT_Bool          ignore_width,
-                 FT_ULong*        size_index );
-
-
-  /* Use the horizontal metrics to synthesize the vertical metrics. */
-  /* If `advance' is zero, it is also synthesized.                  */
-  FT_BASE( void )
-  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
-                                  FT_Pos             advance );
-
-
-  /* Free the bitmap of a given glyphslot when needed (i.e., only when it */
-  /* was allocated with ft_glyphslot_alloc_bitmap).                       */
-  FT_BASE( void )
-  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot );
-
-
-  /* Allocate a new bitmap buffer in a glyph slot. */
-  FT_BASE( FT_Error )
-  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
-                             FT_ULong      size );
-
-
-  /* Set the bitmap buffer in a glyph slot to a given pointer.  The buffer */
-  /* will not be freed by a later call to ft_glyphslot_free_bitmap.        */
-  FT_BASE( void )
-  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
-                           FT_Byte*      buffer );
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                        R E N D E R E R S                        ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-#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_
-  {
-    FT_ModuleRec            root;
-    FT_Renderer_Class*      clazz;
-    FT_Glyph_Format         glyph_format;
-    FT_Glyph_Class          glyph_class;
-
-    FT_Raster               raster;
-    FT_Raster_Render_Func   raster_render;
-    FT_Renderer_RenderFunc  render;
-
-  } FT_RendererRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                    F O N T   D R I V E R S                      ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* typecast a module into a driver easily */
-#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
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_DriverRec                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The root font driver class.  A font driver is responsible for      */
-  /*    managing and loading font files of a given format.                 */
-  /*                                                                       */
-  /*  <Fields>                                                             */
-  /*     root         :: Contains the fields of the root module class.     */
-  /*                                                                       */
-  /*     clazz        :: A pointer to the font driver's class.  Note that  */
-  /*                     this is NOT root.clazz.  `class' wasn't used      */
-  /*                     as it is a reserved word in C++.                  */
-  /*                                                                       */
-  /*     faces_list   :: The list of faces currently opened by this        */
-  /*                     driver.                                           */
-  /*                                                                       */
-  /*     glyph_loader :: Unused.  Used to be glyph loader for all faces    */
-  /*                     managed by this driver.                           */
-  /*                                                                       */
-  typedef struct  FT_DriverRec_
-  {
-    FT_ModuleRec     root;
-    FT_Driver_Class  clazz;
-    FT_ListRec       faces_list;
-    FT_GlyphLoader   glyph_loader;
-
-  } FT_DriverRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                       L I B R A R I E S                         ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* 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
-
-
-  typedef void  (*FT_Bitmap_LcdFilterFunc)( FT_Bitmap*      bitmap,
-                                            FT_Render_Mode  render_mode,
-                                            FT_Library      library );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_LibraryRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The FreeType library class.  This is the root of all FreeType      */
-  /*    data.  Use FT_New_Library() to create a library object, and        */
-  /*    FT_Done_Library() to discard it and all child objects.             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    memory           :: The library's memory object.  Manages memory   */
-  /*                        allocation.                                    */
-  /*                                                                       */
-  /*    version_major    :: The major version number of the library.       */
-  /*                                                                       */
-  /*    version_minor    :: The minor version number of the library.       */
-  /*                                                                       */
-  /*    version_patch    :: The current patch level of the library.        */
-  /*                                                                       */
-  /*    num_modules      :: The number of modules currently registered     */
-  /*                        within this library.  This is set to 0 for new */
-  /*                        libraries.  New modules are added through the  */
-  /*                        FT_Add_Module() API function.                  */
-  /*                                                                       */
-  /*    modules          :: A table used to store handles to the currently */
-  /*                        registered modules. Note that each font driver */
-  /*                        contains a list of its opened faces.           */
-  /*                                                                       */
-  /*    renderers        :: The list of renderers currently registered     */
-  /*                        within the library.                            */
-  /*                                                                       */
-  /*    cur_renderer     :: The current outline renderer.  This is a       */
-  /*                        shortcut used to avoid parsing the list on     */
-  /*                        each call to FT_Outline_Render().  It is a     */
-  /*                        handle to the current renderer for the         */
-  /*                        FT_GLYPH_FORMAT_OUTLINE format.                */
-  /*                                                                       */
-  /*    auto_hinter      :: XXX                                            */
-  /*                                                                       */
-  /*    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.     */
-  /*                                                                       */
-  /*    lcd_weights      :: If subpixel rendering is activated, the LCD    */
-  /*                        filter weights, if any.                        */
-  /*                                                                       */
-  /*    lcd_filter_func  :: If subpixel rendering is activated, the LCD    */
-  /*                        filtering callback function.                   */
-  /*                                                                       */
-  /*    pic_container    :: Contains global structs and tables, instead    */
-  /*                        of defining them globally.                     */
-  /*                                                                       */
-  /*    refcount         :: A counter initialized to~1 at the time an      */
-  /*                        @FT_Library structure is created.              */
-  /*                        @FT_Reference_Library increments this counter, */
-  /*                        and @FT_Done_Library only destroys a library   */
-  /*                        if the counter is~1, otherwise it simply       */
-  /*                        decrements it.                                 */
-  /*                                                                       */
-  typedef struct  FT_LibraryRec_
-  {
-    FT_Memory          memory;           /* library's memory manager */
-
-    FT_Int             version_major;
-    FT_Int             version_minor;
-    FT_Int             version_patch;
-
-    FT_UInt            num_modules;
-    FT_Module          modules[FT_MAX_MODULES];  /* module objects  */
-
-    FT_ListRec         renderers;        /* list of renderers        */
-    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[5];   /* filter weights, if any */
-    FT_Bitmap_LcdFilterFunc  lcd_filter_func;  /* filtering callback     */
-#endif
-
-#ifdef FT_CONFIG_OPTION_PIC
-    FT_PIC_Container   pic_container;
-#endif
-
-    FT_Int             refcount;
-
-  } FT_LibraryRec;
-
-
-  FT_BASE( FT_Renderer )
-  FT_Lookup_Renderer( FT_Library       library,
-                      FT_Glyph_Format  format,
-                      FT_ListNode*     node );
-
-  FT_BASE( FT_Error )
-  FT_Render_Glyph_Internal( FT_Library      library,
-                            FT_GlyphSlot    slot,
-                            FT_Render_Mode  render_mode );
-
-  typedef const char*
-  (*FT_Face_GetPostscriptNameFunc)( FT_Face  face );
-
-  typedef FT_Error
-  (*FT_Face_GetGlyphNameFunc)( FT_Face     face,
-                               FT_UInt     glyph_index,
-                               FT_Pointer  buffer,
-                               FT_UInt     buffer_max );
-
-  typedef FT_UInt
-  (*FT_Face_GetGlyphNameIndexFunc)( FT_Face     face,
-                                    FT_String*  glyph_name );
-
-
-#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Memory                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Creates a new memory object.                                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A pointer to the new memory object.  0 in case of error.           */
-  /*                                                                       */
-  FT_BASE( FT_Memory )
-  FT_New_Memory( void );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Done_Memory                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Discards memory manager.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the memory manager.                          */
-  /*                                                                       */
-  FT_BASE( void )
-  FT_Done_Memory( FT_Memory  memory );
-
-#endif /* !FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
-
-
-  /* Define default raster's interface.  The default raster is located in  */
-  /* `src/base/ftraster.c'.                                                */
-  /*                                                                       */
-  /* Client applications can register new rasters through the              */
-  /* FT_Set_Raster() API.                                                  */
-
-#ifndef FT_NO_DEFAULT_RASTER
-  FT_EXPORT_VAR( FT_Raster_Funcs )  ft_default_raster;
-#endif
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                      P I C   S U P P O R T                      ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* PIC support macros for ftimage.h */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_OUTLINE_FUNCS                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of FT_Outline_Funcs struct.         */
-  /*    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).                                                          */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_OUTLINE_FUNCS(           \
-          class_,                          \
-          move_to_,                        \
-          line_to_,                        \
-          conic_to_,                       \
-          cubic_to_,                       \
-          shift_,                          \
-          delta_ )                         \
-  static const  FT_Outline_Funcs class_ =  \
-  {                                        \
-    move_to_,                              \
-    line_to_,                              \
-    conic_to_,                             \
-    cubic_to_,                             \
-    shift_,                                \
-    delta_                                 \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_OUTLINE_FUNCS(                     \
-          class_,                                    \
-          move_to_,                                  \
-          line_to_,                                  \
-          conic_to_,                                 \
-          cubic_to_,                                 \
-          shift_,                                    \
-          delta_ )                                   \
-  static FT_Error                                    \
-  Init_Class_ ## class_( FT_Outline_Funcs*  clazz )  \
-  {                                                  \
-    clazz->move_to  = move_to_;                      \
-    clazz->line_to  = line_to_;                      \
-    clazz->conic_to = conic_to_;                     \
-    clazz->cubic_to = cubic_to_;                     \
-    clazz->shift    = shift_;                        \
-    clazz->delta    = delta_;                        \
-                                                     \
-    return FT_Err_Ok;                                \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_RASTER_FUNCS                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of FT_Raster_Funcs struct.          */
-  /*    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).                                                          */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_RASTER_FUNCS(    \
-          class_,                  \
-          glyph_format_,           \
-          raster_new_,             \
-          raster_reset_,           \
-          raster_set_mode_,        \
-          raster_render_,          \
-          raster_done_ )           \
-  const FT_Raster_Funcs  class_ =  \
-  {                                \
-    glyph_format_,                 \
-    raster_new_,                   \
-    raster_reset_,                 \
-    raster_set_mode_,              \
-    raster_render_,                \
-    raster_done_                   \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_RASTER_FUNCS(                        \
-          class_,                                      \
-          glyph_format_,                               \
-          raster_new_,                                 \
-          raster_reset_,                               \
-          raster_set_mode_,                            \
-          raster_render_,                              \
-          raster_done_ )                               \
-  void                                                 \
-  FT_Init_Class_ ## class_( FT_Raster_Funcs*  clazz )  \
-  {                                                    \
-    clazz->glyph_format    = glyph_format_;            \
-    clazz->raster_new      = raster_new_;              \
-    clazz->raster_reset    = raster_reset_;            \
-    clazz->raster_set_mode = raster_set_mode_;         \
-    clazz->raster_render   = raster_render_;           \
-    clazz->raster_done     = raster_done_;             \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /* PIC support macros for ftrender.h */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_GLYPH                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of FT_Glyph_Class struct.           */
-  /*    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).                                                          */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_GLYPH(          \
-          class_,                 \
-          size_,                  \
-          format_,                \
-          init_,                  \
-          done_,                  \
-          copy_,                  \
-          transform_,             \
-          bbox_,                  \
-          prepare_ )              \
-  FT_CALLBACK_TABLE_DEF           \
-  const FT_Glyph_Class  class_ =  \
-  {                               \
-    size_,                        \
-    format_,                      \
-    init_,                        \
-    done_,                        \
-    copy_,                        \
-    transform_,                   \
-    bbox_,                        \
-    prepare_                      \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_GLYPH(                              \
-          class_,                                     \
-          size_,                                      \
-          format_,                                    \
-          init_,                                      \
-          done_,                                      \
-          copy_,                                      \
-          transform_,                                 \
-          bbox_,                                      \
-          prepare_ )                                  \
-  void                                                \
-  FT_Init_Class_ ## class_( FT_Glyph_Class*  clazz )  \
-  {                                                   \
-    clazz->glyph_size      = size_;                   \
-    clazz->glyph_format    = format_;                 \
-    clazz->glyph_init      = init_;                   \
-    clazz->glyph_done      = done_;                   \
-    clazz->glyph_copy      = copy_;                   \
-    clazz->glyph_transform = transform_;              \
-    clazz->glyph_bbox      = bbox_;                   \
-    clazz->glyph_prepare   = prepare_;                \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DECLARE_RENDERER                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to create a forward declaration of a                          */
-  /*    FT_Renderer_Class struct instance.                                 */
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_RENDERER                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of FT_Renderer_Class struct.        */
-  /*                                                                       */
-  /*    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.                     */
-  /*    `ftinit.c' (ft_create_default_module_classes) already contains     */
-  /*    a mechanism to call these functions for the default modules        */
-  /*    described in `ftmodule.h'.                                         */
-  /*                                                                       */
-  /*    Notice that the created `create' and `destroy' functions call      */
-  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
-  /*    initialize any additional global data, like a module specific      */
-  /*    interface, and put them in the global pic container defined in     */
-  /*    `ftpic.h'.  If you don't need them just implement the functions as */
-  /*    empty to resolve the link error.  Also the `pic_init' and          */
-  /*    `pic_free' functions should be declared in `pic.h', to be referred */
-  /*    by the renderer definition calling `FT_DEFINE_RENDERER' in the     */
-  /*    following.                                                         */
-  /*                                                                       */
-  /*    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).                                                          */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DECLARE_RENDERER( class_ )               \
-  FT_EXPORT_VAR( const FT_Renderer_Class ) class_;
-
-#define FT_DEFINE_RENDERER(                  \
-          class_,                            \
-          flags_,                            \
-          size_,                             \
-          name_,                             \
-          version_,                          \
-          requires_,                         \
-          interface_,                        \
-          init_,                             \
-          done_,                             \
-          get_interface_,                    \
-          glyph_format_,                     \
-          render_glyph_,                     \
-          transform_glyph_,                  \
-          get_glyph_cbox_,                   \
-          set_mode_,                         \
-          raster_class_ )                    \
-  FT_CALLBACK_TABLE_DEF                      \
-  const FT_Renderer_Class  class_ =          \
-  {                                          \
-    FT_DEFINE_ROOT_MODULE( flags_,           \
-                           size_,            \
-                           name_,            \
-                           version_,         \
-                           requires_,        \
-                           interface_,       \
-                           init_,            \
-                           done_,            \
-                           get_interface_ )  \
-    glyph_format_,                           \
-                                             \
-    render_glyph_,                           \
-    transform_glyph_,                        \
-    get_glyph_cbox_,                         \
-    set_mode_,                               \
-                                             \
-    raster_class_                            \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DECLARE_RENDERER( class_ )  FT_DECLARE_MODULE( class_ )
-
-#define FT_DEFINE_RENDERER(                                      \
-          class_,                                                \
-          flags_,                                                \
-          size_,                                                 \
-          name_,                                                 \
-          version_,                                              \
-          requires_,                                             \
-          interface_,                                            \
-          init_,                                                 \
-          done_,                                                 \
-          get_interface_,                                        \
-          glyph_format_,                                         \
-          render_glyph_,                                         \
-          transform_glyph_,                                      \
-          get_glyph_cbox_,                                       \
-          set_mode_,                                             \
-          raster_class_ )                                        \
-  void                                                           \
-  FT_Destroy_Class_ ## class_( FT_Library        library,        \
-                               FT_Module_Class*  clazz )         \
-  {                                                              \
-    FT_Renderer_Class*  rclazz = (FT_Renderer_Class*)clazz;      \
-    FT_Memory           memory = library->memory;                \
-                                                                 \
-                                                                 \
-    class_ ## _pic_free( library );                              \
-    if ( rclazz )                                                \
-      FT_FREE( rclazz );                                         \
-  }                                                              \
-                                                                 \
-                                                                 \
-  FT_Error                                                       \
-  FT_Create_Class_ ## class_( FT_Library         library,        \
-                              FT_Module_Class**  output_class )  \
-  {                                                              \
-    FT_Renderer_Class*  clazz = NULL;                            \
-    FT_Error            error;                                   \
-    FT_Memory           memory = library->memory;                \
-                                                                 \
-                                                                 \
-    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
-      return error;                                              \
-                                                                 \
-    error = class_ ## _pic_init( library );                      \
-    if ( error )                                                 \
-    {                                                            \
-      FT_FREE( clazz );                                          \
-      return error;                                              \
-    }                                                            \
-                                                                 \
-    FT_DEFINE_ROOT_MODULE( flags_,                               \
-                           size_,                                \
-                           name_,                                \
-                           version_,                             \
-                           requires_,                            \
-                           interface_,                           \
-                           init_,                                \
-                           done_,                                \
-                           get_interface_ )                      \
-                                                                 \
-    clazz->glyph_format    = glyph_format_;                      \
-                                                                 \
-    clazz->render_glyph    = render_glyph_;                      \
-    clazz->transform_glyph = transform_glyph_;                   \
-    clazz->get_glyph_cbox  = get_glyph_cbox_;                    \
-    clazz->set_mode        = set_mode_;                          \
-                                                                 \
-    clazz->raster_class    = raster_class_;                      \
-                                                                 \
-    *output_class = (FT_Module_Class*)clazz;                     \
-                                                                 \
-    return FT_Err_Ok;                                            \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /* PIC support macros for ftmodapi.h **/
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Module_Creator                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to create (allocate) a new module class object.    */
-  /*    The object's members are initialized, but the module itself is     */
-  /*    not.                                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory       :: A handle to the memory manager.                    */
-  /*    output_class :: Initialized with the newly allocated class.        */
-  /*                                                                       */
-  typedef FT_Error
-  (*FT_Module_Creator)( FT_Memory          memory,
-                        FT_Module_Class**  output_class );
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    FT_Module_Destroyer                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to destroy (deallocate) a module class object.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the memory manager.                          */
-  /*    clazz  :: Module class to destroy.                                 */
-  /*                                                                       */
-  typedef void
-  (*FT_Module_Destroyer)( FT_Memory         memory,
-                          FT_Module_Class*  clazz );
-
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DECLARE_MODULE                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to create a forward declaration of a                          */
-  /*    FT_Module_Class struct instance.                                   */
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_MODULE                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of an FT_Module_Class struct.       */
-  /*                                                                       */
-  /*    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.                     */
-  /*    `ftinit.c' (ft_create_default_module_classes) already contains     */
-  /*    a mechanism to call these functions for the default modules        */
-  /*    described in `ftmodule.h'.                                         */
-  /*                                                                       */
-  /*    Notice that the created `create' and `destroy' functions call      */
-  /*    `pic_init' and `pic_free' to allow you to manually allocate and    */
-  /*    initialize any additional global data, like a module specific      */
-  /*    interface, and put them in the global pic container defined in     */
-  /*    `ftpic.h'.  If you don't need them just implement the functions as */
-  /*    empty to resolve the link error.  Also the `pic_init' and          */
-  /*    `pic_free' functions should be declared in `pic.h', to be referred */
-  /*    by the module definition calling `FT_DEFINE_MODULE' in the         */
-  /*    following.                                                         */
-  /*                                                                       */
-  /*    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).                                                          */
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_ROOT_MODULE                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an instance of an FT_Module_Class struct inside */
-  /*    another struct that contains it or in a function that initializes  */
-  /*    that containing struct.                                            */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DECLARE_MODULE( class_ )  \
-  FT_CALLBACK_TABLE                  \
-  const FT_Module_Class  class_;
-
-#define FT_DEFINE_ROOT_MODULE(  \
-          flags_,               \
-          size_,                \
-          name_,                \
-          version_,             \
-          requires_,            \
-          interface_,           \
-          init_,                \
-          done_,                \
-          get_interface_ )      \
-  {                             \
-    flags_,                     \
-    size_,                      \
-                                \
-    name_,                      \
-    version_,                   \
-    requires_,                  \
-                                \
-    interface_,                 \
-                                \
-    init_,                      \
-    done_,                      \
-    get_interface_,             \
-  },
-
-#define FT_DEFINE_MODULE(         \
-          class_,                 \
-          flags_,                 \
-          size_,                  \
-          name_,                  \
-          version_,               \
-          requires_,              \
-          interface_,             \
-          init_,                  \
-          done_,                  \
-          get_interface_ )        \
-  FT_CALLBACK_TABLE_DEF           \
-  const FT_Module_Class class_ =  \
-  {                               \
-    flags_,                       \
-    size_,                        \
-                                  \
-    name_,                        \
-    version_,                     \
-    requires_,                    \
-                                  \
-    interface_,                   \
-                                  \
-    init_,                        \
-    done_,                        \
-    get_interface_,               \
-  };
-
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DECLARE_MODULE( class_ )                               \
-  FT_Error                                                        \
-  FT_Create_Class_ ## class_( FT_Library         library,         \
-                              FT_Module_Class**  output_class );  \
-  void                                                            \
-  FT_Destroy_Class_ ## class_( FT_Library        library,         \
-                               FT_Module_Class*  clazz );
-
-#define FT_DEFINE_ROOT_MODULE(                      \
-          flags_,                                   \
-          size_,                                    \
-          name_,                                    \
-          version_,                                 \
-          requires_,                                \
-          interface_,                               \
-          init_,                                    \
-          done_,                                    \
-          get_interface_ )                          \
-    clazz->root.module_flags     = flags_;          \
-    clazz->root.module_size      = size_;           \
-    clazz->root.module_name      = name_;           \
-    clazz->root.module_version   = version_;        \
-    clazz->root.module_requires  = requires_;       \
-                                                    \
-    clazz->root.module_interface = interface_;      \
-                                                    \
-    clazz->root.module_init      = init_;           \
-    clazz->root.module_done      = done_;           \
-    clazz->root.get_interface    = get_interface_;
-
-#define FT_DEFINE_MODULE(                                        \
-          class_,                                                \
-          flags_,                                                \
-          size_,                                                 \
-          name_,                                                 \
-          version_,                                              \
-          requires_,                                             \
-          interface_,                                            \
-          init_,                                                 \
-          done_,                                                 \
-          get_interface_ )                                       \
-  void                                                           \
-  FT_Destroy_Class_ ## class_( FT_Library        library,        \
-                               FT_Module_Class*  clazz )         \
-  {                                                              \
-    FT_Memory memory = library->memory;                          \
-                                                                 \
-                                                                 \
-    class_ ## _pic_free( library );                              \
-    if ( clazz )                                                 \
-      FT_FREE( clazz );                                          \
-  }                                                              \
-                                                                 \
-                                                                 \
-  FT_Error                                                       \
-  FT_Create_Class_ ## class_( FT_Library         library,        \
-                              FT_Module_Class**  output_class )  \
-  {                                                              \
-    FT_Memory         memory = library->memory;                  \
-    FT_Module_Class*  clazz  = NULL;                             \
-    FT_Error          error;                                     \
-                                                                 \
-                                                                 \
-    if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) )                  \
-      return error;                                              \
-    error = class_ ## _pic_init( library );                      \
-    if ( error )                                                 \
-    {                                                            \
-      FT_FREE( clazz );                                          \
-      return error;                                              \
-    }                                                            \
-                                                                 \
-    clazz->module_flags     = flags_;                            \
-    clazz->module_size      = size_;                             \
-    clazz->module_name      = name_;                             \
-    clazz->module_version   = version_;                          \
-    clazz->module_requires  = requires_;                         \
-                                                                 \
-    clazz->module_interface = interface_;                        \
-                                                                 \
-    clazz->module_init      = init_;                             \
-    clazz->module_done      = done_;                             \
-    clazz->get_interface    = get_interface_;                    \
-                                                                 \
-    *output_class = clazz;                                       \
-                                                                 \
-    return FT_Err_Ok;                                            \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-FT_END_HEADER
-
-#endif /* FTOBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftpic.h b/third_party/freetype/include/freetype/internal/ftpic.h
deleted file mode 100644
index 0d43ed2..0000000
--- a/third_party/freetype/include/freetype/internal/ftpic.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpic.h                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services (declaration).       */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Modules that ordinarily have const global data that need address     */
-  /*  can instead define pointers here.                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTPIC_H_
-#define FTPIC_H_
-
-
-FT_BEGIN_HEADER
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  typedef struct  FT_PIC_Container_
-  {
-    /* pic containers for base */
-    void*  base;
-
-    /* pic containers for modules */
-    void*  autofit;
-    void*  cff;
-    void*  pshinter;
-    void*  psnames;
-    void*  raster;
-    void*  sfnt;
-    void*  smooth;
-    void*  truetype;
-
-  } FT_PIC_Container;
-
-
-  /* Initialize the various function tables, structs, etc. */
-  /* stored in the container.                              */
-  FT_BASE( FT_Error )
-  ft_pic_container_init( FT_Library  library );
-
-
-  /* Destroy the contents of the container. */
-  FT_BASE( void )
-  ft_pic_container_destroy( FT_Library  library );
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-FT_END_HEADER
-
-#endif /* FTPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftrfork.h b/third_party/freetype/include/freetype/internal/ftrfork.h
deleted file mode 100644
index 25a44a4..0000000
--- a/third_party/freetype/include/freetype/internal/ftrfork.h
+++ /dev/null
@@ -1,267 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftrfork.h                                                              */
-/*                                                                         */
-/*    Embedded resource forks accessor (specification).                    */
-/*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
-/*  Masatake YAMATO and Redhat K.K.                                        */
-/*                                                                         */
-/*  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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/* Development of the code in this file is support of                      */
-/* Information-technology Promotion Agency, Japan.                         */
-/***************************************************************************/
-
-
-#ifndef FTRFORK_H_
-#define FTRFORK_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* Number of guessing rules supported in `FT_Raccess_Guess'.            */
-  /* Don't forget to increment the number if you add a new guessing rule. */
-#define FT_RACCESS_N_RULES  9
-
-
-  /* A structure to describe a reference in a resource by its resource ID */
-  /* and internal offset.  The `POST' resource expects to be concatenated */
-  /* by the order of resource IDs instead of its appearance in the file.  */
-
-  typedef struct  FT_RFork_Ref_
-  {
-    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,
-                            FT_Stream   stream,
-                            char       *base_file_name,
-                            char      **result_file_name,
-                            FT_Long    *result_offset );
-
-  typedef enum  FT_RFork_Rule_ {
-    FT_RFork_Rule_invalid = -2,
-    FT_RFork_Rule_uknown, /* -1 */
-    FT_RFork_Rule_apple_double,
-    FT_RFork_Rule_apple_single,
-    FT_RFork_Rule_darwin_ufs_export,
-    FT_RFork_Rule_darwin_newvfs,
-    FT_RFork_Rule_darwin_hfsplus,
-    FT_RFork_Rule_vfat,
-    FT_RFork_Rule_linux_cap,
-    FT_RFork_Rule_linux_double,
-    FT_RFork_Rule_linux_netatalk
-  } FT_RFork_Rule;
-
-  /* For fast translation between rule index and rule type,
-   * the macros FT_RFORK_xxx should be kept consistent with
-   * the raccess_guess_funcs table
-   */
-  typedef struct ft_raccess_guess_rec_ {
-    ft_raccess_guess_func  func;
-    FT_RFork_Rule          type;
-  } ft_raccess_guess_rec;
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-  /* this array is a storage in non-PIC mode, so ; is needed in END */
-#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
-          static const type name[] = {
-#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
-          { raccess_guess_ ## func_suffix,                           \
-            FT_RFork_Rule_ ## type_suffix },
-#define CONST_FT_RFORK_RULE_ARRAY_END  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-  /* this array is a function in PIC mode, so no ; is needed in END */
-#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type )  \
-          void                                         \
-          FT_Init_Table_ ## name( type*  storage )     \
-          {                                            \
-            type*  local = storage;                    \
-                                                       \
-                                                       \
-            int  i = 0;
-#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix )  \
-          local[i].func = raccess_guess_ ## func_suffix;             \
-          local[i].type = FT_RFork_Rule_ ## type_suffix;             \
-          i++;
-#define CONST_FT_RFORK_RULE_ARRAY_END  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-#endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Raccess_Guess                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Guess a file name and offset where the actual resource fork is     */
-  /*    stored.  The macro FT_RACCESS_N_RULES holds the number of          */
-  /*    guessing rules;  the guessed result for the Nth rule is            */
-  /*    represented as a triplet: a new file name (new_names[N]), a file   */
-  /*    offset (offsets[N]), and an error code (errors[N]).                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library ::                                                         */
-  /*      A FreeType library instance.                                     */
-  /*                                                                       */
-  /*    stream ::                                                          */
-  /*      A file stream containing the resource fork.                      */
-  /*                                                                       */
-  /*    base_name ::                                                       */
-  /*      The (base) file name of the resource fork used for some          */
-  /*      guessing rules.                                                  */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    new_names ::                                                       */
-  /*      An array of guessed file names in which the resource forks may   */
-  /*      exist.  If `new_names[N]' is NULL, the guessed file name is      */
-  /*      equal to `base_name'.                                            */
-  /*                                                                       */
-  /*    offsets ::                                                         */
-  /*      An array of guessed file offsets.  `offsets[N]' holds the file   */
-  /*      offset of the possible start of the resource fork in file        */
-  /*      `new_names[N]'.                                                  */
-  /*                                                                       */
-  /*    errors ::                                                          */
-  /*      An array of FreeType error codes.  `errors[N]' is the error      */
-  /*      code of Nth guessing rule function.  If `errors[N]' is not       */
-  /*      FT_Err_Ok, `new_names[N]' and `offsets[N]' are meaningless.      */
-  /*                                                                       */
-  FT_BASE( void )
-  FT_Raccess_Guess( FT_Library  library,
-                    FT_Stream   stream,
-                    char*       base_name,
-                    char**      new_names,
-                    FT_Long*    offsets,
-                    FT_Error*   errors );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Raccess_Get_HeaderInfo                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Get the information from the header of resource fork.  The         */
-  /*    information includes the file offset where the resource map        */
-  /*    starts, and the file offset where the resource data starts.        */
-  /*    `FT_Raccess_Get_DataOffsets' requires these two data.              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library ::                                                         */
-  /*      A FreeType library instance.                                     */
-  /*                                                                       */
-  /*    stream ::                                                          */
-  /*      A file stream containing the resource fork.                      */
-  /*                                                                       */
-  /*    rfork_offset ::                                                    */
-  /*      The file offset where the resource fork starts.                  */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    map_offset ::                                                      */
-  /*      The file offset where the resource map starts.                   */
-  /*                                                                       */
-  /*    rdata_pos ::                                                       */
-  /*      The file offset where the resource data starts.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  FT_Err_Ok means success.                     */
-  /*                                                                       */
-  FT_BASE( FT_Error )
-  FT_Raccess_Get_HeaderInfo( FT_Library  library,
-                             FT_Stream   stream,
-                             FT_Long     rfork_offset,
-                             FT_Long    *map_offset,
-                             FT_Long    *rdata_pos );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Raccess_Get_DataOffsets                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Get the data offsets for a tag in a resource fork.  Offsets are    */
-  /*    stored in an array because, in some cases, resources in a resource */
-  /*    fork have the same tag.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library ::                                                         */
-  /*      A FreeType library instance.                                     */
-  /*                                                                       */
-  /*    stream ::                                                          */
-  /*      A file stream containing the resource fork.                      */
-  /*                                                                       */
-  /*    map_offset ::                                                      */
-  /*      The file offset where the resource map starts.                   */
-  /*                                                                       */
-  /*    rdata_pos ::                                                       */
-  /*      The file offset where the resource data starts.                  */
-  /*                                                                       */
-  /*    tag ::                                                             */
-  /*      The resource tag.                                                */
-  /*                                                                       */
-  /*    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 `sfnt' resources, sorting   */
-  /*      may induce a different order of the faces in comparison to that  */
-  /*      by QuickDraw API.                                                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    offsets ::                                                         */
-  /*      The stream offsets for the resource data specified by `tag'.     */
-  /*      This array is allocated by the function, so you have to call     */
-  /*      @ft_mem_free after use.                                          */
-  /*                                                                       */
-  /*    count ::                                                           */
-  /*      The length of offsets array.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  FT_Err_Ok means success.                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Normally you should use `FT_Raccess_Get_HeaderInfo' to get the     */
-  /*    value for `map_offset' and `rdata_pos'.                            */
-  /*                                                                       */
-  FT_BASE( FT_Error )
-  FT_Raccess_Get_DataOffsets( FT_Library  library,
-                              FT_Stream   stream,
-                              FT_Long     map_offset,
-                              FT_Long     rdata_pos,
-                              FT_Long     tag,
-                              FT_Bool     sort_by_res_id,
-                              FT_Long   **offsets,
-                              FT_Long    *count );
-
-
-FT_END_HEADER
-
-#endif /* FTRFORK_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftserv.h b/third_party/freetype/include/freetype/internal/ftserv.h
deleted file mode 100644
index c84afba..0000000
--- a/third_party/freetype/include/freetype/internal/ftserv.h
+++ /dev/null
@@ -1,844 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftserv.h                                                               */
-/*                                                                         */
-/*    The FreeType services (specification only).                          */
-/*                                                                         */
-/*  Copyright 2003-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Each module can export one or more `services'.  Each service is      */
-  /*  identified by a constant string and modeled by a pointer; the latter */
-  /*  generally corresponds to a structure containing function pointers.   */
-  /*                                                                       */
-  /*  Note that a service's data cannot be a mere function pointer because */
-  /*  in C it is possible that function pointers might be implemented      */
-  /*  differently than data pointers (e.g. 48 bits instead of 32).         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FTSERV_H_
-#define FTSERV_H_
-
-
-FT_BEGIN_HEADER
-
-  /*
-   * @macro:
-   *   FT_FACE_FIND_SERVICE
-   *
-   * @description:
-   *   This macro is used to look up a service from a face's driver module.
-   *
-   * @input:
-   *   face ::
-   *     The source face handle.
-   *
-   *   id ::
-   *     A string describing the service as defined in the service's
-   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
-   *     `multi-masters').  It is automatically prefixed with
-   *     `FT_SERVICE_ID_'.
-   *
-   * @output:
-   *   ptr ::
-   *     A variable that receives the service pointer.  Will be NULL
-   *     if not found.
-   */
-#ifdef __cplusplus
-
-#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
-  FT_BEGIN_STMNT                                                            \
-    FT_Module    module = FT_MODULE( FT_FACE( face )->driver );             \
-    FT_Pointer   _tmp_  = NULL;                                             \
-    FT_Pointer*  _pptr_ = (FT_Pointer*)&(ptr);                              \
-                                                                            \
-                                                                            \
-    if ( module->clazz->get_interface )                                     \
-      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
-    *_pptr_ = _tmp_;                                                        \
-  FT_END_STMNT
-
-#else /* !C++ */
-
-#define FT_FACE_FIND_SERVICE( face, ptr, id )                               \
-  FT_BEGIN_STMNT                                                            \
-    FT_Module   module = FT_MODULE( FT_FACE( face )->driver );              \
-    FT_Pointer  _tmp_  = NULL;                                              \
-                                                                            \
-    if ( module->clazz->get_interface )                                     \
-      _tmp_ = module->clazz->get_interface( module, FT_SERVICE_ID_ ## id ); \
-    ptr = _tmp_;                                                            \
-  FT_END_STMNT
-
-#endif /* !C++ */
-
-
-  /*
-   * @macro:
-   *   FT_FACE_FIND_GLOBAL_SERVICE
-   *
-   * @description:
-   *   This macro is used to look up a service from all modules.
-   *
-   * @input:
-   *   face ::
-   *     The source face handle.
-   *
-   *   id ::
-   *     A string describing the service as defined in the service's
-   *     header files (e.g. FT_SERVICE_ID_MULTI_MASTERS which expands to
-   *     `multi-masters').  It is automatically prefixed with
-   *     `FT_SERVICE_ID_'.
-   *
-   * @output:
-   *   ptr ::
-   *     A variable that receives the service pointer.  Will be NULL
-   *     if not found.
-   */
-#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, 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, 1 ); \
-    ptr   = _tmp_;                                                    \
-  FT_END_STMNT
-
-#endif /* !C++ */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****         S E R V I C E   D E S C R I P T O R S                 *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*
-   *  The following structure is used to _describe_ a given service
-   *  to the library.  This is useful to build simple static service lists.
-   */
-  typedef struct  FT_ServiceDescRec_
-  {
-    const char*  serv_id;     /* service name         */
-    const void*  serv_data;   /* service pointer/data */
-
-  } FT_ServiceDescRec;
-
-  typedef const FT_ServiceDescRec*  FT_ServiceDesc;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Macro>                                                               */
-  /*    FT_DEFINE_SERVICEDESCREC1                                          */
-  /*    FT_DEFINE_SERVICEDESCREC2                                          */
-  /*    FT_DEFINE_SERVICEDESCREC3                                          */
-  /*    FT_DEFINE_SERVICEDESCREC4                                          */
-  /*    FT_DEFINE_SERVICEDESCREC5                                          */
-  /*    FT_DEFINE_SERVICEDESCREC6                                          */
-  /*    FT_DEFINE_SERVICEDESCREC7                                          */
-  /*    FT_DEFINE_SERVICEDESCREC8                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Used to initialize an array of FT_ServiceDescRec structures.       */
-  /*                                                                       */
-  /*    When FT_CONFIG_OPTION_PIC is defined a `create' function needs to  */
-  /*    be called with a pointer to return an allocated array.  As soon as */
-  /*    it is no longer needed, a `destroy' function needs to be called to */
-  /*    release that allocation.                                           */
-  /*                                                                       */
-  /*    These functions should be manually called from the `pic_init' and  */
-  /*    `pic_free' functions of your module (see FT_DEFINE_MODULE).        */
-  /*                                                                       */
-  /*    When FT_CONFIG_OPTION_PIC is not defined the array will be         */
-  /*    allocated in the global scope (or the scope where the macro is     */
-  /*    used).                                                             */
-  /*                                                                       */
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
-                                   serv_id_1, serv_data_1 )                 \
-  static const FT_ServiceDescRec  class_[] =                                \
-  {                                                                         \
-    { serv_id_1, serv_data_1 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
-                                   serv_id_1, serv_data_1,                  \
-                                   serv_id_2, serv_data_2 )                 \
-  static const FT_ServiceDescRec  class_[] =                                \
-  {                                                                         \
-    { serv_id_1, serv_data_1 },                                             \
-    { serv_id_2, serv_data_2 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
-                                   serv_id_1, serv_data_1,                  \
-                                   serv_id_2, serv_data_2,                  \
-                                   serv_id_3, serv_data_3 )                 \
-  static const FT_ServiceDescRec  class_[] =                                \
-  {                                                                         \
-    { serv_id_1, serv_data_1 },                                             \
-    { serv_id_2, serv_data_2 },                                             \
-    { serv_id_3, serv_data_3 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC4( 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 )                 \
-  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 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC5( 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 )                 \
-  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 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC6( 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 )                 \
-  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 },                                             \
-    { NULL, NULL }                                                          \
-  };
-
-#define FT_DEFINE_SERVICEDESCREC7( 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 )                 \
-  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 },                                             \
-    { 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 }                                                          \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICEDESCREC1( class_,                                  \
-                                   serv_id_1, serv_data_1 )                 \
-  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 ) * 2 ) )                         \
-      return error;                                                         \
-                                                                            \
-    clazz[0].serv_id   = serv_id_1;                                         \
-    clazz[0].serv_data = serv_data_1;                                       \
-    clazz[1].serv_id   = NULL;                                              \
-    clazz[1].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC2( class_,                                  \
-                                   serv_id_1, serv_data_1,                  \
-                                   serv_id_2, serv_data_2 )                 \
-  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 ) * 3 ) )                         \
-      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   = NULL;                                              \
-    clazz[2].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC3( class_,                                  \
-                                   serv_id_1, serv_data_1,                  \
-                                   serv_id_2, serv_data_2,                  \
-                                   serv_id_3, serv_data_3 )                 \
-  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 ) * 4 ) )                         \
-      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   = NULL;                                              \
-    clazz[3].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC4( 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 )                 \
-  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 ) * 5 ) )                         \
-      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   = NULL;                                              \
-    clazz[4].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC5( 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 )                 \
-  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 ) * 6 ) )                         \
-      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   = NULL;                                              \
-    clazz[5].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC6( 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 )                 \
-  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 ) * 7 ) )                         \
-      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   = NULL;                                              \
-    clazz[6].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    return FT_Err_Ok;                                                       \
-  }
-
-#define FT_DEFINE_SERVICEDESCREC7( 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 )                 \
-  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 ) * 8 ) )                         \
-      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   = NULL;                                              \
-    clazz[7].serv_data = NULL;                                              \
-                                                                            \
-    *output_class = clazz;                                                  \
-                                                                            \
-    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;                                                       \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /*
-   *  Parse a list of FT_ServiceDescRec descriptors and look for
-   *  a specific service by ID.  Note that the last element in the
-   *  array must be { NULL, NULL }, and that the function should
-   *  return NULL if the service isn't available.
-   *
-   *  This function can be used by modules to implement their
-   *  `get_service' method.
-   */
-  FT_BASE( FT_Pointer )
-  ft_service_list_lookup( FT_ServiceDesc  service_descriptors,
-                          const char*     service_id );
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****             S E R V I C E S   C A C H E                       *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*
-   *  This structure is used to store a cache for several frequently used
-   *  services.  It is the type of `face->internal->services'.  You
-   *  should only use FT_FACE_LOOKUP_SERVICE to access it.
-   *
-   *  All fields should have the type FT_Pointer to relax compilation
-   *  dependencies.  We assume the developer isn't completely stupid.
-   *
-   *  Each field must be named `service_XXXX' where `XXX' corresponds to
-   *  the correct FT_SERVICE_ID_XXXX macro.  See the definition of
-   *  FT_FACE_LOOKUP_SERVICE below how this is implemented.
-   *
-   */
-  typedef struct  FT_ServiceCacheRec_
-  {
-    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;
-
-  } FT_ServiceCacheRec, *FT_ServiceCache;
-
-
-  /*
-   *  A magic number used within the services cache.
-   */
-
-  /* ensure that value `1' has the same width as a pointer */
-#define FT_SERVICE_UNAVAILABLE  ((FT_Pointer)~(FT_PtrDist)1)
-
-
-  /*
-   * @macro:
-   *   FT_FACE_LOOKUP_SERVICE
-   *
-   * @description:
-   *   This macro is used to lookup a service from a face's driver module
-   *   using its cache.
-   *
-   * @input:
-   *   face::
-   *     The source face handle containing the cache.
-   *
-   *   field ::
-   *     The field name in the cache.
-   *
-   *   id ::
-   *     The service ID.
-   *
-   * @output:
-   *   ptr ::
-   *     A variable receiving the service data.  NULL if not available.
-   */
-#ifdef __cplusplus
-
-#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
-  FT_BEGIN_STMNT                                               \
-    FT_Pointer   svc;                                          \
-    FT_Pointer*  Pptr = (FT_Pointer*)&(ptr);                   \
-                                                               \
-                                                               \
-    svc = FT_FACE( face )->internal->services. service_ ## id; \
-    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
-      svc = NULL;                                              \
-    else if ( svc == NULL )                                    \
-    {                                                          \
-      FT_FACE_FIND_SERVICE( face, svc, id );                   \
-                                                               \
-      FT_FACE( face )->internal->services. service_ ## id =    \
-        (FT_Pointer)( svc != NULL ? svc                        \
-                                  : FT_SERVICE_UNAVAILABLE );  \
-    }                                                          \
-    *Pptr = svc;                                               \
-  FT_END_STMNT
-
-#else /* !C++ */
-
-#define FT_FACE_LOOKUP_SERVICE( face, ptr, id )                \
-  FT_BEGIN_STMNT                                               \
-    FT_Pointer  svc;                                           \
-                                                               \
-                                                               \
-    svc = FT_FACE( face )->internal->services. service_ ## id; \
-    if ( svc == FT_SERVICE_UNAVAILABLE )                       \
-      svc = NULL;                                              \
-    else if ( svc == NULL )                                    \
-    {                                                          \
-      FT_FACE_FIND_SERVICE( face, svc, id );                   \
-                                                               \
-      FT_FACE( face )->internal->services. service_ ## id =    \
-        (FT_Pointer)( svc != NULL ? svc                        \
-                                  : FT_SERVICE_UNAVAILABLE );  \
-    }                                                          \
-    ptr = svc;                                                 \
-  FT_END_STMNT
-
-#endif /* !C++ */
-
-  /*
-   *  A macro used to define new service structure types.
-   */
-
-#define FT_DEFINE_SERVICE( name )            \
-  typedef struct FT_Service_ ## name ## Rec_ \
-    FT_Service_ ## name ## Rec ;             \
-  typedef struct FT_Service_ ## name ## Rec_ \
-    const * FT_Service_ ## name ;            \
-  struct FT_Service_ ## name ## Rec_
-
-  /* */
-
-  /*
-   *  The header files containing the services.
-   */
-
-#define FT_SERVICE_BDF_H                <freetype/internal/services/svbdf.h>
-#define FT_SERVICE_CID_H                <freetype/internal/services/svcid.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_TT_CMAP_H            <freetype/internal/services/svttcmap.h>
-#define FT_SERVICE_WINFNT_H             <freetype/internal/services/svwinfnt.h>
-#define FT_SERVICE_FONT_FORMAT_H        <freetype/internal/services/svfntfmt.h>
-#define FT_SERVICE_TRUETYPE_GLYF_H      <freetype/internal/services/svttglyf.h>
-
- /* */
-
-FT_END_HEADER
-
-#endif /* FTSERV_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftstream.h b/third_party/freetype/include/freetype/internal/ftstream.h
deleted file mode 100644
index 02b2f0b..0000000
--- a/third_party/freetype/include/freetype/internal/ftstream.h
+++ /dev/null
@@ -1,536 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftstream.h                                                             */
-/*                                                                         */
-/*    Stream handling (specification).                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTSTREAM_H_
-#define FTSTREAM_H_
-
-
-#include <ft2build.h>
-#include FT_SYSTEM_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* format of an 8-bit frame_op value:           */
-  /*                                              */
-  /* bit  76543210                                */
-  /*      xxxxxxes                                */
-  /*                                              */
-  /* s is set to 1 if the value is signed.        */
-  /* e is set to 1 if the value is little-endian. */
-  /* xxx is a command.                            */
-
-#define FT_FRAME_OP_SHIFT         2
-#define FT_FRAME_OP_SIGNED        1
-#define FT_FRAME_OP_LITTLE        2
-#define FT_FRAME_OP_COMMAND( x )  ( x >> FT_FRAME_OP_SHIFT )
-
-#define FT_MAKE_FRAME_OP( command, little, sign ) \
-          ( ( command << FT_FRAME_OP_SHIFT ) | ( little << 1 ) | sign )
-
-#define FT_FRAME_OP_END    0
-#define FT_FRAME_OP_START  1  /* start a new frame     */
-#define FT_FRAME_OP_BYTE   2  /* read 1-byte value     */
-#define FT_FRAME_OP_SHORT  3  /* read 2-byte value     */
-#define FT_FRAME_OP_LONG   4  /* read 4-byte value     */
-#define FT_FRAME_OP_OFF3   5  /* read 3-byte value     */
-#define FT_FRAME_OP_BYTES  6  /* read a bytes sequence */
-
-
-  typedef enum  FT_Frame_Op_
-  {
-    ft_frame_end       = 0,
-    ft_frame_start     = FT_MAKE_FRAME_OP( FT_FRAME_OP_START, 0, 0 ),
-
-    ft_frame_byte      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 0 ),
-    ft_frame_schar     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTE,  0, 1 ),
-
-    ft_frame_ushort_be = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 0 ),
-    ft_frame_short_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 0, 1 ),
-    ft_frame_ushort_le = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 0 ),
-    ft_frame_short_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_SHORT, 1, 1 ),
-
-    ft_frame_ulong_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 0 ),
-    ft_frame_long_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 0, 1 ),
-    ft_frame_ulong_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 0 ),
-    ft_frame_long_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_LONG, 1, 1 ),
-
-    ft_frame_uoff3_be  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 0 ),
-    ft_frame_off3_be   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 0, 1 ),
-    ft_frame_uoff3_le  = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 0 ),
-    ft_frame_off3_le   = FT_MAKE_FRAME_OP( FT_FRAME_OP_OFF3, 1, 1 ),
-
-    ft_frame_bytes     = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 0 ),
-    ft_frame_skip      = FT_MAKE_FRAME_OP( FT_FRAME_OP_BYTES, 0, 1 )
-
-  } FT_Frame_Op;
-
-
-  typedef struct  FT_Frame_Field_
-  {
-    FT_Byte    value;
-    FT_Byte    size;
-    FT_UShort  offset;
-
-  } FT_Frame_Field;
-
-
-  /* Construct an FT_Frame_Field out of a structure type and a field name. */
-  /* The structure type must be set in the FT_STRUCTURE macro before       */
-  /* calling the FT_FRAME_START() macro.                                   */
-  /*                                                                       */
-#define FT_FIELD_SIZE( f ) \
-          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f )
-
-#define FT_FIELD_SIZE_DELTA( f ) \
-          (FT_Byte)sizeof ( ((FT_STRUCTURE*)0)->f[0] )
-
-#define FT_FIELD_OFFSET( f ) \
-          (FT_UShort)( offsetof( FT_STRUCTURE, f ) )
-
-#define FT_FRAME_FIELD( frame_op, field ) \
-          {                               \
-            frame_op,                     \
-            FT_FIELD_SIZE( field ),       \
-            FT_FIELD_OFFSET( field )      \
-          }
-
-#define FT_MAKE_EMPTY_FIELD( frame_op )  { frame_op, 0, 0 }
-
-#define FT_FRAME_START( size )   { ft_frame_start, 0, size }
-#define FT_FRAME_END             { ft_frame_end, 0, 0 }
-
-#define FT_FRAME_LONG( f )       FT_FRAME_FIELD( ft_frame_long_be, f )
-#define FT_FRAME_ULONG( f )      FT_FRAME_FIELD( ft_frame_ulong_be, f )
-#define FT_FRAME_SHORT( f )      FT_FRAME_FIELD( ft_frame_short_be, f )
-#define FT_FRAME_USHORT( f )     FT_FRAME_FIELD( ft_frame_ushort_be, f )
-#define FT_FRAME_OFF3( f )       FT_FRAME_FIELD( ft_frame_off3_be, f )
-#define FT_FRAME_UOFF3( f )      FT_FRAME_FIELD( ft_frame_uoff3_be, f )
-#define FT_FRAME_BYTE( f )       FT_FRAME_FIELD( ft_frame_byte, f )
-#define FT_FRAME_CHAR( f )       FT_FRAME_FIELD( ft_frame_schar, f )
-
-#define FT_FRAME_LONG_LE( f )    FT_FRAME_FIELD( ft_frame_long_le, f )
-#define FT_FRAME_ULONG_LE( f )   FT_FRAME_FIELD( ft_frame_ulong_le, f )
-#define FT_FRAME_SHORT_LE( f )   FT_FRAME_FIELD( ft_frame_short_le, f )
-#define FT_FRAME_USHORT_LE( f )  FT_FRAME_FIELD( ft_frame_ushort_le, f )
-#define FT_FRAME_OFF3_LE( f )    FT_FRAME_FIELD( ft_frame_off3_le, f )
-#define FT_FRAME_UOFF3_LE( f )   FT_FRAME_FIELD( ft_frame_uoff3_le, f )
-
-#define FT_FRAME_SKIP_LONG       { ft_frame_long_be, 0, 0 }
-#define FT_FRAME_SKIP_SHORT      { ft_frame_short_be, 0, 0 }
-#define FT_FRAME_SKIP_BYTE       { ft_frame_byte, 0, 0 }
-
-#define FT_FRAME_BYTES( field, count ) \
-          {                            \
-            ft_frame_bytes,            \
-            count,                     \
-            FT_FIELD_OFFSET( field )   \
-          }
-
-#define FT_FRAME_SKIP_BYTES( count )  { ft_frame_skip, count, 0 }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Integer extraction macros -- the `buffer' parameter must ALWAYS be of */
-  /* type `char*' or equivalent (1-byte elements).                         */
-  /*                                                                       */
-
-#define FT_BYTE_( p, i )  ( ((const FT_Byte*)(p))[(i)] )
-
-#define FT_INT16( x )   ( (FT_Int16)(x)  )
-#define FT_UINT16( x )  ( (FT_UInt16)(x) )
-#define FT_INT32( x )   ( (FT_Int32)(x)  )
-#define FT_UINT32( x )  ( (FT_UInt32)(x) )
-
-
-#define FT_BYTE_U16( p, i, s )  ( FT_UINT16( FT_BYTE_( p, i ) ) << (s) )
-#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_USHORT( p )  FT_UINT16( FT_BYTE_U16( p, 0, 8 ) | \
-                                        FT_BYTE_U16( p, 1, 0 ) )
-
-#define FT_PEEK_LONG( p )  FT_INT32( FT_BYTE_U32( p, 0, 24 ) | \
-                                     FT_BYTE_U32( p, 1, 16 ) | \
-                                     FT_BYTE_U32( p, 2,  8 ) | \
-                                     FT_BYTE_U32( p, 3,  0 ) )
-
-#define FT_PEEK_ULONG( p )  FT_UINT32( FT_BYTE_U32( p, 0, 24 ) | \
-                                       FT_BYTE_U32( p, 1, 16 ) | \
-                                       FT_BYTE_U32( p, 2,  8 ) | \
-                                       FT_BYTE_U32( p, 3,  0 ) )
-
-#define FT_PEEK_OFF3( p )  FT_INT32( FT_BYTE_U32( p, 0, 16 ) | \
-                                     FT_BYTE_U32( p, 1,  8 ) | \
-                                     FT_BYTE_U32( p, 2,  0 ) )
-
-#define FT_PEEK_UOFF3( p )  FT_UINT32( FT_BYTE_U32( p, 0, 16 ) | \
-                                       FT_BYTE_U32( p, 1,  8 ) | \
-                                       FT_BYTE_U32( p, 2,  0 ) )
-
-#define FT_PEEK_SHORT_LE( p )  FT_INT16( FT_BYTE_U16( p, 1, 8 ) | \
-                                         FT_BYTE_U16( p, 0, 0 ) )
-
-#define FT_PEEK_USHORT_LE( p )  FT_UINT16( FT_BYTE_U16( p, 1, 8 ) |  \
-                                           FT_BYTE_U16( p, 0, 0 ) )
-
-#define FT_PEEK_LONG_LE( p )  FT_INT32( FT_BYTE_U32( p, 3, 24 ) | \
-                                        FT_BYTE_U32( p, 2, 16 ) | \
-                                        FT_BYTE_U32( p, 1,  8 ) | \
-                                        FT_BYTE_U32( p, 0,  0 ) )
-
-#define FT_PEEK_ULONG_LE( p )  FT_UINT32( FT_BYTE_U32( p, 3, 24 ) | \
-                                          FT_BYTE_U32( p, 2, 16 ) | \
-                                          FT_BYTE_U32( p, 1,  8 ) | \
-                                          FT_BYTE_U32( p, 0,  0 ) )
-
-#define FT_PEEK_OFF3_LE( p )  FT_INT32( FT_BYTE_U32( p, 2, 16 ) | \
-                                        FT_BYTE_U32( p, 1,  8 ) | \
-                                        FT_BYTE_U32( p, 0,  0 ) )
-
-#define FT_PEEK_UOFF3_LE( p )  FT_UINT32( FT_BYTE_U32( p, 2, 16 ) | \
-                                          FT_BYTE_U32( p, 1,  8 ) | \
-                                          FT_BYTE_U32( p, 0,  0 ) )
-
-
-#define FT_NEXT_CHAR( buffer )       \
-          ( (signed char)*buffer++ )
-
-#define FT_NEXT_BYTE( buffer )         \
-          ( (unsigned char)*buffer++ )
-
-#define FT_NEXT_SHORT( buffer )                                   \
-          ( (short)( buffer += 2, FT_PEEK_SHORT( buffer - 2 ) ) )
-
-#define FT_NEXT_USHORT( buffer )                                            \
-          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT( buffer - 2 ) ) )
-
-#define FT_NEXT_OFF3( buffer )                                  \
-          ( (long)( buffer += 3, FT_PEEK_OFF3( buffer - 3 ) ) )
-
-#define FT_NEXT_UOFF3( buffer )                                           \
-          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3( buffer - 3 ) ) )
-
-#define FT_NEXT_LONG( buffer )                                  \
-          ( (long)( buffer += 4, FT_PEEK_LONG( buffer - 4 ) ) )
-
-#define FT_NEXT_ULONG( buffer )                                           \
-          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG( buffer - 4 ) ) )
-
-
-#define FT_NEXT_SHORT_LE( buffer )                                   \
-          ( (short)( buffer += 2, FT_PEEK_SHORT_LE( buffer - 2 ) ) )
-
-#define FT_NEXT_USHORT_LE( buffer )                                            \
-          ( (unsigned short)( buffer += 2, FT_PEEK_USHORT_LE( buffer - 2 ) ) )
-
-#define FT_NEXT_OFF3_LE( buffer )                                  \
-          ( (long)( buffer += 3, FT_PEEK_OFF3_LE( buffer - 3 ) ) )
-
-#define FT_NEXT_UOFF3_LE( buffer )                                           \
-          ( (unsigned long)( buffer += 3, FT_PEEK_UOFF3_LE( buffer - 3 ) ) )
-
-#define FT_NEXT_LONG_LE( buffer )                                  \
-          ( (long)( buffer += 4, FT_PEEK_LONG_LE( buffer - 4 ) ) )
-
-#define FT_NEXT_ULONG_LE( buffer )                                           \
-          ( (unsigned long)( buffer += 4, FT_PEEK_ULONG_LE( buffer - 4 ) ) )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Each GET_xxxx() macro uses an implicit `stream' variable.             */
-  /*                                                                       */
-#if 0
-#define FT_GET_MACRO( type )    FT_NEXT_ ## type ( stream->cursor )
-
-#define FT_GET_CHAR()       FT_GET_MACRO( CHAR )
-#define FT_GET_BYTE()       FT_GET_MACRO( BYTE )
-#define FT_GET_SHORT()      FT_GET_MACRO( SHORT )
-#define FT_GET_USHORT()     FT_GET_MACRO( USHORT )
-#define FT_GET_OFF3()       FT_GET_MACRO( OFF3 )
-#define FT_GET_UOFF3()      FT_GET_MACRO( UOFF3 )
-#define FT_GET_LONG()       FT_GET_MACRO( LONG )
-#define FT_GET_ULONG()      FT_GET_MACRO( ULONG )
-#define FT_GET_TAG4()       FT_GET_MACRO( ULONG )
-
-#define FT_GET_SHORT_LE()   FT_GET_MACRO( SHORT_LE )
-#define FT_GET_USHORT_LE()  FT_GET_MACRO( USHORT_LE )
-#define FT_GET_LONG_LE()    FT_GET_MACRO( LONG_LE )
-#define FT_GET_ULONG_LE()   FT_GET_MACRO( ULONG_LE )
-
-#else
-#define FT_GET_MACRO( func, type )        ( (type)func( stream ) )
-
-#define FT_GET_CHAR()       FT_GET_MACRO( FT_Stream_GetChar, FT_Char )
-#define FT_GET_BYTE()       FT_GET_MACRO( FT_Stream_GetChar, FT_Byte )
-#define FT_GET_SHORT()      FT_GET_MACRO( FT_Stream_GetUShort, FT_Short )
-#define FT_GET_USHORT()     FT_GET_MACRO( FT_Stream_GetUShort, FT_UShort )
-#define FT_GET_OFF3()       FT_GET_MACRO( FT_Stream_GetUOffset, FT_Long )
-#define FT_GET_UOFF3()      FT_GET_MACRO( FT_Stream_GetUOffset, FT_ULong )
-#define FT_GET_LONG()       FT_GET_MACRO( FT_Stream_GetULong, FT_Long )
-#define FT_GET_ULONG()      FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
-#define FT_GET_TAG4()       FT_GET_MACRO( FT_Stream_GetULong, FT_ULong )
-
-#define FT_GET_SHORT_LE()   FT_GET_MACRO( FT_Stream_GetUShortLE, FT_Short )
-#define FT_GET_USHORT_LE()  FT_GET_MACRO( FT_Stream_GetUShortLE, FT_UShort )
-#define FT_GET_LONG_LE()    FT_GET_MACRO( FT_Stream_GetULongLE, FT_Long )
-#define FT_GET_ULONG_LE()   FT_GET_MACRO( FT_Stream_GetULongLE, FT_ULong )
-#endif
-
-#define FT_READ_MACRO( func, type, var )        \
-          ( var = (type)func( stream, &error ), \
-            error != FT_Err_Ok )
-
-#define FT_READ_BYTE( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Byte, var )
-#define FT_READ_CHAR( var )       FT_READ_MACRO( FT_Stream_ReadChar, FT_Char, var )
-#define FT_READ_SHORT( var )      FT_READ_MACRO( FT_Stream_ReadUShort, FT_Short, var )
-#define FT_READ_USHORT( var )     FT_READ_MACRO( FT_Stream_ReadUShort, FT_UShort, var )
-#define FT_READ_OFF3( var )       FT_READ_MACRO( FT_Stream_ReadUOffset, FT_Long, var )
-#define FT_READ_UOFF3( var )      FT_READ_MACRO( FT_Stream_ReadUOffset, FT_ULong, var )
-#define FT_READ_LONG( var )       FT_READ_MACRO( FT_Stream_ReadULong, FT_Long, var )
-#define FT_READ_ULONG( var )      FT_READ_MACRO( FT_Stream_ReadULong, FT_ULong, var )
-
-#define FT_READ_SHORT_LE( var )   FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_Short, var )
-#define FT_READ_USHORT_LE( var )  FT_READ_MACRO( FT_Stream_ReadUShortLE, FT_UShort, var )
-#define FT_READ_LONG_LE( var )    FT_READ_MACRO( FT_Stream_ReadULongLE, FT_Long, var )
-#define FT_READ_ULONG_LE( var )   FT_READ_MACRO( FT_Stream_ReadULongLE, FT_ULong, var )
-
-
-#ifndef FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM
-
-  /* initialize a stream for reading a regular system stream */
-  FT_BASE( FT_Error )
-  FT_Stream_Open( FT_Stream    stream,
-                  const char*  filepathname );
-
-#endif /* FT_CONFIG_OPTION_NO_DEFAULT_SYSTEM */
-
-
-  /* create a new (input) stream from an FT_Open_Args structure */
-  FT_BASE( FT_Error )
-  FT_Stream_New( FT_Library           library,
-                 const FT_Open_Args*  args,
-                 FT_Stream           *astream );
-
-  /* free a stream */
-  FT_BASE( void )
-  FT_Stream_Free( FT_Stream  stream,
-                  FT_Int     external );
-
-  /* initialize a stream for reading in-memory data */
-  FT_BASE( void )
-  FT_Stream_OpenMemory( FT_Stream       stream,
-                        const FT_Byte*  base,
-                        FT_ULong        size );
-
-  /* close a stream (does not destroy the stream structure) */
-  FT_BASE( void )
-  FT_Stream_Close( FT_Stream  stream );
-
-
-  /* seek within a stream. position is relative to start of stream */
-  FT_BASE( FT_Error )
-  FT_Stream_Seek( FT_Stream  stream,
-                  FT_ULong   pos );
-
-  /* skip bytes in a stream */
-  FT_BASE( FT_Error )
-  FT_Stream_Skip( FT_Stream  stream,
-                  FT_Long    distance );
-
-  /* return current stream position */
-  FT_BASE( FT_ULong )
-  FT_Stream_Pos( FT_Stream  stream );
-
-  /* read bytes from a stream into a user-allocated buffer, returns an */
-  /* error if not all bytes could be read.                             */
-  FT_BASE( FT_Error )
-  FT_Stream_Read( FT_Stream  stream,
-                  FT_Byte*   buffer,
-                  FT_ULong   count );
-
-  /* read bytes from a stream at a given position */
-  FT_BASE( FT_Error )
-  FT_Stream_ReadAt( FT_Stream  stream,
-                    FT_ULong   pos,
-                    FT_Byte*   buffer,
-                    FT_ULong   count );
-
-  /* try to read bytes at the end of a stream; return number of bytes */
-  /* really available                                                 */
-  FT_BASE( FT_ULong )
-  FT_Stream_TryRead( FT_Stream  stream,
-                     FT_Byte*   buffer,
-                     FT_ULong   count );
-
-  /* Enter a frame of `count' consecutive bytes in a stream.  Returns an */
-  /* error if the frame could not be read/accessed.  The caller can use  */
-  /* the FT_Stream_Get_XXX functions to retrieve frame data without      */
-  /* error checks.                                                       */
-  /*                                                                     */
-  /* You must _always_ call FT_Stream_ExitFrame() once you have entered  */
-  /* a stream frame!                                                     */
-  /*                                                                     */
-  FT_BASE( FT_Error )
-  FT_Stream_EnterFrame( FT_Stream  stream,
-                        FT_ULong   count );
-
-  /* exit a stream frame */
-  FT_BASE( void )
-  FT_Stream_ExitFrame( FT_Stream  stream );
-
-  /* Extract a stream frame.  If the stream is disk-based, a heap block */
-  /* is allocated and the frame bytes are read into it.  If the stream  */
-  /* is memory-based, this function simply set a pointer to the data.   */
-  /*                                                                    */
-  /* Useful to optimize access to memory-based streams transparently.   */
-  /*                                                                    */
-  /* All extracted frames must be `freed' with a call to the function   */
-  /* FT_Stream_ReleaseFrame().                                          */
-  /*                                                                    */
-  FT_BASE( FT_Error )
-  FT_Stream_ExtractFrame( FT_Stream  stream,
-                          FT_ULong   count,
-                          FT_Byte**  pbytes );
-
-  /* release an extract frame (see FT_Stream_ExtractFrame) */
-  FT_BASE( void )
-  FT_Stream_ReleaseFrame( FT_Stream  stream,
-                          FT_Byte**  pbytes );
-
-  /* read a byte from an entered frame */
-  FT_BASE( FT_Char )
-  FT_Stream_GetChar( FT_Stream  stream );
-
-  /* read a 16-bit big-endian unsigned integer from an entered frame */
-  FT_BASE( FT_UShort )
-  FT_Stream_GetUShort( FT_Stream  stream );
-
-  /* read a 24-bit big-endian unsigned integer from an entered frame */
-  FT_BASE( FT_ULong )
-  FT_Stream_GetUOffset( FT_Stream  stream );
-
-  /* read a 32-bit big-endian unsigned integer from an entered frame */
-  FT_BASE( FT_ULong )
-  FT_Stream_GetULong( FT_Stream  stream );
-
-  /* read a 16-bit little-endian unsigned integer from an entered frame */
-  FT_BASE( FT_UShort )
-  FT_Stream_GetUShortLE( FT_Stream  stream );
-
-  /* read a 32-bit little-endian unsigned integer from an entered frame */
-  FT_BASE( FT_ULong )
-  FT_Stream_GetULongLE( FT_Stream  stream );
-
-
-  /* read a byte from a stream */
-  FT_BASE( FT_Char )
-  FT_Stream_ReadChar( FT_Stream  stream,
-                      FT_Error*  error );
-
-  /* read a 16-bit big-endian unsigned integer from a stream */
-  FT_BASE( FT_UShort )
-  FT_Stream_ReadUShort( FT_Stream  stream,
-                        FT_Error*  error );
-
-  /* read a 24-bit big-endian unsigned integer from a stream */
-  FT_BASE( FT_ULong )
-  FT_Stream_ReadUOffset( FT_Stream  stream,
-                         FT_Error*  error );
-
-  /* read a 32-bit big-endian integer from a stream */
-  FT_BASE( FT_ULong )
-  FT_Stream_ReadULong( FT_Stream  stream,
-                       FT_Error*  error );
-
-  /* read a 16-bit little-endian unsigned integer from a stream */
-  FT_BASE( FT_UShort )
-  FT_Stream_ReadUShortLE( FT_Stream  stream,
-                          FT_Error*  error );
-
-  /* read a 32-bit little-endian unsigned integer from a stream */
-  FT_BASE( FT_ULong )
-  FT_Stream_ReadULongLE( FT_Stream  stream,
-                         FT_Error*  error );
-
-  /* Read a structure from a stream.  The structure must be described */
-  /* by an array of FT_Frame_Field records.                           */
-  FT_BASE( FT_Error )
-  FT_Stream_ReadFields( FT_Stream              stream,
-                        const FT_Frame_Field*  fields,
-                        void*                  structure );
-
-
-#define FT_STREAM_POS()           \
-          FT_Stream_Pos( stream )
-
-#define FT_STREAM_SEEK( position )                               \
-          FT_SET_ERROR( FT_Stream_Seek( stream,                  \
-                                        (FT_ULong)(position) ) )
-
-#define FT_STREAM_SKIP( distance )                              \
-          FT_SET_ERROR( FT_Stream_Skip( stream,                 \
-                                        (FT_Long)(distance) ) )
-
-#define FT_STREAM_READ( buffer, count )                       \
-          FT_SET_ERROR( FT_Stream_Read( stream,               \
-                                        (FT_Byte*)(buffer),   \
-                                        (FT_ULong)(count) ) )
-
-#define FT_STREAM_READ_AT( position, buffer, count )            \
-          FT_SET_ERROR( FT_Stream_ReadAt( stream,               \
-                                          (FT_ULong)(position), \
-                                          (FT_Byte*)buffer,     \
-                                          (FT_ULong)(count) ) )
-
-#define FT_STREAM_READ_FIELDS( fields, object )                          \
-          FT_SET_ERROR( FT_Stream_ReadFields( stream, fields, object ) )
-
-
-#define FT_FRAME_ENTER( size )                                           \
-          FT_SET_ERROR(                                                  \
-            FT_DEBUG_INNER( FT_Stream_EnterFrame( stream,                \
-                                                  (FT_ULong)(size) ) ) )
-
-#define FT_FRAME_EXIT()                                   \
-          FT_DEBUG_INNER( FT_Stream_ExitFrame( stream ) )
-
-#define FT_FRAME_EXTRACT( size, bytes )                                       \
-          FT_SET_ERROR(                                                       \
-            FT_DEBUG_INNER( FT_Stream_ExtractFrame( stream,                   \
-                                                    (FT_ULong)(size),         \
-                                                    (FT_Byte**)&(bytes) ) ) )
-
-#define FT_FRAME_RELEASE( bytes )                                         \
-          FT_DEBUG_INNER( FT_Stream_ReleaseFrame( stream,                 \
-                                                  (FT_Byte**)&(bytes) ) )
-
-
-FT_END_HEADER
-
-#endif /* FTSTREAM_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/ftvalid.h b/third_party/freetype/include/freetype/internal/ftvalid.h
deleted file mode 100644
index df6f7c5..0000000
--- a/third_party/freetype/include/freetype/internal/ftvalid.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftvalid.h                                                              */
-/*                                                                         */
-/*    FreeType validation support (specification).                         */
-/*                                                                         */
-/*  Copyright 2004-2017 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 FTVALID_H_
-#define FTVALID_H_
-
-#include <ft2build.h>
-#include FT_CONFIG_STANDARD_LIBRARY_H   /* for ft_setjmp and ft_longjmp */
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                    V A L I D A T I O N                          ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* handle to a validation object */
-  typedef struct FT_ValidatorRec_ volatile*  FT_Validator;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* There are three distinct validation levels defined here:              */
-  /*                                                                       */
-  /* FT_VALIDATE_DEFAULT ::                                                */
-  /*   A table that passes this validation level can be used reliably by   */
-  /*   FreeType.  It generally means that all offsets have been checked to */
-  /*   prevent out-of-bound reads, that array counts are correct, etc.     */
-  /*                                                                       */
-  /* FT_VALIDATE_TIGHT ::                                                  */
-  /*   A table that passes this validation level can be used reliably and  */
-  /*   doesn't contain invalid data.  For example, a charmap table that    */
-  /*   returns invalid glyph indices will not pass, even though it can     */
-  /*   be used with FreeType in default mode (the library will simply      */
-  /*   return an error later when trying to load the glyph).               */
-  /*                                                                       */
-  /*   It also checks that fields which must be a multiple of 2, 4, or 8,  */
-  /*   don't have incorrect values, etc.                                   */
-  /*                                                                       */
-  /* FT_VALIDATE_PARANOID ::                                               */
-  /*   Only for font debugging.  Checks that a table follows the           */
-  /*   specification by 100%.  Very few fonts will be able to pass this    */
-  /*   level anyway but it can be useful for certain tools like font       */
-  /*   editors/converters.                                                 */
-  /*                                                                       */
-  typedef enum  FT_ValidationLevel_
-  {
-    FT_VALIDATE_DEFAULT = 0,
-    FT_VALIDATE_TIGHT,
-    FT_VALIDATE_PARANOID
-
-  } FT_ValidationLevel;
-
-
-#if defined( _MSC_VER )      /* Visual C++ (and Intel C++) */
-  /* We disable the warning `structure was padded due to   */
-  /* __declspec(align())' in order to compile cleanly with */
-  /* the maximum level of warnings.                        */
-#pragma warning( push )
-#pragma warning( disable : 4324 )
-#endif /* _MSC_VER */
-
-  /* validator structure */
-  typedef struct  FT_ValidatorRec_
-  {
-    ft_jmp_buf          jump_buffer; /* used for exception handling      */
-
-    const FT_Byte*      base;        /* address of table in memory       */
-    const FT_Byte*      limit;       /* `base' + sizeof(table) in memory */
-    FT_ValidationLevel  level;       /* validation level                 */
-    FT_Error            error;       /* error returned. 0 means success  */
-
-  } FT_ValidatorRec;
-
-#if defined( _MSC_VER )
-#pragma warning( pop )
-#endif
-
-#define FT_VALIDATOR( x )  ( (FT_Validator)( x ) )
-
-
-  FT_BASE( void )
-  ft_validator_init( FT_Validator        valid,
-                     const FT_Byte*      base,
-                     const FT_Byte*      limit,
-                     FT_ValidationLevel  level );
-
-  /* Do not use this. It's broken and will cause your validator to crash */
-  /* if you run it on an invalid font.                                   */
-  FT_BASE( FT_Int )
-  ft_validator_run( FT_Validator  valid );
-
-  /* Sets the error field in a validator, then calls `longjmp' to return */
-  /* to high-level caller.  Using `setjmp/longjmp' avoids many stupid    */
-  /* error checks within the validation routines.                        */
-  /*                                                                     */
-  FT_BASE( void )
-  ft_validator_error( FT_Validator  valid,
-                      FT_Error      error );
-
-
-  /* Calls ft_validate_error.  Assumes that the `valid' local variable */
-  /* holds a pointer to the current validator object.                  */
-  /*                                                                   */
-#define FT_INVALID( _error )  FT_INVALID_( _error )
-#define FT_INVALID_( _error ) \
-          ft_validator_error( valid, FT_THROW( _error ) )
-
-  /* called when a broken table is detected */
-#define FT_INVALID_TOO_SHORT \
-          FT_INVALID( Invalid_Table )
-
-  /* called when an invalid offset is detected */
-#define FT_INVALID_OFFSET \
-          FT_INVALID( Invalid_Offset )
-
-  /* called when an invalid format/value is detected */
-#define FT_INVALID_FORMAT \
-          FT_INVALID( Invalid_Table )
-
-  /* called when an invalid glyph index is detected */
-#define FT_INVALID_GLYPH_ID \
-          FT_INVALID( Invalid_Glyph_Index )
-
-  /* called when an invalid field value is detected */
-#define FT_INVALID_DATA \
-          FT_INVALID( Invalid_Table )
-
-
-FT_END_HEADER
-
-#endif /* FTVALID_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/internal.h b/third_party/freetype/include/freetype/internal/internal.h
deleted file mode 100644
index 0204681..0000000
--- a/third_party/freetype/include/freetype/internal/internal.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  internal.h                                                             */
-/*                                                                         */
-/*    Internal header files (specification only).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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/ftdriver.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_AUTOHINT_H            <freetype/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/third_party/freetype/include/freetype/internal/psaux.h b/third_party/freetype/include/freetype/internal/psaux.h
deleted file mode 100644
index 286d604..0000000
--- a/third_party/freetype/include/freetype/internal/psaux.h
+++ /dev/null
@@ -1,879 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psaux.h                                                                */
-/*                                                                         */
-/*    Auxiliary functions and data structures related to PostScript fonts  */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 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_SERVICE_POSTSCRIPT_CMAPS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                             T1_TABLE                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  typedef struct PS_TableRec_*              PS_Table;
-  typedef const struct PS_Table_FuncsRec_*  PS_Table_Funcs;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_Table_FuncsRec                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A set of function pointers to manage PS_Table objects.             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    table_init    :: Used to initialize a table.                       */
-  /*                                                                       */
-  /*    table_done    :: Finalizes resp. destroy a given table.            */
-  /*                                                                       */
-  /*    table_add     :: Adds a new object to a table.                     */
-  /*                                                                       */
-  /*    table_release :: Releases table data, then finalizes it.           */
-  /*                                                                       */
-  typedef struct  PS_Table_FuncsRec_
-  {
-    FT_Error
-    (*init)( PS_Table   table,
-             FT_Int     count,
-             FT_Memory  memory );
-
-    void
-    (*done)( PS_Table  table );
-
-    FT_Error
-    (*add)( PS_Table  table,
-            FT_Int    idx,
-            void*     object,
-            FT_UInt   length );
-
-    void
-    (*release)( PS_Table  table );
-
-  } PS_Table_FuncsRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_TableRec                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A PS_Table is a simple object used to store an array of objects in */
-  /*    a single memory block.                                             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    block     :: The address in memory of the growheap's block.  This  */
-  /*                 can change between two object adds, due to            */
-  /*                 reallocation.                                         */
-  /*                                                                       */
-  /*    cursor    :: The current top of the grow heap within its block.    */
-  /*                                                                       */
-  /*    capacity  :: The current size of the heap block.  Increments by    */
-  /*                 1kByte chunks.                                        */
-  /*                                                                       */
-  /*    init      :: Set to 0xDEADBEEF if `elements' and `lengths' have    */
-  /*                 been allocated.                                       */
-  /*                                                                       */
-  /*    max_elems :: The maximum number of elements in table.              */
-  /*                                                                       */
-  /*    num_elems :: The current number of elements in table.              */
-  /*                                                                       */
-  /*    elements  :: A table of element addresses within the block.        */
-  /*                                                                       */
-  /*    lengths   :: A table of element sizes within the block.            */
-  /*                                                                       */
-  /*    memory    :: The object used for memory operations                 */
-  /*                 (alloc/realloc).                                      */
-  /*                                                                       */
-  /*    funcs     :: A table of method pointers for this object.           */
-  /*                                                                       */
-  typedef struct  PS_TableRec_
-  {
-    FT_Byte*           block;          /* current memory block           */
-    FT_Offset          cursor;         /* current cursor in memory block */
-    FT_Offset          capacity;       /* current size of memory block   */
-    FT_ULong           init;
-
-    FT_Int             max_elems;
-    FT_Int             num_elems;
-    FT_Byte**          elements;       /* addresses of table elements */
-    FT_UInt*           lengths;        /* lengths of table elements   */
-
-    FT_Memory          memory;
-    PS_Table_FuncsRec  funcs;
-
-  } PS_TableRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       T1 FIELDS & TOKENS                      *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct PS_ParserRec_*  PS_Parser;
-
-  typedef struct T1_TokenRec_*   T1_Token;
-
-  typedef struct T1_FieldRec_*   T1_Field;
-
-
-  /* simple enumeration type used to identify token types */
-  typedef enum  T1_TokenType_
-  {
-    T1_TOKEN_TYPE_NONE = 0,
-    T1_TOKEN_TYPE_ANY,
-    T1_TOKEN_TYPE_STRING,
-    T1_TOKEN_TYPE_ARRAY,
-    T1_TOKEN_TYPE_KEY, /* aka `name' */
-
-    /* do not remove */
-    T1_TOKEN_TYPE_MAX
-
-  } T1_TokenType;
-
-
-  /* a simple structure used to identify tokens */
-  typedef struct  T1_TokenRec_
-  {
-    FT_Byte*      start;   /* first character of token in input stream */
-    FT_Byte*      limit;   /* first character after the token          */
-    T1_TokenType  type;    /* type of token                            */
-
-  } T1_TokenRec;
-
-
-  /* enumeration type used to identify object fields */
-  typedef enum  T1_FieldType_
-  {
-    T1_FIELD_TYPE_NONE = 0,
-    T1_FIELD_TYPE_BOOL,
-    T1_FIELD_TYPE_INTEGER,
-    T1_FIELD_TYPE_FIXED,
-    T1_FIELD_TYPE_FIXED_1000,
-    T1_FIELD_TYPE_STRING,
-    T1_FIELD_TYPE_KEY,
-    T1_FIELD_TYPE_BBOX,
-    T1_FIELD_TYPE_MM_BBOX,
-    T1_FIELD_TYPE_INTEGER_ARRAY,
-    T1_FIELD_TYPE_FIXED_ARRAY,
-    T1_FIELD_TYPE_CALLBACK,
-
-    /* do not remove */
-    T1_FIELD_TYPE_MAX
-
-  } T1_FieldType;
-
-
-  typedef enum  T1_FieldLocation_
-  {
-    T1_FIELD_LOCATION_CID_INFO,
-    T1_FIELD_LOCATION_FONT_DICT,
-    T1_FIELD_LOCATION_FONT_EXTRA,
-    T1_FIELD_LOCATION_FONT_INFO,
-    T1_FIELD_LOCATION_PRIVATE,
-    T1_FIELD_LOCATION_BBOX,
-    T1_FIELD_LOCATION_LOADER,
-    T1_FIELD_LOCATION_FACE,
-    T1_FIELD_LOCATION_BLEND,
-
-    /* do not remove */
-    T1_FIELD_LOCATION_MAX
-
-  } T1_FieldLocation;
-
-
-  typedef void
-  (*T1_Field_ParseFunc)( FT_Face     face,
-                         FT_Pointer  parser );
-
-
-  /* structure type used to model object fields */
-  typedef struct  T1_FieldRec_
-  {
-    const char*         ident;        /* field identifier               */
-    T1_FieldLocation    location;
-    T1_FieldType        type;         /* type of field                  */
-    T1_Field_ParseFunc  reader;
-    FT_UInt             offset;       /* offset of field in object      */
-    FT_Byte             size;         /* size of field in bytes         */
-    FT_UInt             array_max;    /* maximum number of elements for */
-                                      /* array                          */
-    FT_UInt             count_offset; /* offset of element count for    */
-                                      /* arrays; must not be zero if in */
-                                      /* use -- in other words, a       */
-                                      /* `num_FOO' element must not     */
-                                      /* start the used structure if we */
-                                      /* parse a `FOO' array            */
-    FT_UInt             dict;         /* where we expect it             */
-  } T1_FieldRec;
-
-#define T1_FIELD_DICT_FONTDICT ( 1 << 0 ) /* also FontInfo and FDArray */
-#define T1_FIELD_DICT_PRIVATE  ( 1 << 1 )
-
-
-
-#define T1_NEW_SIMPLE_FIELD( _ident, _type, _fname, _dict ) \
-          {                                                 \
-            _ident, T1CODE, _type,                          \
-            0,                                              \
-            FT_FIELD_OFFSET( _fname ),                      \
-            FT_FIELD_SIZE( _fname ),                        \
-            0, 0,                                           \
-            _dict                                           \
-          },
-
-#define T1_NEW_CALLBACK_FIELD( _ident, _reader, _dict ) \
-          {                                             \
-            _ident, T1CODE, T1_FIELD_TYPE_CALLBACK,     \
-            (T1_Field_ParseFunc)_reader,                \
-            0, 0,                                       \
-            0, 0,                                       \
-            _dict                                       \
-          },
-
-#define T1_NEW_TABLE_FIELD( _ident, _type, _fname, _max, _dict ) \
-          {                                                      \
-            _ident, T1CODE, _type,                               \
-            0,                                                   \
-            FT_FIELD_OFFSET( _fname ),                           \
-            FT_FIELD_SIZE_DELTA( _fname ),                       \
-            _max,                                                \
-            FT_FIELD_OFFSET( num_ ## _fname ),                   \
-            _dict                                                \
-          },
-
-#define T1_NEW_TABLE_FIELD2( _ident, _type, _fname, _max, _dict ) \
-          {                                                       \
-            _ident, T1CODE, _type,                                \
-            0,                                                    \
-            FT_FIELD_OFFSET( _fname ),                            \
-            FT_FIELD_SIZE_DELTA( _fname ),                        \
-            _max, 0,                                              \
-            _dict                                                 \
-          },
-
-
-#define T1_FIELD_BOOL( _ident, _fname, _dict )                             \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BOOL, _fname, _dict )
-
-#define T1_FIELD_NUM( _ident, _fname, _dict )                                 \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER, _fname, _dict )
-
-#define T1_FIELD_FIXED( _ident, _fname, _dict )                             \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED, _fname, _dict )
-
-#define T1_FIELD_FIXED_1000( _ident, _fname, _dict )                     \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_1000, _fname, \
-                               _dict )
-
-#define T1_FIELD_STRING( _ident, _fname, _dict )                             \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_STRING, _fname, _dict )
-
-#define T1_FIELD_KEY( _ident, _fname, _dict )                             \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_KEY, _fname, _dict )
-
-#define T1_FIELD_BBOX( _ident, _fname, _dict )                             \
-          T1_NEW_SIMPLE_FIELD( _ident, T1_FIELD_TYPE_BBOX, _fname, _dict )
-
-
-#define T1_FIELD_NUM_TABLE( _ident, _fname, _fmax, _dict )         \
-          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
-                              _fname, _fmax, _dict )
-
-#define T1_FIELD_FIXED_TABLE( _ident, _fname, _fmax, _dict )     \
-          T1_NEW_TABLE_FIELD( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
-                              _fname, _fmax, _dict )
-
-#define T1_FIELD_NUM_TABLE2( _ident, _fname, _fmax, _dict )         \
-          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_INTEGER_ARRAY, \
-                               _fname, _fmax, _dict )
-
-#define T1_FIELD_FIXED_TABLE2( _ident, _fname, _fmax, _dict )     \
-          T1_NEW_TABLE_FIELD2( _ident, T1_FIELD_TYPE_FIXED_ARRAY, \
-                               _fname, _fmax, _dict )
-
-#define T1_FIELD_CALLBACK( _ident, _name, _dict )       \
-          T1_NEW_CALLBACK_FIELD( _ident, _name, _dict )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            T1 PARSER                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef const struct PS_Parser_FuncsRec_*  PS_Parser_Funcs;
-
-  typedef struct  PS_Parser_FuncsRec_
-  {
-    void
-    (*init)( PS_Parser  parser,
-             FT_Byte*   base,
-             FT_Byte*   limit,
-             FT_Memory  memory );
-
-    void
-    (*done)( PS_Parser  parser );
-
-    void
-    (*skip_spaces)( PS_Parser  parser );
-    void
-    (*skip_PS_token)( PS_Parser  parser );
-
-    FT_Long
-    (*to_int)( PS_Parser  parser );
-    FT_Fixed
-    (*to_fixed)( PS_Parser  parser,
-                 FT_Int     power_ten );
-
-    FT_Error
-    (*to_bytes)( PS_Parser  parser,
-                 FT_Byte*   bytes,
-                 FT_Offset  max_bytes,
-                 FT_ULong*  pnum_bytes,
-                 FT_Bool    delimiters );
-
-    FT_Int
-    (*to_coord_array)( PS_Parser  parser,
-                       FT_Int     max_coords,
-                       FT_Short*  coords );
-    FT_Int
-    (*to_fixed_array)( PS_Parser  parser,
-                       FT_Int     max_values,
-                       FT_Fixed*  values,
-                       FT_Int     power_ten );
-
-    void
-    (*to_token)( PS_Parser  parser,
-                 T1_Token   token );
-    void
-    (*to_token_array)( PS_Parser  parser,
-                       T1_Token   tokens,
-                       FT_UInt    max_tokens,
-                       FT_Int*    pnum_tokens );
-
-    FT_Error
-    (*load_field)( PS_Parser       parser,
-                   const T1_Field  field,
-                   void**          objects,
-                   FT_UInt         max_objects,
-                   FT_ULong*       pflags );
-
-    FT_Error
-    (*load_field_table)( PS_Parser       parser,
-                         const T1_Field  field,
-                         void**          objects,
-                         FT_UInt         max_objects,
-                         FT_ULong*       pflags );
-
-  } PS_Parser_FuncsRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_ParserRec                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A PS_Parser is an object used to parse a Type 1 font very quickly. */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    cursor :: The current position in the text.                        */
-  /*                                                                       */
-  /*    base   :: Start of the processed text.                             */
-  /*                                                                       */
-  /*    limit  :: End of the processed text.                               */
-  /*                                                                       */
-  /*    error  :: The last error returned.                                 */
-  /*                                                                       */
-  /*    memory :: The object used for memory operations (alloc/realloc).   */
-  /*                                                                       */
-  /*    funcs  :: A table of functions for the parser.                     */
-  /*                                                                       */
-  typedef struct  PS_ParserRec_
-  {
-    FT_Byte*   cursor;
-    FT_Byte*   base;
-    FT_Byte*   limit;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    PS_Parser_FuncsRec  funcs;
-
-  } PS_ParserRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                         T1 BUILDER                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  typedef struct T1_BuilderRec_*  T1_Builder;
-
-
-  typedef FT_Error
-  (*T1_Builder_Check_Points_Func)( T1_Builder  builder,
-                                   FT_Int      count );
-
-  typedef void
-  (*T1_Builder_Add_Point_Func)( T1_Builder  builder,
-                                FT_Pos      x,
-                                FT_Pos      y,
-                                FT_Byte     flag );
-
-  typedef FT_Error
-  (*T1_Builder_Add_Point1_Func)( T1_Builder  builder,
-                                 FT_Pos      x,
-                                 FT_Pos      y );
-
-  typedef FT_Error
-  (*T1_Builder_Add_Contour_Func)( T1_Builder  builder );
-
-  typedef FT_Error
-  (*T1_Builder_Start_Point_Func)( T1_Builder  builder,
-                                  FT_Pos      x,
-                                  FT_Pos      y );
-
-  typedef void
-  (*T1_Builder_Close_Contour_Func)( T1_Builder  builder );
-
-
-  typedef const struct T1_Builder_FuncsRec_*  T1_Builder_Funcs;
-
-  typedef struct  T1_Builder_FuncsRec_
-  {
-    void
-    (*init)( T1_Builder    builder,
-             FT_Face       face,
-             FT_Size       size,
-             FT_GlyphSlot  slot,
-             FT_Bool       hinting );
-
-    void
-    (*done)( T1_Builder   builder );
-
-    T1_Builder_Check_Points_Func   check_points;
-    T1_Builder_Add_Point_Func      add_point;
-    T1_Builder_Add_Point1_Func     add_point1;
-    T1_Builder_Add_Contour_Func    add_contour;
-    T1_Builder_Start_Point_Func    start_point;
-    T1_Builder_Close_Contour_Func  close_contour;
-
-  } T1_Builder_FuncsRec;
-
-
-  /* an enumeration type to handle charstring parsing states */
-  typedef enum  T1_ParseState_
-  {
-    T1_Parse_Start,
-    T1_Parse_Have_Width,
-    T1_Parse_Have_Moveto,
-    T1_Parse_Have_Path
-
-  } T1_ParseState;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Structure>                                                           */
-  /*    T1_BuilderRec                                                      */
-  /*                                                                       */
-  /* <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.                         */
-  /*                                                                       */
-  /*    max_points   :: maximum points in builder outline                  */
-  /*                                                                       */
-  /*    max_contours :: Maximum number of contours in builder 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.                                            */
-  /*                                                                       */
-  /*    parse_state  :: An enumeration which controls the charstring       */
-  /*                    parsing state.                                     */
-  /*                                                                       */
-  /*    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.                                            */
-  /*                                                                       */
-  /*    funcs        :: An array of function pointers for the builder.     */
-  /*                                                                       */
-  typedef struct  T1_BuilderRec_
-  {
-    FT_Memory       memory;
-    FT_Face         face;
-    FT_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 */
-    T1_ParseState   parse_state;
-    FT_Bool         load_points;
-    FT_Bool         no_recurse;
-
-    FT_Bool         metrics_only;
-
-    void*           hints_funcs;    /* hinter-specific */
-    void*           hints_globals;  /* hinter-specific */
-
-    T1_Builder_FuncsRec  funcs;
-
-  } T1_BuilderRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                         T1 DECODER                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#if 0
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine   */
-  /* calls during glyph loading.                                           */
-  /*                                                                       */
-#define T1_MAX_SUBRS_CALLS  8
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity.  A     */
-  /* minimum of 16 is required.                                            */
-  /*                                                                       */
-#define T1_MAX_CHARSTRINGS_OPERANDS  32
-
-#endif /* 0 */
-
-
-  typedef struct  T1_Decoder_ZoneRec_
-  {
-    FT_Byte*  cursor;
-    FT_Byte*  base;
-    FT_Byte*  limit;
-
-  } T1_Decoder_ZoneRec, *T1_Decoder_Zone;
-
-
-  typedef struct T1_DecoderRec_*              T1_Decoder;
-  typedef const struct T1_Decoder_FuncsRec_*  T1_Decoder_Funcs;
-
-
-  typedef FT_Error
-  (*T1_Decoder_Callback)( T1_Decoder  decoder,
-                          FT_UInt     glyph_index );
-
-
-  typedef struct  T1_Decoder_FuncsRec_
-  {
-    FT_Error
-    (*init)( T1_Decoder           decoder,
-             FT_Face              face,
-             FT_Size              size,
-             FT_GlyphSlot         slot,
-             FT_Byte**            glyph_names,
-             PS_Blend             blend,
-             FT_Bool              hinting,
-             FT_Render_Mode       hint_mode,
-             T1_Decoder_Callback  callback );
-
-    void
-    (*done)( T1_Decoder  decoder );
-
-    FT_Error
-    (*parse_charstrings)( T1_Decoder  decoder,
-                          FT_Byte*    base,
-                          FT_UInt     len );
-
-  } T1_Decoder_FuncsRec;
-
-
-  typedef struct  T1_DecoderRec_
-  {
-    T1_BuilderRec        builder;
-
-    FT_Long              stack[T1_MAX_CHARSTRINGS_OPERANDS];
-    FT_Long*             top;
-
-    T1_Decoder_ZoneRec   zones[T1_MAX_SUBRS_CALLS + 1];
-    T1_Decoder_Zone      zone;
-
-    FT_Service_PsCMaps   psnames;      /* for seac */
-    FT_UInt              num_glyphs;
-    FT_Byte**            glyph_names;
-
-    FT_Int               lenIV;        /* internal for sub routine calls */
-    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;
-
-    FT_Int               flex_state;
-    FT_Int               num_flex_vectors;
-    FT_Vector            flex_vectors[7];
-
-    PS_Blend             blend;       /* for multiple master support */
-
-    FT_Render_Mode       hint_mode;
-
-    T1_Decoder_Callback  parse_callback;
-    T1_Decoder_FuncsRec  funcs;
-
-    FT_Long*             buildchar;
-    FT_UInt              len_buildchar;
-
-    FT_Bool              seac;
-
-  } T1_DecoderRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            AFM PARSER                         *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct AFM_ParserRec_*  AFM_Parser;
-
-  typedef struct  AFM_Parser_FuncsRec_
-  {
-    FT_Error
-    (*init)( AFM_Parser  parser,
-             FT_Memory   memory,
-             FT_Byte*    base,
-             FT_Byte*    limit );
-
-    void
-    (*done)( AFM_Parser  parser );
-
-    FT_Error
-    (*parse)( AFM_Parser  parser );
-
-  } AFM_Parser_FuncsRec;
-
-
-  typedef struct AFM_StreamRec_*  AFM_Stream;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    AFM_ParserRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An AFM_Parser is a parser for the AFM files.                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    memory    :: The object used for memory operations (alloc and      */
-  /*                 realloc).                                             */
-  /*                                                                       */
-  /*    stream    :: This is an opaque object.                             */
-  /*                                                                       */
-  /*    FontInfo  :: The result will be stored here.                       */
-  /*                                                                       */
-  /*    get_index :: A user provided function to get a glyph index by its  */
-  /*                 name.                                                 */
-  /*                                                                       */
-  typedef struct  AFM_ParserRec_
-  {
-    FT_Memory     memory;
-    AFM_Stream    stream;
-
-    AFM_FontInfo  FontInfo;
-
-    FT_Int
-    (*get_index)( const char*  name,
-                  FT_Offset    len,
-                  void*        user_data );
-
-    void*         user_data;
-
-  } AFM_ParserRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                     TYPE1 CHARMAPS                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef const struct T1_CMap_ClassesRec_*  T1_CMap_Classes;
-
-  typedef struct T1_CMap_ClassesRec_
-  {
-    FT_CMap_Class  standard;
-    FT_CMap_Class  expert;
-    FT_CMap_Class  custom;
-    FT_CMap_Class  unicode;
-
-  } T1_CMap_ClassesRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                        PSAux Module Interface                 *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct  PSAux_ServiceRec_
-  {
-    /* don't use `PS_Table_Funcs' and friends to avoid compiler warnings */
-    const PS_Table_FuncsRec*    ps_table_funcs;
-    const PS_Parser_FuncsRec*   ps_parser_funcs;
-    const T1_Builder_FuncsRec*  t1_builder_funcs;
-    const T1_Decoder_FuncsRec*  t1_decoder_funcs;
-
-    void
-    (*t1_decrypt)( FT_Byte*   buffer,
-                   FT_Offset  length,
-                   FT_UShort  seed );
-
-    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;
-
-  } PSAux_ServiceRec, *PSAux_Service;
-
-  /* backwards-compatible type definition */
-  typedef PSAux_ServiceRec   PSAux_Interface;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                 Some convenience functions                    *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#define IS_PS_NEWLINE( ch ) \
-  ( (ch) == '\r' ||         \
-    (ch) == '\n' )
-
-#define IS_PS_SPACE( ch )  \
-  ( (ch) == ' '         || \
-    IS_PS_NEWLINE( ch ) || \
-    (ch) == '\t'        || \
-    (ch) == '\f'        || \
-    (ch) == '\0' )
-
-#define IS_PS_SPECIAL( ch )       \
-  ( (ch) == '/'                || \
-    (ch) == '(' || (ch) == ')' || \
-    (ch) == '<' || (ch) == '>' || \
-    (ch) == '[' || (ch) == ']' || \
-    (ch) == '{' || (ch) == '}' || \
-    (ch) == '%'                )
-
-#define IS_PS_DELIM( ch )  \
-  ( IS_PS_SPACE( ch )   || \
-    IS_PS_SPECIAL( ch ) )
-
-#define IS_PS_DIGIT( ch )        \
-  ( (ch) >= '0' && (ch) <= '9' )
-
-#define IS_PS_XDIGIT( ch )            \
-  ( IS_PS_DIGIT( ch )              || \
-    ( (ch) >= 'A' && (ch) <= 'F' ) || \
-    ( (ch) >= 'a' && (ch) <= 'f' ) )
-
-#define IS_PS_BASE85( ch )       \
-  ( (ch) >= '!' && (ch) <= 'u' )
-
-#define IS_PS_TOKEN( cur, limit, token )                                \
-  ( (char)(cur)[0] == (token)[0]                                     && \
-    ( (cur) + sizeof ( (token) ) == (limit) ||                          \
-      ( (cur) + sizeof( (token) ) < (limit)          &&                 \
-        IS_PS_DELIM( (cur)[sizeof ( (token) ) - 1] ) ) )             && \
-    ft_strncmp( (char*)(cur), (token), sizeof ( (token) ) - 1 ) == 0 )
-
-
-FT_END_HEADER
-
-#endif /* PSAUX_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/pshints.h b/third_party/freetype/include/freetype/internal/pshints.h
deleted file mode 100644
index 49116eb..0000000
--- a/third_party/freetype/include/freetype/internal/pshints.h
+++ /dev/null
@@ -1,722 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshints.h                                                              */
-/*                                                                         */
-/*    Interface to Postscript-specific (Type 1 and Type 2) hints           */
-/*    recorders (specification only).  These are used to support native    */
-/*    T1/T2 hints in the `type1', `cid', and `cff' font drivers.           */
-/*                                                                         */
-/*  Copyright 2001-2017 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 PSHINTS_H_
-#define PSHINTS_H_
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TYPE1_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****               INTERNAL REPRESENTATION OF GLOBALS              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct PSH_GlobalsRec_*  PSH_Globals;
-
-  typedef FT_Error
-  (*PSH_Globals_NewFunc)( FT_Memory     memory,
-                          T1_Private*   private_dict,
-                          PSH_Globals*  aglobals );
-
-  typedef void
-  (*PSH_Globals_SetScaleFunc)( PSH_Globals  globals,
-                               FT_Fixed     x_scale,
-                               FT_Fixed     y_scale,
-                               FT_Fixed     x_delta,
-                               FT_Fixed     y_delta );
-
-  typedef void
-  (*PSH_Globals_DestroyFunc)( PSH_Globals  globals );
-
-
-  typedef struct  PSH_Globals_FuncsRec_
-  {
-    PSH_Globals_NewFunc       create;
-    PSH_Globals_SetScaleFunc  set_scale;
-    PSH_Globals_DestroyFunc   destroy;
-
-  } PSH_Globals_FuncsRec, *PSH_Globals_Funcs;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                  PUBLIC TYPE 1 HINTS RECORDER                 *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************
-   *
-   * @type:
-   *   T1_Hints
-   *
-   * @description:
-   *   This is a handle to an opaque structure used to record glyph hints
-   *   from a Type 1 character glyph character string.
-   *
-   *   The methods used to operate on this object are defined by the
-   *   @T1_Hints_FuncsRec structure.  Recording glyph hints is normally
-   *   achieved through the following scheme:
-   *
-   *   - Open a new hint recording session by calling the `open' method.
-   *     This rewinds the recorder and prepare it for new input.
-   *
-   *   - For each hint found in the glyph charstring, call the corresponding
-   *     method (`stem', `stem3', or `reset').  Note that these functions do
-   *     not return an error code.
-   *
-   *   - Close the recording session by calling the `close' method.  It
-   *     returns an error code if the hints were invalid or something
-   *     strange happened (e.g., memory shortage).
-   *
-   *   The hints accumulated in the object can later be used by the
-   *   PostScript hinter.
-   *
-   */
-  typedef struct T1_HintsRec_*  T1_Hints;
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   T1_Hints_Funcs
-   *
-   * @description:
-   *   A pointer to the @T1_Hints_FuncsRec structure that defines the API of
-   *   a given @T1_Hints object.
-   *
-   */
-  typedef const struct T1_Hints_FuncsRec_*  T1_Hints_Funcs;
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_OpenFunc
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to prepare it for a new Type 1
-   *   hints recording session.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   * @note:
-   *   You should always call the @T1_Hints_CloseFunc method in order to
-   *   close an opened recording session.
-   *
-   */
-  typedef void
-  (*T1_Hints_OpenFunc)( T1_Hints  hints );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_SetStemFunc
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to record a new horizontal or
-   *   vertical stem.  This corresponds to the Type 1 `hstem' and `vstem'
-   *   operators.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   *   dimension ::
-   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
-   *
-   *   coords ::
-   *     Array of 2 coordinates in 16.16 format, used as (position,length)
-   *     stem descriptor.
-   *
-   * @note:
-   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
-   *   horizontal coordinates (x) for vertical stems (dim=1).
-   *
-   *   `coords[0]' is the absolute stem position (lowest coordinate);
-   *   `coords[1]' is the length.
-   *
-   *   The length can be negative, in which case it must be either -20 or
-   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
-   *   specification.
-   *
-   *   If the length is -21 (corresponding to a bottom ghost stem), then
-   *   the real stem position is `coords[0]+coords[1]'.
-   *
-   */
-  typedef void
-  (*T1_Hints_SetStemFunc)( T1_Hints   hints,
-                           FT_UInt    dimension,
-                           FT_Fixed*  coords );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_SetStem3Func
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to record three
-   *   counter-controlled horizontal or vertical stems at once.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   *   dimension ::
-   *     0 for horizontal stems, 1 for vertical ones.
-   *
-   *   coords ::
-   *     An array of 6 values in 16.16 format, holding 3 (position,length)
-   *     pairs for the counter-controlled stems.
-   *
-   * @note:
-   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
-   *   horizontal coordinates (x) for vertical stems (dim=1).
-   *
-   *   The lengths cannot be negative (ghost stems are never
-   *   counter-controlled).
-   *
-   */
-  typedef void
-  (*T1_Hints_SetStem3Func)( T1_Hints   hints,
-                            FT_UInt    dimension,
-                            FT_Fixed*  coords );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_ResetFunc
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to reset the stems hints in a
-   *   recording session.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   *   end_point ::
-   *     The index of the last point in the input glyph in which the
-   *     previously defined hints apply.
-   *
-   */
-  typedef void
-  (*T1_Hints_ResetFunc)( T1_Hints  hints,
-                         FT_UInt   end_point );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_CloseFunc
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to close a hint recording
-   *   session.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   *   end_point ::
-   *     The index of the last point in the input glyph.
-   *
-   * @return:
-   *   FreeType error code.  0 means success.
-   *
-   * @note:
-   *   The error code is set to indicate that an error occurred during the
-   *   recording session.
-   *
-   */
-  typedef FT_Error
-  (*T1_Hints_CloseFunc)( T1_Hints  hints,
-                         FT_UInt   end_point );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T1_Hints_ApplyFunc
-   *
-   * @description:
-   *   A method of the @T1_Hints class used to apply hints to the
-   *   corresponding glyph outline.  Must be called once all hints have been
-   *   recorded.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 1 hints recorder.
-   *
-   *   outline ::
-   *     A pointer to the target outline descriptor.
-   *
-   *   globals ::
-   *     The hinter globals for this font.
-   *
-   *   hint_mode ::
-   *     Hinting information.
-   *
-   * @return:
-   *   FreeType error code.  0 means success.
-   *
-   * @note:
-   *   On input, all points within the outline are in font coordinates. On
-   *   output, they are in 1/64th of pixels.
-   *
-   *   The scaling transformation is taken from the `globals' object which
-   *   must correspond to the same font as the glyph.
-   *
-   */
-  typedef FT_Error
-  (*T1_Hints_ApplyFunc)( T1_Hints        hints,
-                         FT_Outline*     outline,
-                         PSH_Globals     globals,
-                         FT_Render_Mode  hint_mode );
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   T1_Hints_FuncsRec
-   *
-   * @description:
-   *   The structure used to provide the API to @T1_Hints objects.
-   *
-   * @fields:
-   *   hints ::
-   *     A handle to the T1 Hints recorder.
-   *
-   *   open ::
-   *     The function to open a recording session.
-   *
-   *   close ::
-   *     The function to close a recording session.
-   *
-   *   stem ::
-   *     The function to set a simple stem.
-   *
-   *   stem3 ::
-   *     The function to set counter-controlled stems.
-   *
-   *   reset ::
-   *     The function to reset stem hints.
-   *
-   *   apply ::
-   *     The function to apply the hints to the corresponding glyph outline.
-   *
-   */
-  typedef struct  T1_Hints_FuncsRec_
-  {
-    T1_Hints               hints;
-    T1_Hints_OpenFunc      open;
-    T1_Hints_CloseFunc     close;
-    T1_Hints_SetStemFunc   stem;
-    T1_Hints_SetStem3Func  stem3;
-    T1_Hints_ResetFunc     reset;
-    T1_Hints_ApplyFunc     apply;
-
-  } T1_Hints_FuncsRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                  PUBLIC TYPE 2 HINTS RECORDER                 *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************
-   *
-   * @type:
-   *   T2_Hints
-   *
-   * @description:
-   *   This is a handle to an opaque structure used to record glyph hints
-   *   from a Type 2 character glyph character string.
-   *
-   *   The methods used to operate on this object are defined by the
-   *   @T2_Hints_FuncsRec structure.  Recording glyph hints is normally
-   *   achieved through the following scheme:
-   *
-   *   - Open a new hint recording session by calling the `open' method.
-   *     This rewinds the recorder and prepare it for new input.
-   *
-   *   - For each hint found in the glyph charstring, call the corresponding
-   *     method (`stems', `hintmask', `counters').  Note that these
-   *     functions do not return an error code.
-   *
-   *   - Close the recording session by calling the `close' method.  It
-   *     returns an error code if the hints were invalid or something
-   *     strange happened (e.g., memory shortage).
-   *
-   *   The hints accumulated in the object can later be used by the
-   *   Postscript hinter.
-   *
-   */
-  typedef struct T2_HintsRec_*  T2_Hints;
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   T2_Hints_Funcs
-   *
-   * @description:
-   *   A pointer to the @T2_Hints_FuncsRec structure that defines the API of
-   *   a given @T2_Hints object.
-   *
-   */
-  typedef const struct T2_Hints_FuncsRec_*  T2_Hints_Funcs;
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_OpenFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to prepare it for a new Type 2
-   *   hints recording session.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   * @note:
-   *   You should always call the @T2_Hints_CloseFunc method in order to
-   *   close an opened recording session.
-   *
-   */
-  typedef void
-  (*T2_Hints_OpenFunc)( T2_Hints  hints );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_StemsFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to set the table of stems in
-   *   either the vertical or horizontal dimension.  Equivalent to the
-   *   `hstem', `vstem', `hstemhm', and `vstemhm' Type 2 operators.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   *   dimension ::
-   *     0 for horizontal stems (hstem), 1 for vertical ones (vstem).
-   *
-   *   count ::
-   *     The number of stems.
-   *
-   *   coords ::
-   *     An array of `count' (position,length) pairs in 16.16 format.
-   *
-   * @note:
-   *   Use vertical coordinates (y) for horizontal stems (dim=0).  Use
-   *   horizontal coordinates (x) for vertical stems (dim=1).
-   *
-   *   There are `2*count' elements in the `coords' array.  Each even
-   *   element is an absolute position in font units, each odd element is a
-   *   length in font units.
-   *
-   *   A length can be negative, in which case it must be either -20 or
-   *   -21.  It is interpreted as a `ghost' stem, according to the Type 1
-   *   specification.
-   *
-   */
-  typedef void
-  (*T2_Hints_StemsFunc)( T2_Hints   hints,
-                         FT_UInt    dimension,
-                         FT_Int     count,
-                         FT_Fixed*  coordinates );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_MaskFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to set a given hintmask (this
-   *   corresponds to the `hintmask' Type 2 operator).
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   *   end_point ::
-   *     The glyph index of the last point to which the previously defined
-   *     or activated hints apply.
-   *
-   *   bit_count ::
-   *     The number of bits in the hint mask.
-   *
-   *   bytes ::
-   *     An array of bytes modelling the hint mask.
-   *
-   * @note:
-   *   If the hintmask starts the charstring (before any glyph point
-   *   definition), the value of `end_point' should be 0.
-   *
-   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
-   *   must be equal to the total number of hints defined so far (i.e.,
-   *   horizontal+verticals).
-   *
-   *   The `bytes' array can come directly from the Type 2 charstring and
-   *   respects the same format.
-   *
-   */
-  typedef void
-  (*T2_Hints_MaskFunc)( T2_Hints        hints,
-                        FT_UInt         end_point,
-                        FT_UInt         bit_count,
-                        const FT_Byte*  bytes );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_CounterFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to set a given counter mask
-   *   (this corresponds to the `hintmask' Type 2 operator).
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   *   end_point ::
-   *     A glyph index of the last point to which the previously defined or
-   *     active hints apply.
-   *
-   *   bit_count ::
-   *     The number of bits in the hint mask.
-   *
-   *   bytes ::
-   *     An array of bytes modelling the hint mask.
-   *
-   * @note:
-   *   If the hintmask starts the charstring (before any glyph point
-   *   definition), the value of `end_point' should be 0.
-   *
-   *   `bit_count' is the number of meaningful bits in the `bytes' array; it
-   *   must be equal to the total number of hints defined so far (i.e.,
-   *   horizontal+verticals).
-   *
-   *    The `bytes' array can come directly from the Type 2 charstring and
-   *    respects the same format.
-   *
-   */
-  typedef void
-  (*T2_Hints_CounterFunc)( T2_Hints        hints,
-                           FT_UInt         bit_count,
-                           const FT_Byte*  bytes );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_CloseFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to close a hint recording
-   *   session.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   *   end_point ::
-   *     The index of the last point in the input glyph.
-   *
-   * @return:
-   *   FreeType error code.  0 means success.
-   *
-   * @note:
-   *   The error code is set to indicate that an error occurred during the
-   *   recording session.
-   *
-   */
-  typedef FT_Error
-  (*T2_Hints_CloseFunc)( T2_Hints  hints,
-                         FT_UInt   end_point );
-
-
-  /*************************************************************************
-   *
-   * @functype:
-   *   T2_Hints_ApplyFunc
-   *
-   * @description:
-   *   A method of the @T2_Hints class used to apply hints to the
-   *   corresponding glyph outline.  Must be called after the `close'
-   *   method.
-   *
-   * @input:
-   *   hints ::
-   *     A handle to the Type 2 hints recorder.
-   *
-   *   outline ::
-   *     A pointer to the target outline descriptor.
-   *
-   *   globals ::
-   *     The hinter globals for this font.
-   *
-   *   hint_mode ::
-   *     Hinting information.
-   *
-   * @return:
-   *   FreeType error code.  0 means success.
-   *
-   * @note:
-   *   On input, all points within the outline are in font coordinates. On
-   *   output, they are in 1/64th of pixels.
-   *
-   *   The scaling transformation is taken from the `globals' object which
-   *   must correspond to the same font than the glyph.
-   *
-   */
-  typedef FT_Error
-  (*T2_Hints_ApplyFunc)( T2_Hints        hints,
-                         FT_Outline*     outline,
-                         PSH_Globals     globals,
-                         FT_Render_Mode  hint_mode );
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   T2_Hints_FuncsRec
-   *
-   * @description:
-   *   The structure used to provide the API to @T2_Hints objects.
-   *
-   * @fields:
-   *   hints ::
-   *     A handle to the T2 hints recorder object.
-   *
-   *   open ::
-   *     The function to open a recording session.
-   *
-   *   close ::
-   *     The function to close a recording session.
-   *
-   *   stems ::
-   *     The function to set the dimension's stems table.
-   *
-   *   hintmask ::
-   *     The function to set hint masks.
-   *
-   *   counter ::
-   *     The function to set counter masks.
-   *
-   *   apply ::
-   *     The function to apply the hints on the corresponding glyph outline.
-   *
-   */
-  typedef struct  T2_Hints_FuncsRec_
-  {
-    T2_Hints              hints;
-    T2_Hints_OpenFunc     open;
-    T2_Hints_CloseFunc    close;
-    T2_Hints_StemsFunc    stems;
-    T2_Hints_MaskFunc     hintmask;
-    T2_Hints_CounterFunc  counter;
-    T2_Hints_ApplyFunc    apply;
-
-  } T2_Hints_FuncsRec;
-
-
-  /* */
-
-
-  typedef struct  PSHinter_Interface_
-  {
-    PSH_Globals_Funcs  (*get_globals_funcs)( FT_Module  module );
-    T1_Hints_Funcs     (*get_t1_funcs)     ( FT_Module  module );
-    T2_Hints_Funcs     (*get_t2_funcs)     ( FT_Module  module );
-
-  } PSHinter_Interface;
-
-  typedef PSHinter_Interface*  PSHinter_Service;
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_PSHINTER_INTERFACE(        \
-          class_,                            \
-          get_globals_funcs_,                \
-          get_t1_funcs_,                     \
-          get_t2_funcs_ )                    \
-  static const PSHinter_Interface  class_ =  \
-  {                                          \
-    get_globals_funcs_,                      \
-    get_t1_funcs_,                           \
-    get_t2_funcs_                            \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_PSHINTER_INTERFACE(                      \
-          class_,                                          \
-          get_globals_funcs_,                              \
-          get_t1_funcs_,                                   \
-          get_t2_funcs_ )                                  \
-  void                                                     \
-  FT_Init_Class_ ## class_( FT_Library           library,  \
-                            PSHinter_Interface*  clazz )   \
-  {                                                        \
-    FT_UNUSED( library );                                  \
-                                                           \
-    clazz->get_globals_funcs = get_globals_funcs_;         \
-    clazz->get_t1_funcs      = get_t1_funcs_;              \
-    clazz->get_t2_funcs      = get_t2_funcs_;              \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-FT_END_HEADER
-
-#endif /* PSHINTS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svcid.h b/third_party/freetype/include/freetype/internal/services/svcid.h
deleted file mode 100644
index cce94d8..0000000
--- a/third_party/freetype/include/freetype/internal/services/svcid.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svcid.h                                                                */
-/*                                                                         */
-/*    The FreeType CID font services (specification).                      */
-/*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
-/*  Derek Clegg and Michael Toftdal.                                       */
-/*                                                                         */
-/*  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 SVCID_H_
-#define SVCID_H_
-
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_CID  "CID"
-
-  typedef FT_Error
-  (*FT_CID_GetRegistryOrderingSupplementFunc)( FT_Face       face,
-                                               const char*  *registry,
-                                               const char*  *ordering,
-                                               FT_Int       *supplement );
-  typedef FT_Error
-  (*FT_CID_GetIsInternallyCIDKeyedFunc)( FT_Face   face,
-                                         FT_Bool  *is_cid );
-  typedef FT_Error
-  (*FT_CID_GetCIDFromGlyphIndexFunc)( FT_Face   face,
-                                      FT_UInt   glyph_index,
-                                      FT_UInt  *cid );
-
-  FT_DEFINE_SERVICE( CID )
-  {
-    FT_CID_GetRegistryOrderingSupplementFunc  get_ros;
-    FT_CID_GetIsInternallyCIDKeyedFunc        get_is_cid;
-    FT_CID_GetCIDFromGlyphIndexFunc           get_cid_from_glyph_index;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
-                                  get_ros_,                                 \
-                                  get_is_cid_,                              \
-                                  get_cid_from_glyph_index_ )               \
-  static const FT_Service_CIDRec class_ =                                   \
-  {                                                                         \
-    get_ros_, get_is_cid_, get_cid_from_glyph_index_                        \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_CIDREC( class_,                                   \
-                                  get_ros_,                                 \
-                                  get_is_cid_,                              \
-                                  get_cid_from_glyph_index_ )               \
-  void                                                                      \
-  FT_Init_Class_ ## class_( FT_Library          library,                    \
-                            FT_Service_CIDRec*  clazz )                     \
-  {                                                                         \
-    FT_UNUSED( library );                                                   \
-                                                                            \
-    clazz->get_ros                  = get_ros_;                             \
-    clazz->get_is_cid               = get_is_cid_;                          \
-    clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_;            \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVCID_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svfntfmt.h b/third_party/freetype/include/freetype/internal/services/svfntfmt.h
deleted file mode 100644
index 376d925..0000000
--- a/third_party/freetype/include/freetype/internal/services/svfntfmt.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svfntfmt.h                                                             */
-/*                                                                         */
-/*    The FreeType font format service (specification only).               */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVFNTFMT_H_
-#define SVFNTFMT_H_
-
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   *  A trivial service used to return the name of a face's font driver,
-   *  according to the XFree86 nomenclature.  Note that the service data
-   *  is a simple constant string pointer.
-   */
-
-#define FT_SERVICE_ID_FONT_FORMAT  "font-format"
-
-#define FT_FONT_FORMAT_TRUETYPE  "TrueType"
-#define FT_FONT_FORMAT_TYPE_1    "Type 1"
-#define FT_FONT_FORMAT_BDF       "BDF"
-#define FT_FONT_FORMAT_PCF       "PCF"
-#define FT_FONT_FORMAT_TYPE_42   "Type 42"
-#define FT_FONT_FORMAT_CID       "CID Type 1"
-#define FT_FONT_FORMAT_CFF       "CFF"
-#define FT_FONT_FORMAT_PFR       "PFR"
-#define FT_FONT_FORMAT_WINFNT    "Windows FNT"
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVFNTFMT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svgldict.h b/third_party/freetype/include/freetype/internal/services/svgldict.h
deleted file mode 100644
index 0cd1361..0000000
--- a/third_party/freetype/include/freetype/internal/services/svgldict.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svgldict.h                                                             */
-/*                                                                         */
-/*    The FreeType glyph dictionary services (specification).              */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVGLDICT_H_
-#define SVGLDICT_H_
-
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   *  A service used to retrieve glyph names, as well as to find the
-   *  index of a given glyph name in a font.
-   *
-   */
-
-#define FT_SERVICE_ID_GLYPH_DICT  "glyph-dict"
-
-
-  typedef FT_Error
-  (*FT_GlyphDict_GetNameFunc)( FT_Face     face,
-                               FT_UInt     glyph_index,
-                               FT_Pointer  buffer,
-                               FT_UInt     buffer_max );
-
-  typedef FT_UInt
-  (*FT_GlyphDict_NameIndexFunc)( FT_Face     face,
-                                 FT_String*  glyph_name );
-
-
-  FT_DEFINE_SERVICE( GlyphDict )
-  {
-    FT_GlyphDict_GetNameFunc    get_name;
-    FT_GlyphDict_NameIndexFunc  name_index;  /* optional */
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
-                                        get_name_,                     \
-                                        name_index_)                   \
-  static const FT_Service_GlyphDictRec  class_ =                       \
-  {                                                                    \
-    get_name_, name_index_                                             \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_,                        \
-                                        get_name_,                     \
-                                        name_index_)                   \
-  void                                                                 \
-  FT_Init_Class_ ## class_( FT_Library                library,         \
-                            FT_Service_GlyphDictRec*  clazz )          \
-  {                                                                    \
-    FT_UNUSED( library );                                              \
-                                                                       \
-    clazz->get_name   = get_name_;                                     \
-    clazz->name_index = name_index_;                                   \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVGLDICT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svkern.h b/third_party/freetype/include/freetype/internal/services/svkern.h
deleted file mode 100644
index b8344e9..0000000
--- a/third_party/freetype/include/freetype/internal/services/svkern.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svkern.h                                                               */
-/*                                                                         */
-/*    The FreeType Kerning service (specification).                        */
-/*                                                                         */
-/*  Copyright 2006-2017 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 SVKERN_H_
-#define SVKERN_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_TRUETYPE_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-#define FT_SERVICE_ID_KERNING  "kerning"
-
-
-  typedef FT_Error
-  (*FT_Kerning_TrackGetFunc)( FT_Face    face,
-                              FT_Fixed   point_size,
-                              FT_Int     degree,
-                              FT_Fixed*  akerning );
-
-  FT_DEFINE_SERVICE( Kerning )
-  {
-    FT_Kerning_TrackGetFunc  get_track;
-  };
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVKERN_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svmetric.h b/third_party/freetype/include/freetype/internal/services/svmetric.h
deleted file mode 100644
index cac9bf8..0000000
--- a/third_party/freetype/include/freetype/internal/services/svmetric.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svmetric.h                                                             */
-/*                                                                         */
-/*    The FreeType services for metrics variations (specification).        */
-/*                                                                         */
-/*  Copyright 2016-2017 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/third_party/freetype/include/freetype/internal/services/svmm.h b/third_party/freetype/include/freetype/internal/services/svmm.h
deleted file mode 100644
index 97af1ac..0000000
--- a/third_party/freetype/include/freetype/internal/services/svmm.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svmm.h                                                                 */
-/*                                                                         */
-/*    The FreeType Multiple Masters and GX var services (specification).   */
-/*                                                                         */
-/*  Copyright 2003-2017 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 );
-
-  typedef FT_Error
-  (*FT_Get_Var_Design_Func)( FT_Face    face,
-                             FT_UInt    num_coords,
-                             FT_Fixed*  coords );
-
-  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_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;
-
-    /* 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_,  \
-                                           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_,                                         \
-    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_,      \
-                                           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->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/third_party/freetype/include/freetype/internal/services/svpostnm.h b/third_party/freetype/include/freetype/internal/services/svpostnm.h
deleted file mode 100644
index 022cdec..0000000
--- a/third_party/freetype/include/freetype/internal/services/svpostnm.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svpostnm.h                                                             */
-/*                                                                         */
-/*    The FreeType PostScript name services (specification).               */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVPOSTNM_H_
-#define SVPOSTNM_H_
-
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-  /*
-   *  A trivial service used to retrieve the PostScript name of a given
-   *  font when available.  The `get_name' field should never be NULL.
-   *
-   *  The corresponding function can return NULL to indicate that the
-   *  PostScript name is not available.
-   *
-   *  The name is owned by the face and will be destroyed with it.
-   */
-
-#define FT_SERVICE_ID_POSTSCRIPT_FONT_NAME  "postscript-font-name"
-
-
-  typedef const char*
-  (*FT_PsName_GetFunc)( FT_Face  face );
-
-
-  FT_DEFINE_SERVICE( PsFontName )
-  {
-    FT_PsName_GetFunc  get_ps_font_name;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
-  static const FT_Service_PsFontNameRec  class_ =                    \
-  {                                                                  \
-    get_ps_font_name_                                                \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \
-  void                                                               \
-  FT_Init_Class_ ## class_( FT_Library                 library,      \
-                            FT_Service_PsFontNameRec*  clazz )       \
-  {                                                                  \
-    FT_UNUSED( library );                                            \
-                                                                     \
-    clazz->get_ps_font_name = get_ps_font_name_;                     \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVPOSTNM_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svprop.h b/third_party/freetype/include/freetype/internal/services/svprop.h
deleted file mode 100644
index eb2d4ee..0000000
--- a/third_party/freetype/include/freetype/internal/services/svprop.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svprop.h                                                               */
-/*                                                                         */
-/*    The FreeType property service (specification).                       */
-/*                                                                         */
-/*  Copyright 2012-2017 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 SVPROP_H_
-#define SVPROP_H_
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_PROPERTIES  "properties"
-
-
-  typedef FT_Error
-  (*FT_Properties_SetFunc)( FT_Module    module,
-                            const char*  property_name,
-                            const void*  value,
-                            FT_Bool      value_is_string );
-
-  typedef FT_Error
-  (*FT_Properties_GetFunc)( FT_Module    module,
-                            const char*  property_name,
-                            void*        value );
-
-
-  FT_DEFINE_SERVICE( Properties )
-  {
-    FT_Properties_SetFunc  set_property;
-    FT_Properties_GetFunc  get_property;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,          \
-                                         set_property_,   \
-                                         get_property_ )  \
-  static const FT_Service_PropertiesRec  class_ =         \
-  {                                                       \
-    set_property_,                                        \
-    get_property_                                         \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_PROPERTIESREC( class_,                \
-                                         set_property_,         \
-                                         get_property_ )        \
-  void                                                          \
-  FT_Init_Class_ ## class_( FT_Service_PropertiesRec*  clazz )  \
-  {                                                             \
-    clazz->set_property = set_property_;                        \
-    clazz->get_property = get_property_;                        \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVPROP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svpscmap.h b/third_party/freetype/include/freetype/internal/services/svpscmap.h
deleted file mode 100644
index b32122e..0000000
--- a/third_party/freetype/include/freetype/internal/services/svpscmap.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svpscmap.h                                                             */
-/*                                                                         */
-/*    The FreeType PostScript charmap service (specification).             */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVPSCMAP_H_
-#define SVPSCMAP_H_
-
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_POSTSCRIPT_CMAPS  "postscript-cmaps"
-
-
-  /*
-   *  Adobe glyph name to unicode value.
-   */
-  typedef FT_UInt32
-  (*PS_Unicode_ValueFunc)( const char*  glyph_name );
-
-  /*
-   *  Macintosh name id to glyph name.  NULL if invalid index.
-   */
-  typedef const char*
-  (*PS_Macintosh_NameFunc)( FT_UInt  name_index );
-
-  /*
-   *  Adobe standard string ID to glyph name.  NULL if invalid index.
-   */
-  typedef const char*
-  (*PS_Adobe_Std_StringsFunc)( FT_UInt  string_index );
-
-
-  /*
-   *  Simple unicode -> glyph index charmap built from font glyph names
-   *  table.
-   */
-  typedef struct  PS_UniMap_
-  {
-    FT_UInt32  unicode;      /* bit 31 set: is glyph variant */
-    FT_UInt    glyph_index;
-
-  } PS_UniMap;
-
-
-  typedef struct PS_UnicodesRec_*  PS_Unicodes;
-
-  typedef struct  PS_UnicodesRec_
-  {
-    FT_CMapRec  cmap;
-    FT_UInt     num_maps;
-    PS_UniMap*  maps;
-
-  } PS_UnicodesRec;
-
-
-  /*
-   *  A function which returns a glyph name for a given index.  Returns
-   *  NULL if invalid index.
-   */
-  typedef const char*
-  (*PS_GetGlyphNameFunc)( FT_Pointer  data,
-                          FT_UInt     string_index );
-
-  /*
-   *  A function used to release the glyph name returned by
-   *  PS_GetGlyphNameFunc, when needed
-   */
-  typedef void
-  (*PS_FreeGlyphNameFunc)( FT_Pointer  data,
-                           const char*  name );
-
-  typedef FT_Error
-  (*PS_Unicodes_InitFunc)( FT_Memory             memory,
-                           PS_Unicodes           unicodes,
-                           FT_UInt               num_glyphs,
-                           PS_GetGlyphNameFunc   get_glyph_name,
-                           PS_FreeGlyphNameFunc  free_glyph_name,
-                           FT_Pointer            glyph_data );
-
-  typedef FT_UInt
-  (*PS_Unicodes_CharIndexFunc)( PS_Unicodes  unicodes,
-                                FT_UInt32    unicode );
-
-  typedef FT_UInt32
-  (*PS_Unicodes_CharNextFunc)( PS_Unicodes  unicodes,
-                               FT_UInt32   *unicode );
-
-
-  FT_DEFINE_SERVICE( PsCMaps )
-  {
-    PS_Unicode_ValueFunc       unicode_value;
-
-    PS_Unicodes_InitFunc       unicodes_init;
-    PS_Unicodes_CharIndexFunc  unicodes_char_index;
-    PS_Unicodes_CharNextFunc   unicodes_char_next;
-
-    PS_Macintosh_NameFunc      macintosh_name;
-    PS_Adobe_Std_StringsFunc   adobe_std_strings;
-    const unsigned short*      adobe_std_encoding;
-    const unsigned short*      adobe_expert_encoding;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
-                                      unicode_value_,                       \
-                                      unicodes_init_,                       \
-                                      unicodes_char_index_,                 \
-                                      unicodes_char_next_,                  \
-                                      macintosh_name_,                      \
-                                      adobe_std_strings_,                   \
-                                      adobe_std_encoding_,                  \
-                                      adobe_expert_encoding_ )              \
-  static const FT_Service_PsCMapsRec  class_ =                              \
-  {                                                                         \
-    unicode_value_, unicodes_init_,                                         \
-    unicodes_char_index_, unicodes_char_next_, macintosh_name_,             \
-    adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_         \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_PSCMAPSREC( class_,                               \
-                                      unicode_value_,                       \
-                                      unicodes_init_,                       \
-                                      unicodes_char_index_,                 \
-                                      unicodes_char_next_,                  \
-                                      macintosh_name_,                      \
-                                      adobe_std_strings_,                   \
-                                      adobe_std_encoding_,                  \
-                                      adobe_expert_encoding_ )              \
-  void                                                                      \
-  FT_Init_Class_ ## class_( FT_Library              library,                \
-                            FT_Service_PsCMapsRec*  clazz )                 \
-  {                                                                         \
-    FT_UNUSED( library );                                                   \
-                                                                            \
-    clazz->unicode_value         = unicode_value_;                          \
-    clazz->unicodes_init         = unicodes_init_;                          \
-    clazz->unicodes_char_index   = unicodes_char_index_;                    \
-    clazz->unicodes_char_next    = unicodes_char_next_;                     \
-    clazz->macintosh_name        = macintosh_name_;                         \
-    clazz->adobe_std_strings     = adobe_std_strings_;                      \
-    clazz->adobe_std_encoding    = adobe_std_encoding_;                     \
-    clazz->adobe_expert_encoding = adobe_expert_encoding_;                  \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVPSCMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svpsinfo.h b/third_party/freetype/include/freetype/internal/services/svpsinfo.h
deleted file mode 100644
index 0220ce5..0000000
--- a/third_party/freetype/include/freetype/internal/services/svpsinfo.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svpsinfo.h                                                             */
-/*                                                                         */
-/*    The FreeType PostScript info service (specification).                */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVPSINFO_H_
-#define SVPSINFO_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_POSTSCRIPT_INFO  "postscript-info"
-
-
-  typedef FT_Error
-  (*PS_GetFontInfoFunc)( FT_Face          face,
-                         PS_FontInfoRec*  afont_info );
-
-  typedef FT_Error
-  (*PS_GetFontExtraFunc)( FT_Face           face,
-                          PS_FontExtraRec*  afont_extra );
-
-  typedef FT_Int
-  (*PS_HasGlyphNamesFunc)( FT_Face  face );
-
-  typedef FT_Error
-  (*PS_GetFontPrivateFunc)( FT_Face         face,
-                            PS_PrivateRec*  afont_private );
-
-  typedef FT_Long
-  (*PS_GetFontValueFunc)( FT_Face       face,
-                          PS_Dict_Keys  key,
-                          FT_UInt       idx,
-                          void         *value,
-                          FT_Long       value_len );
-
-
-  FT_DEFINE_SERVICE( PsInfo )
-  {
-    PS_GetFontInfoFunc     ps_get_font_info;
-    PS_GetFontExtraFunc    ps_get_font_extra;
-    PS_HasGlyphNamesFunc   ps_has_glyph_names;
-    PS_GetFontPrivateFunc  ps_get_font_private;
-    PS_GetFontValueFunc    ps_get_font_value;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
-                                     get_font_info_,             \
-                                     ps_get_font_extra_,         \
-                                     has_glyph_names_,           \
-                                     get_font_private_,          \
-                                     get_font_value_ )           \
-  static const FT_Service_PsInfoRec  class_ =                    \
-  {                                                              \
-    get_font_info_, ps_get_font_extra_, has_glyph_names_,        \
-    get_font_private_, get_font_value_                           \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_PSINFOREC( class_,                     \
-                                     get_font_info_,             \
-                                     ps_get_font_extra_,         \
-                                     has_glyph_names_,           \
-                                     get_font_private_,          \
-                                     get_font_value_ )           \
-  void                                                           \
-  FT_Init_Class_ ## class_( FT_Library             library,      \
-                            FT_Service_PsInfoRec*  clazz )       \
-  {                                                              \
-    FT_UNUSED( library );                                        \
-                                                                 \
-    clazz->ps_get_font_info    = get_font_info_;                 \
-    clazz->ps_get_font_extra   = ps_get_font_extra_;             \
-    clazz->ps_has_glyph_names  = has_glyph_names_;               \
-    clazz->ps_get_font_private = get_font_private_;              \
-    clazz->ps_get_font_value   = get_font_value_;                \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVPSINFO_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svsfnt.h b/third_party/freetype/include/freetype/internal/services/svsfnt.h
deleted file mode 100644
index 49d18e4..0000000
--- a/third_party/freetype/include/freetype/internal/services/svsfnt.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svsfnt.h                                                               */
-/*                                                                         */
-/*    The FreeType SFNT table loading service (specification).             */
-/*                                                                         */
-/*  Copyright 2003-2017 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 SVSFNT_H_
-#define SVSFNT_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_TRUETYPE_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   *  SFNT table loading service.
-   */
-
-#define FT_SERVICE_ID_SFNT_TABLE  "sfnt-table"
-
-
-  /*
-   * Used to implement FT_Load_Sfnt_Table().
-   */
-  typedef FT_Error
-  (*FT_SFNT_TableLoadFunc)( FT_Face    face,
-                            FT_ULong   tag,
-                            FT_Long    offset,
-                            FT_Byte*   buffer,
-                            FT_ULong*  length );
-
-  /*
-   * Used to implement FT_Get_Sfnt_Table().
-   */
-  typedef void*
-  (*FT_SFNT_TableGetFunc)( FT_Face      face,
-                           FT_Sfnt_Tag  tag );
-
-
-  /*
-   * Used to implement FT_Sfnt_Table_Info().
-   */
-  typedef FT_Error
-  (*FT_SFNT_TableInfoFunc)( FT_Face    face,
-                            FT_UInt    idx,
-                            FT_ULong  *tag,
-                            FT_ULong  *offset,
-                            FT_ULong  *length );
-
-
-  FT_DEFINE_SERVICE( SFNT_Table )
-  {
-    FT_SFNT_TableLoadFunc  load_table;
-    FT_SFNT_TableGetFunc   get_table;
-    FT_SFNT_TableInfoFunc  table_info;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ )  \
-  static const FT_Service_SFNT_TableRec  class_ =                      \
-  {                                                                    \
-    load_, get_, info_                                                 \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \
-  void                                                                \
-  FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec*  clazz )        \
-  {                                                                   \
-    clazz->load_table = load_;                                        \
-    clazz->get_table  = get_;                                         \
-    clazz->table_info = info_;                                        \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVSFNT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svttcmap.h b/third_party/freetype/include/freetype/internal/services/svttcmap.h
deleted file mode 100644
index 30f7fee..0000000
--- a/third_party/freetype/include/freetype/internal/services/svttcmap.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svttcmap.h                                                             */
-/*                                                                         */
-/*    The FreeType TrueType/sfnt cmap extra information service.           */
-/*                                                                         */
-/*  Copyright 2003-2017 by                                                 */
-/*  Masatake YAMATO, Redhat K.K.,                                          */
-/*  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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/* Development of this service is support of
-   Information-technology Promotion Agency, Japan. */
-
-#ifndef SVTTCMAP_H_
-#define SVTTCMAP_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_TRUETYPE_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_TT_CMAP  "tt-cmaps"
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_CMapInfo                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to store TrueType/sfnt specific cmap information  */
-  /*    which is not covered by the generic @FT_CharMap structure.  This   */
-  /*    structure can be accessed with the @FT_Get_TT_CMap_Info function.  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    language ::                                                        */
-  /*      The language ID used in Mac fonts.  Definitions of values are in */
-  /*      `ttnameid.h'.                                                    */
-  /*                                                                       */
-  /*    format ::                                                          */
-  /*      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), 13~(last resort font), and 14 (Unicode Variation      */
-  /*      Sequences).                                                      */
-  /*                                                                       */
-  typedef struct  TT_CMapInfo_
-  {
-    FT_ULong  language;
-    FT_Long   format;
-
-  } TT_CMapInfo;
-
-
-  typedef FT_Error
-  (*TT_CMap_Info_GetFunc)( FT_CharMap    charmap,
-                           TT_CMapInfo  *cmap_info );
-
-
-  FT_DEFINE_SERVICE( TTCMaps )
-  {
-    TT_CMap_Info_GetFunc  get_cmap_info;
-  };
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
-  static const FT_Service_TTCMapsRec  class_ =                  \
-  {                                                             \
-    get_cmap_info_                                              \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ )  \
-  void                                                          \
-  FT_Init_Class_ ## class_( FT_Library              library,    \
-                            FT_Service_TTCMapsRec*  clazz )     \
-  {                                                             \
-    FT_UNUSED( library );                                       \
-                                                                \
-    clazz->get_cmap_info = get_cmap_info_;                      \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* SVTTCMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svtteng.h b/third_party/freetype/include/freetype/internal/services/svtteng.h
deleted file mode 100644
index e4b368a..0000000
--- a/third_party/freetype/include/freetype/internal/services/svtteng.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svtteng.h                                                              */
-/*                                                                         */
-/*    The FreeType TrueType engine query service (specification).          */
-/*                                                                         */
-/*  Copyright 2006-2017 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 SVTTENG_H_
-#define SVTTENG_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   *  SFNT table loading service.
-   */
-
-#define FT_SERVICE_ID_TRUETYPE_ENGINE  "truetype-engine"
-
-  /*
-   * Used to implement FT_Get_TrueType_Engine_Type
-   */
-
-  FT_DEFINE_SERVICE( TrueTypeEngine )
-  {
-    FT_TrueTypeEngineType  engine_type;
-  };
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* SVTTENG_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svttglyf.h b/third_party/freetype/include/freetype/internal/services/svttglyf.h
deleted file mode 100644
index b779305..0000000
--- a/third_party/freetype/include/freetype/internal/services/svttglyf.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svttglyf.h                                                             */
-/*                                                                         */
-/*    The FreeType TrueType glyph service.                                 */
-/*                                                                         */
-/*  Copyright 2007-2017 by                                                 */
-/*  David Turner.                                                          */
-/*                                                                         */
-/*  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 SVTTGLYF_H_
-#define SVTTGLYF_H_
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_TRUETYPE_TABLES_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_TT_GLYF  "tt-glyf"
-
-
-  typedef FT_ULong
-  (*TT_Glyf_GetLocationFunc)( FT_Face    face,
-                              FT_UInt    gindex,
-                              FT_ULong  *psize );
-
-  FT_DEFINE_SERVICE( TTGlyf )
-  {
-    TT_Glyf_GetLocationFunc  get_location;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
-  static const FT_Service_TTGlyfRec  class_ =                 \
-  {                                                           \
-    get_location_                                             \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ )  \
-  void                                                        \
-  FT_Init_Class_ ## class_( FT_Service_TTGlyfRec*  clazz )    \
-  {                                                           \
-    clazz->get_location = get_location_;                      \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* SVTTGLYF_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/sfnt.h b/third_party/freetype/include/freetype/internal/sfnt.h
deleted file mode 100644
index 348b5a9..0000000
--- a/third_party/freetype/include/freetype/internal/sfnt.h
+++ /dev/null
@@ -1,748 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfnt.h                                                                 */
-/*                                                                         */
-/*    High-level `sfnt' driver interface (specification).                  */
-/*                                                                         */
-/*  Copyright 1996-2017 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 SFNT_H_
-#define SFNT_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Init_Face_Func                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    First part of the SFNT face object initialization.  This finds     */
-  /*    the face in a SFNT file or collection, and load its format tag in  */
-  /*    face->format_tag.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream     :: The input stream.                                    */
-  /*                                                                       */
-  /*    face       :: A handle to the target face object.                  */
-  /*                                                                       */
-  /*    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 :: The number of additional parameters.                 */
-  /*                                                                       */
-  /*    params     :: Optional additional parameters.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The stream cursor must be at the font file's origin.               */
-  /*                                                                       */
-  /*    This function recognizes fonts embedded in a `TrueType             */
-  /*    collection'.                                                       */
-  /*                                                                       */
-  /*    Once the format tag has been validated by the font driver, it      */
-  /*    should then call the TT_Load_Face_Func() callback to read the rest */
-  /*    of the SFNT tables in the object.                                  */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Init_Face_Func)( FT_Stream      stream,
-                        TT_Face        face,
-                        FT_Int         face_index,
-                        FT_Int         num_params,
-                        FT_Parameter*  params );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_Face_Func                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Second part of the SFNT face object initialization.  This loads    */
-  /*    the common SFNT tables (head, OS/2, maxp, metrics, etc.) in the    */
-  /*    face object.                                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream     :: The input stream.                                    */
-  /*                                                                       */
-  /*    face       :: A handle to the target face object.                  */
-  /*                                                                       */
-  /*    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 :: The number of additional parameters.                 */
-  /*                                                                       */
-  /*    params     :: Optional additional parameters.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function must be called after TT_Init_Face_Func().            */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_Face_Func)( FT_Stream      stream,
-                        TT_Face        face,
-                        FT_Int         face_index,
-                        FT_Int         num_params,
-                        FT_Parameter*  params );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Done_Face_Func                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A callback used to delete the common SFNT data from a face.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the target face object.                        */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function does NOT destroy the face object.                    */
-  /*                                                                       */
-  typedef void
-  (*TT_Done_Face_Func)( TT_Face  face );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_Any_Func                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load any font table into client memory.                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: The face object to look for.                             */
-  /*                                                                       */
-  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
-  /*              to access the whole font file, else set this parameter   */
-  /*              to a valid TrueType table tag that you can forge with    */
-  /*              the MAKE_TT_TAG macro.                                   */
-  /*                                                                       */
-  /*    offset :: The starting offset in the table (or the file if         */
-  /*              tag == 0).                                               */
-  /*                                                                       */
-  /*    length :: The address of the decision variable:                    */
-  /*                                                                       */
-  /*                If length == NULL:                                     */
-  /*                  Loads the whole table.  Returns an error if          */
-  /*                  `offset' == 0!                                       */
-  /*                                                                       */
-  /*                If *length == 0:                                       */
-  /*                  Exits immediately; returning the length of the given */
-  /*                  table or of the font file, depending on the value of */
-  /*                  `tag'.                                               */
-  /*                                                                       */
-  /*                If *length != 0:                                       */
-  /*                  Loads the next `length' bytes of table or font,      */
-  /*                  starting at offset `offset' (in table or font too).  */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    buffer :: The address of target buffer.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_Any_Func)( TT_Face    face,
-                       FT_ULong   tag,
-                       FT_Long    offset,
-                       FT_Byte   *buffer,
-                       FT_ULong*  length );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Find_SBit_Image_Func                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Check whether an embedded bitmap (an `sbit') exists for a given    */
-  /*    glyph, at a given strike.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face          :: The target face object.                           */
-  /*                                                                       */
-  /*    glyph_index   :: The glyph index.                                  */
-  /*                                                                       */
-  /*    strike_index  :: The current strike index.                         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    arange        :: The SBit range containing the glyph index.        */
-  /*                                                                       */
-  /*    astrike       :: The SBit strike containing the glyph index.       */
-  /*                                                                       */
-  /*    aglyph_offset :: The offset of the glyph data in `EBDT' table.     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.  Returns                    */
-  /*    SFNT_Err_Invalid_Argument if no sbit exists for the requested      */
-  /*    glyph.                                                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Find_SBit_Image_Func)( TT_Face          face,
-                              FT_UInt          glyph_index,
-                              FT_ULong         strike_index,
-                              TT_SBit_Range   *arange,
-                              TT_SBit_Strike  *astrike,
-                              FT_ULong        *aglyph_offset );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_SBit_Metrics_Func                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Get the big metrics for a given embedded bitmap.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream      :: The input stream.                                   */
-  /*                                                                       */
-  /*    range       :: The SBit range containing the glyph.                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    big_metrics :: A big SBit metrics structure for the glyph.         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The stream cursor must be positioned at the glyph's offset within  */
-  /*    the `EBDT' table before the call.                                  */
-  /*                                                                       */
-  /*    If the image format uses variable metrics, the stream cursor is    */
-  /*    positioned just after the metrics header in the `EBDT' table on    */
-  /*    function exit.                                                     */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_SBit_Metrics_Func)( FT_Stream        stream,
-                                TT_SBit_Range    range,
-                                TT_SBit_Metrics  metrics );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_SBit_Image_Func                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load a given glyph sbit image from the font resource.  This also   */
-  /*    returns its metrics.                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face ::                                                            */
-  /*      The target face object.                                          */
-  /*                                                                       */
-  /*    strike_index ::                                                    */
-  /*      The strike index.                                                */
-  /*                                                                       */
-  /*    glyph_index ::                                                     */
-  /*      The current glyph index.                                         */
-  /*                                                                       */
-  /*    load_flags ::                                                      */
-  /*      The current load flags.                                          */
-  /*                                                                       */
-  /*    stream ::                                                          */
-  /*      The input stream.                                                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    amap ::                                                            */
-  /*      The target pixmap.                                               */
-  /*                                                                       */
-  /*    ametrics ::                                                        */
-  /*      A big sbit metrics structure for the glyph image.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.  Returns an error if no     */
-  /*    glyph sbit exists for the index.                                   */
-  /*                                                                       */
-  /*  <Note>                                                               */
-  /*    The `map.buffer' field is always freed before the glyph is loaded. */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_SBit_Image_Func)( TT_Face              face,
-                              FT_ULong             strike_index,
-                              FT_UInt              glyph_index,
-                              FT_UInt              load_flags,
-                              FT_Stream            stream,
-                              FT_Bitmap           *amap,
-                              TT_SBit_MetricsRec  *ametrics );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Set_SBit_Strike_Func                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Select an sbit strike for a given size request.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face          :: The target face object.                           */
-  /*                                                                       */
-  /*    req           :: The size request.                                 */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    astrike_index :: The index of the sbit strike.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.  Returns an error if no     */
-  /*    sbit strike exists for the selected ppem values.                   */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Set_SBit_Strike_Func)( TT_Face          face,
-                              FT_Size_Request  req,
-                              FT_ULong*        astrike_index );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_Strike_Metrics_Func                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the metrics of a given strike.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face          :: The target face object.                           */
-  /*                                                                       */
-  /*    strike_index  :: The strike index.                                 */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    metrics       :: the metrics of the strike.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.  Returns an error if no     */
-  /*    such sbit strike exists.                                           */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_Strike_Metrics_Func)( TT_Face           face,
-                                  FT_ULong          strike_index,
-                                  FT_Size_Metrics*  metrics );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Get_PS_Name_Func                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Get the PostScript glyph name of a glyph.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    idx  :: The glyph index.                                           */
-  /*                                                                       */
-  /*    PSname :: The address of a string pointer.  Will be NULL in case   */
-  /*              of error, otherwise it is a pointer to the glyph name.   */
-  /*                                                                       */
-  /*              You must not modify the returned string!                 */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Get_PS_Name_Func)( TT_Face      face,
-                          FT_UInt      idx,
-                          FT_String**  PSname );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Load_Metrics_Func                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load a metrics table, which is a table with a horizontal and a     */
-  /*    vertical version.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A handle to the target face object.                    */
-  /*                                                                       */
-  /*    stream   :: The input stream.                                      */
-  /*                                                                       */
-  /*    vertical :: A boolean flag.  If set, load the vertical one.        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_Metrics_Func)( TT_Face    face,
-                           FT_Stream  stream,
-                           FT_Bool    vertical );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Get_Metrics_Func                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the horizontal or vertical header in a face object.           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A handle to the target face object.                    */
-  /*                                                                       */
-  /*    vertical :: A boolean flag.  If set, load vertical metrics.        */
-  /*                                                                       */
-  /*    gindex   :: The glyph index.                                       */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    abearing :: The horizontal (or vertical) bearing.  Set to zero in  */
-  /*                case of error.                                         */
-  /*                                                                       */
-  /*    aadvance :: The horizontal (or vertical) advance.  Set to zero in  */
-  /*                case of error.                                         */
-  /*                                                                       */
-  typedef void
-  (*TT_Get_Metrics_Func)( TT_Face     face,
-                          FT_Bool     vertical,
-                          FT_UInt     gindex,
-                          FT_Short*   abearing,
-                          FT_UShort*  aadvance );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <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_Load_Table_Func                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load a given TrueType table.                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The function uses `face->goto_table' to seek the stream to the     */
-  /*    start of the table, except while loading the font directory.       */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Load_Table_Func)( TT_Face    face,
-                         FT_Stream  stream );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Free_Table_Func                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Free a given TrueType table.                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the target face object.                        */
-  /*                                                                       */
-  typedef void
-  (*TT_Free_Table_Func)( TT_Face  face );
-
-
-  /*
-   * @functype:
-   *    TT_Face_GetKerningFunc
-   *
-   * @description:
-   *    Return the horizontal kerning value between two glyphs.
-   *
-   * @input:
-   *    face        :: A handle to the source face object.
-   *    left_glyph  :: The left glyph index.
-   *    right_glyph :: The right glyph index.
-   *
-   * @return:
-   *    The kerning value in font units.
-   */
-  typedef FT_Int
-  (*TT_Face_GetKerningFunc)( TT_Face  face,
-                             FT_UInt  left_glyph,
-                             FT_UInt  right_glyph );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    SFNT_Interface                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure holds pointers to the functions used to load and    */
-  /*    free the basic tables that are required in a `sfnt' font file.     */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Check the various xxx_Func() descriptions for details.             */
-  /*                                                                       */
-  typedef struct  SFNT_Interface_
-  {
-    TT_Loader_GotoTableFunc      goto_table;
-
-    TT_Init_Face_Func            init_face;
-    TT_Load_Face_Func            load_face;
-    TT_Done_Face_Func            done_face;
-    FT_Module_Requester          get_interface;
-
-    TT_Load_Any_Func             load_any;
-
-    /* these functions are called by `load_face' but they can also  */
-    /* be called from external modules, if there is a need to do so */
-    TT_Load_Table_Func           load_head;
-    TT_Load_Metrics_Func         load_hhea;
-    TT_Load_Table_Func           load_cmap;
-    TT_Load_Table_Func           load_maxp;
-    TT_Load_Table_Func           load_os2;
-    TT_Load_Table_Func           load_post;
-
-    TT_Load_Table_Func           load_name;
-    TT_Free_Table_Func           free_name;
-
-    /* this field was called `load_kerning' up to version 2.1.10 */
-    TT_Load_Table_Func           load_kern;
-
-    TT_Load_Table_Func           load_gasp;
-    TT_Load_Table_Func           load_pclt;
-
-    /* see `ttload.h'; this field was called `load_bitmap_header' up to */
-    /* version 2.1.10                                                   */
-    TT_Load_Table_Func           load_bhed;
-
-    TT_Load_SBit_Image_Func      load_sbit_image;
-
-    /* see `ttpost.h' */
-    TT_Get_PS_Name_Func          get_psname;
-    TT_Free_Table_Func           free_psnames;
-
-    /* starting here, the structure differs from version 2.1.7 */
-
-    /* this field was introduced in version 2.1.8, named `get_psname' */
-    TT_Face_GetKerningFunc       get_kerning;
-
-    /* new elements introduced after version 2.1.10 */
-
-    /* load the font directory, i.e., the offset table and */
-    /* the table directory                                 */
-    TT_Load_Table_Func           load_font_dir;
-    TT_Load_Metrics_Func         load_hmtx;
-
-    TT_Load_Table_Func           load_eblc;
-    TT_Free_Table_Func           free_eblc;
-
-    TT_Set_SBit_Strike_Func      set_sbit_strike;
-    TT_Load_Strike_Metrics_Func  load_strike_metrics;
-
-    TT_Get_Metrics_Func          get_metrics;
-
-    TT_Get_Name_Func             get_name;
-
-  } SFNT_Interface;
-
-
-  /* transitional */
-  typedef SFNT_Interface*   SFNT_Service;
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SFNT_INTERFACE(        \
-          class_,                        \
-          goto_table_,                   \
-          init_face_,                    \
-          load_face_,                    \
-          done_face_,                    \
-          get_interface_,                \
-          load_any_,                     \
-          load_head_,                    \
-          load_hhea_,                    \
-          load_cmap_,                    \
-          load_maxp_,                    \
-          load_os2_,                     \
-          load_post_,                    \
-          load_name_,                    \
-          free_name_,                    \
-          load_kern_,                    \
-          load_gasp_,                    \
-          load_pclt_,                    \
-          load_bhed_,                    \
-          load_sbit_image_,              \
-          get_psname_,                   \
-          free_psnames_,                 \
-          get_kerning_,                  \
-          load_font_dir_,                \
-          load_hmtx_,                    \
-          load_eblc_,                    \
-          free_eblc_,                    \
-          set_sbit_strike_,              \
-          load_strike_metrics_,          \
-          get_metrics_,                  \
-          get_name_ )                    \
-  static const SFNT_Interface  class_ =  \
-  {                                      \
-    goto_table_,                         \
-    init_face_,                          \
-    load_face_,                          \
-    done_face_,                          \
-    get_interface_,                      \
-    load_any_,                           \
-    load_head_,                          \
-    load_hhea_,                          \
-    load_cmap_,                          \
-    load_maxp_,                          \
-    load_os2_,                           \
-    load_post_,                          \
-    load_name_,                          \
-    free_name_,                          \
-    load_kern_,                          \
-    load_gasp_,                          \
-    load_pclt_,                          \
-    load_bhed_,                          \
-    load_sbit_image_,                    \
-    get_psname_,                         \
-    free_psnames_,                       \
-    get_kerning_,                        \
-    load_font_dir_,                      \
-    load_hmtx_,                          \
-    load_eblc_,                          \
-    free_eblc_,                          \
-    set_sbit_strike_,                    \
-    load_strike_metrics_,                \
-    get_metrics_,                        \
-    get_name_,                           \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_INTERNAL( a, a_ )  \
-          clazz->a = a_;
-
-#define FT_DEFINE_SFNT_INTERFACE(                       \
-          class_,                                       \
-          goto_table_,                                  \
-          init_face_,                                   \
-          load_face_,                                   \
-          done_face_,                                   \
-          get_interface_,                               \
-          load_any_,                                    \
-          load_head_,                                   \
-          load_hhea_,                                   \
-          load_cmap_,                                   \
-          load_maxp_,                                   \
-          load_os2_,                                    \
-          load_post_,                                   \
-          load_name_,                                   \
-          free_name_,                                   \
-          load_kern_,                                   \
-          load_gasp_,                                   \
-          load_pclt_,                                   \
-          load_bhed_,                                   \
-          load_sbit_image_,                             \
-          get_psname_,                                  \
-          free_psnames_,                                \
-          get_kerning_,                                 \
-          load_font_dir_,                               \
-          load_hmtx_,                                   \
-          load_eblc_,                                   \
-          free_eblc_,                                   \
-          set_sbit_strike_,                             \
-          load_strike_metrics_,                         \
-          get_metrics_,                                 \
-          get_name_ )                                   \
-  void                                                  \
-  FT_Init_Class_ ## class_( FT_Library       library,   \
-                            SFNT_Interface*  clazz )    \
-  {                                                     \
-    FT_UNUSED( library );                               \
-                                                        \
-    clazz->goto_table          = goto_table_;           \
-    clazz->init_face           = init_face_;            \
-    clazz->load_face           = load_face_;            \
-    clazz->done_face           = done_face_;            \
-    clazz->get_interface       = get_interface_;        \
-    clazz->load_any            = load_any_;             \
-    clazz->load_head           = load_head_;            \
-    clazz->load_hhea           = load_hhea_;            \
-    clazz->load_cmap           = load_cmap_;            \
-    clazz->load_maxp           = load_maxp_;            \
-    clazz->load_os2            = load_os2_;             \
-    clazz->load_post           = load_post_;            \
-    clazz->load_name           = load_name_;            \
-    clazz->free_name           = free_name_;            \
-    clazz->load_kern           = load_kern_;            \
-    clazz->load_gasp           = load_gasp_;            \
-    clazz->load_pclt           = load_pclt_;            \
-    clazz->load_bhed           = load_bhed_;            \
-    clazz->load_sbit_image     = load_sbit_image_;      \
-    clazz->get_psname          = get_psname_;           \
-    clazz->free_psnames        = free_psnames_;         \
-    clazz->get_kerning         = get_kerning_;          \
-    clazz->load_font_dir       = load_font_dir_;        \
-    clazz->load_hmtx           = load_hmtx_;            \
-    clazz->load_eblc           = load_eblc_;            \
-    clazz->free_eblc           = free_eblc_;            \
-    clazz->set_sbit_strike     = set_sbit_strike_;      \
-    clazz->load_strike_metrics = load_strike_metrics_;  \
-    clazz->get_metrics         = get_metrics_;          \
-    clazz->get_name            = get_name_;             \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-FT_END_HEADER
-
-#endif /* SFNT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/t1types.h b/third_party/freetype/include/freetype/internal/t1types.h
deleted file mode 100644
index b2e35d4..0000000
--- a/third_party/freetype/include/freetype/internal/t1types.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1types.h                                                              */
-/*                                                                         */
-/*    Basic Type1/Type2 type definitions and interface (specification      */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 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
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***              REQUIRED TYPE1/TYPE2 TABLES DEFINITIONS              ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    T1_EncodingRec                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure modeling a custom encoding.                            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_chars  :: The number of character codes in the encoding.       */
-  /*                  Usually 256.                                         */
-  /*                                                                       */
-  /*    code_first :: The lowest valid character code in the encoding.     */
-  /*                                                                       */
-  /*    code_last  :: The highest valid character code in the encoding     */
-  /*                  + 1. When equal to code_first there are no valid     */
-  /*                  character codes.                                     */
-  /*                                                                       */
-  /*    char_index :: An array of corresponding glyph indices.             */
-  /*                                                                       */
-  /*    char_name  :: An array of corresponding glyph names.               */
-  /*                                                                       */
-  typedef struct  T1_EncodingRecRec_
-  {
-    FT_Int       num_chars;
-    FT_Int       code_first;
-    FT_Int       code_last;
-
-    FT_UShort*   char_index;
-    FT_String**  char_name;
-
-  } T1_EncodingRec, *T1_Encoding;
-
-
-  /* used to hold extra data of PS_FontInfoRec that
-   * cannot be stored in the publicly defined structure.
-   *
-   * Note these can't be blended with multiple-masters.
-   */
-  typedef struct  PS_FontExtraRec_
-  {
-    FT_UShort  fs_type;
-
-  } PS_FontExtraRec;
-
-
-  typedef struct  T1_FontRec_
-  {
-    PS_FontInfoRec   font_info;         /* font info dictionary   */
-    PS_FontExtraRec  font_extra;        /* font info extra fields */
-    PS_PrivateRec    private_dict;      /* private dictionary     */
-    FT_String*       font_name;         /* top-level dictionary   */
-
-    T1_EncodingType  encoding_type;
-    T1_EncodingRec   encoding;
-
-    FT_Byte*         subrs_block;
-    FT_Byte*         charstrings_block;
-    FT_Byte*         glyph_names_block;
-
-    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       */
-    FT_Byte**        charstrings;       /* array of glyph charstrings */
-    FT_UInt*         charstrings_len;
-
-    FT_Byte          paint_type;
-    FT_Byte          font_type;
-    FT_Matrix        font_matrix;
-    FT_Vector        font_offset;
-    FT_BBox          font_bbox;
-    FT_Long          font_id;
-
-    FT_Fixed         stroke_width;
-
-  } T1_FontRec, *T1_Font;
-
-
-  typedef struct  CID_SubrsRec_
-  {
-    FT_Int     num_subrs;
-    FT_Byte**  code;
-
-  } CID_SubrsRec, *CID_Subrs;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                AFM FONT INFORMATION STRUCTURES                    ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct  AFM_TrackKernRec_
-  {
-    FT_Int    degree;
-    FT_Fixed  min_ptsize;
-    FT_Fixed  min_kern;
-    FT_Fixed  max_ptsize;
-    FT_Fixed  max_kern;
-
-  } AFM_TrackKernRec, *AFM_TrackKern;
-
-  typedef struct  AFM_KernPairRec_
-  {
-    FT_UInt  index1;
-    FT_UInt  index2;
-    FT_Int   x;
-    FT_Int   y;
-
-  } AFM_KernPairRec, *AFM_KernPair;
-
-  typedef struct  AFM_FontInfoRec_
-  {
-    FT_Bool        IsCIDFont;
-    FT_BBox        FontBBox;
-    FT_Fixed       Ascender;
-    FT_Fixed       Descender;
-    AFM_TrackKern  TrackKerns;   /* free if non-NULL */
-    FT_UInt        NumTrackKern;
-    AFM_KernPair   KernPairs;    /* free if non-NULL */
-    FT_UInt        NumKernPair;
-
-  } AFM_FontInfoRec, *AFM_FontInfo;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                ORIGINAL T1_FACE CLASS DEFINITION                  ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  typedef struct T1_FaceRec_*   T1_Face;
-  typedef struct CID_FaceRec_*  CID_Face;
-
-
-  typedef struct  T1_FaceRec_
-  {
-    FT_FaceRec      root;
-    T1_FontRec      type1;
-    const void*     psnames;
-    const void*     psaux;
-    const void*     afm_data;
-    FT_CharMapRec   charmaprecs[2];
-    FT_CharMap      charmaps[2];
-
-    /* support for Multiple Masters fonts */
-    PS_Blend        blend;
-
-    /* undocumented, optional: indices of subroutines that express      */
-    /* the NormalizeDesignVector and the ConvertDesignVector procedure, */
-    /* respectively, as Type 2 charstrings; -1 if keywords not present  */
-    FT_Int           ndv_idx;
-    FT_Int           cdv_idx;
-
-    /* undocumented, optional: has the same meaning as len_buildchar */
-    /* for Type 2 fonts; manipulated by othersubrs 19, 24, and 25    */
-    FT_UInt          len_buildchar;
-    FT_Long*         buildchar;
-
-    /* since version 2.1 - interface to PostScript hinter */
-    const void*     pshinter;
-
-  } T1_FaceRec;
-
-
-  typedef struct  CID_FaceRec_
-  {
-    FT_FaceRec       root;
-    void*            psnames;
-    void*            psaux;
-    CID_FaceInfoRec  cid;
-    PS_FontExtraRec  font_extra;
-#if 0
-    void*            afm_data;
-#endif
-    CID_Subrs        subrs;
-
-    /* since version 2.1 - interface to PostScript hinter */
-    void*            pshinter;
-
-    /* since version 2.1.8, but was originally positioned after `afm_data' */
-    FT_Byte*         binary_data; /* used if hex data has been converted */
-    FT_Stream        cid_stream;
-
-  } CID_FaceRec;
-
-
-FT_END_HEADER
-
-#endif /* T1TYPES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/tttypes.h b/third_party/freetype/include/freetype/internal/tttypes.h
deleted file mode 100644
index 6af7303..0000000
--- a/third_party/freetype/include/freetype/internal/tttypes.h
+++ /dev/null
@@ -1,1640 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  tttypes.h                                                              */
-/*                                                                         */
-/*    Basic SFNT/TrueType type definitions and interface (specification    */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTTYPES_H_
-#define TTTYPES_H_
-
-
-#include <ft2build.h>
-#include FT_TRUETYPE_TABLES_H
-#include FT_INTERNAL_OBJECTS_H
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include FT_MULTIPLE_MASTERS_H
-#endif
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***             REQUIRED TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TTC_HeaderRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    TrueType collection header.  This table contains the offsets of    */
-  /*    the font headers of each distinct TrueType face in the file.       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    tag     :: Must be `ttc ' to indicate a TrueType collection.       */
-  /*                                                                       */
-  /*    version :: The version number.                                     */
-  /*                                                                       */
-  /*    count   :: The number of faces in the collection.  The             */
-  /*               specification says this should be an unsigned long, but */
-  /*               we use a signed long since we need the value -1 for     */
-  /*               specific purposes.                                      */
-  /*                                                                       */
-  /*    offsets :: The offsets of the font headers, one per face.          */
-  /*                                                                       */
-  typedef struct  TTC_HeaderRec_
-  {
-    FT_ULong   tag;
-    FT_Fixed   version;
-    FT_Long    count;
-    FT_ULong*  offsets;
-
-  } TTC_HeaderRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    SFNT_HeaderRec                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    SFNT file format header.                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    format_tag     :: The font format tag.                             */
-  /*                                                                       */
-  /*    num_tables     :: The number of tables in file.                    */
-  /*                                                                       */
-  /*    search_range   :: Must be `16 * (max power of 2 <= num_tables)'.   */
-  /*                                                                       */
-  /*    entry_selector :: Must be log2 of `search_range / 16'.             */
-  /*                                                                       */
-  /*    range_shift    :: Must be `num_tables * 16 - search_range'.        */
-  /*                                                                       */
-  typedef struct  SFNT_HeaderRec_
-  {
-    FT_ULong   format_tag;
-    FT_UShort  num_tables;
-    FT_UShort  search_range;
-    FT_UShort  entry_selector;
-    FT_UShort  range_shift;
-
-    FT_ULong   offset;  /* not in file */
-
-  } SFNT_HeaderRec, *SFNT_Header;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_TableRec                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure describes a given table of a TrueType font.         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Tag      :: A four-bytes tag describing the table.                 */
-  /*                                                                       */
-  /*    CheckSum :: The table checksum.  This value can be ignored.        */
-  /*                                                                       */
-  /*    Offset   :: The offset of the table from the start of the TrueType */
-  /*                font in its resource.                                  */
-  /*                                                                       */
-  /*    Length   :: The table length (in bytes).                           */
-  /*                                                                       */
-  typedef struct  TT_TableRec_
-  {
-    FT_ULong  Tag;        /*        table type */
-    FT_ULong  CheckSum;   /*    table checksum */
-    FT_ULong  Offset;     /* table file offset */
-    FT_ULong  Length;     /*      table length */
-
-  } TT_TableRec, *TT_Table;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    WOFF_HeaderRec                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    WOFF file format header.                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    See                                                                */
-  /*                                                                       */
-  /*      http://www.w3.org/TR/WOFF/#WOFFHeader                            */
-  /*                                                                       */
-  typedef struct  WOFF_HeaderRec_
-  {
-    FT_ULong   signature;
-    FT_ULong   flavor;
-    FT_ULong   length;
-    FT_UShort  num_tables;
-    FT_UShort  reserved;
-    FT_ULong   totalSfntSize;
-    FT_UShort  majorVersion;
-    FT_UShort  minorVersion;
-    FT_ULong   metaOffset;
-    FT_ULong   metaLength;
-    FT_ULong   metaOrigLength;
-    FT_ULong   privOffset;
-    FT_ULong   privLength;
-
-  } WOFF_HeaderRec, *WOFF_Header;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    WOFF_TableRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This structure describes a given table of a WOFF font.             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Tag        :: A four-bytes tag describing the table.               */
-  /*                                                                       */
-  /*    Offset     :: The offset of the table from the start of the WOFF   */
-  /*                  font in its resource.                                */
-  /*                                                                       */
-  /*    CompLength :: Compressed table length (in bytes).                  */
-  /*                                                                       */
-  /*    OrigLength :: Uncompressed table length (in bytes).                */
-  /*                                                                       */
-  /*    CheckSum   :: The table checksum.  This value can be ignored.      */
-  /*                                                                       */
-  /*    OrigOffset :: The uncompressed table file offset.  This value gets */
-  /*                  computed while constructing the (uncompressed) SFNT  */
-  /*                  header.  It is not contained in the WOFF file.       */
-  /*                                                                       */
-  typedef struct  WOFF_TableRec_
-  {
-    FT_ULong  Tag;           /* table ID                  */
-    FT_ULong  Offset;        /* table file offset         */
-    FT_ULong  CompLength;    /* compressed table length   */
-    FT_ULong  OrigLength;    /* uncompressed table length */
-    FT_ULong  CheckSum;      /* uncompressed checksum     */
-
-    FT_ULong  OrigOffset;    /* uncompressed table file offset */
-                             /* (not in the WOFF file)         */
-  } WOFF_TableRec, *WOFF_Table;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_LongMetricsRec                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure modeling the long metrics of the `hmtx' and `vmtx'     */
-  /*    TrueType tables.  The values are expressed in font units.          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    advance :: The advance width or height for the glyph.              */
-  /*                                                                       */
-  /*    bearing :: The left-side or top-side bearing for the glyph.        */
-  /*                                                                       */
-  typedef struct  TT_LongMetricsRec_
-  {
-    FT_UShort  advance;
-    FT_Short   bearing;
-
-  } TT_LongMetricsRec, *TT_LongMetrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    TT_ShortMetrics                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple type to model the short metrics of the `hmtx' and `vmtx'  */
-  /*    tables.                                                            */
-  /*                                                                       */
-  typedef FT_Short  TT_ShortMetrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_NameEntryRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure modeling TrueType name records.  Name records are used */
-  /*    to store important strings like family name, style name,           */
-  /*    copyright, etc. in _localized_ versions (i.e., language, encoding, */
-  /*    etc).                                                              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    platformID   :: The ID of the name's encoding platform.            */
-  /*                                                                       */
-  /*    encodingID   :: The platform-specific ID for the name's encoding.  */
-  /*                                                                       */
-  /*    languageID   :: The platform-specific ID for the name's language.  */
-  /*                                                                       */
-  /*    nameID       :: The ID specifying what kind of name this is.       */
-  /*                                                                       */
-  /*    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 usually UTF-16 encoded characters.             */
-  /*                                                                       */
-  typedef struct  TT_NameEntryRec_
-  {
-    FT_UShort  platformID;
-    FT_UShort  encodingID;
-    FT_UShort  languageID;
-    FT_UShort  nameID;
-    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_NameEntryRec, *TT_NameEntry;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_NameTableRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure modeling the TrueType name table.                      */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    format         :: The format of the name table.                    */
-  /*                                                                       */
-  /*    numNameRecords :: The number of names in table.                    */
-  /*                                                                       */
-  /*    storageOffset  :: The offset of the name table in the `name'       */
-  /*                      TrueType table.                                  */
-  /*                                                                       */
-  /*    names          :: An array of name 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;
-
-  } TT_NameTableRec, *TT_NameTable;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***             OPTIONAL TRUETYPE/OPENTYPE TABLES DEFINITIONS         ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_GaspRangeRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A tiny structure used to model a gasp range according to the       */
-  /*    TrueType specification.                                            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    maxPPEM  :: The maximum ppem value to which `gaspFlag' applies.    */
-  /*                                                                       */
-  /*    gaspFlag :: A flag describing the grid-fitting and anti-aliasing   */
-  /*                modes to be used.                                      */
-  /*                                                                       */
-  typedef struct  TT_GaspRangeRec_
-  {
-    FT_UShort  maxPPEM;
-    FT_UShort  gaspFlag;
-
-  } TT_GaspRangeRec, *TT_GaspRange;
-
-
-#define TT_GASP_GRIDFIT  0x01
-#define TT_GASP_DOGRAY   0x02
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_GaspRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure modeling the TrueType `gasp' table used to specify     */
-  /*    grid-fitting and anti-aliasing behaviour.                          */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    version    :: The version number.                                  */
-  /*                                                                       */
-  /*    numRanges  :: The number of gasp ranges in table.                  */
-  /*                                                                       */
-  /*    gaspRanges :: An array of gasp ranges.                             */
-  /*                                                                       */
-  typedef struct  TT_Gasp_
-  {
-    FT_UShort     version;
-    FT_UShort     numRanges;
-    TT_GaspRange  gaspRanges;
-
-  } TT_GaspRec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                    EMBEDDED BITMAPS SUPPORT                       ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_MetricsRec                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to hold the big metrics of a given glyph bitmap   */
-  /*    in a TrueType or OpenType font.  These are usually found in the    */
-  /*    `EBDT' (Microsoft) or `bloc' (Apple) table.                        */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    height       :: The glyph height in pixels.                        */
-  /*                                                                       */
-  /*    width        :: The glyph width in pixels.                         */
-  /*                                                                       */
-  /*    horiBearingX :: The horizontal left bearing.                       */
-  /*                                                                       */
-  /*    horiBearingY :: The horizontal top bearing.                        */
-  /*                                                                       */
-  /*    horiAdvance  :: The horizontal advance.                            */
-  /*                                                                       */
-  /*    vertBearingX :: The vertical left bearing.                         */
-  /*                                                                       */
-  /*    vertBearingY :: The vertical top bearing.                          */
-  /*                                                                       */
-  /*    vertAdvance  :: The vertical advance.                              */
-  /*                                                                       */
-  typedef struct  TT_SBit_MetricsRec_
-  {
-    FT_UShort  height;
-    FT_UShort  width;
-
-    FT_Short   horiBearingX;
-    FT_Short   horiBearingY;
-    FT_UShort  horiAdvance;
-
-    FT_Short   vertBearingX;
-    FT_Short   vertBearingY;
-    FT_UShort  vertAdvance;
-
-  } TT_SBit_MetricsRec, *TT_SBit_Metrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_SmallMetricsRec                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to hold the small metrics of a given glyph bitmap */
-  /*    in a TrueType or OpenType font.  These are usually found in the    */
-  /*    `EBDT' (Microsoft) or the `bdat' (Apple) table.                    */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    height   :: The glyph height in pixels.                            */
-  /*                                                                       */
-  /*    width    :: The glyph width in pixels.                             */
-  /*                                                                       */
-  /*    bearingX :: The left-side bearing.                                 */
-  /*                                                                       */
-  /*    bearingY :: The top-side bearing.                                  */
-  /*                                                                       */
-  /*    advance  :: The advance width or height.                           */
-  /*                                                                       */
-  typedef struct  TT_SBit_Small_Metrics_
-  {
-    FT_Byte  height;
-    FT_Byte  width;
-
-    FT_Char  bearingX;
-    FT_Char  bearingY;
-    FT_Byte  advance;
-
-  } TT_SBit_SmallMetricsRec, *TT_SBit_SmallMetrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_LineMetricsRec                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to describe the text line metrics of a given      */
-  /*    bitmap strike, for either a horizontal or vertical layout.         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    ascender                :: The ascender in pixels.                 */
-  /*                                                                       */
-  /*    descender               :: The descender in pixels.                */
-  /*                                                                       */
-  /*    max_width               :: The maximum glyph width in pixels.      */
-  /*                                                                       */
-  /*    caret_slope_enumerator  :: Rise of the caret slope, typically set  */
-  /*                               to 1 for non-italic fonts.              */
-  /*                                                                       */
-  /*    caret_slope_denominator :: Rise of the caret slope, typically set  */
-  /*                               to 0 for non-italic fonts.              */
-  /*                                                                       */
-  /*    caret_offset            :: Offset in pixels to move the caret for  */
-  /*                               proper positioning.                     */
-  /*                                                                       */
-  /*    min_origin_SB           :: Minimum of horiBearingX (resp.          */
-  /*                               vertBearingY).                          */
-  /*    min_advance_SB          :: Minimum of                              */
-  /*                                                                       */
-  /*                                 horizontal advance -                  */
-  /*                                   ( horiBearingX + width )            */
-  /*                                                                       */
-  /*                               resp.                                   */
-  /*                                                                       */
-  /*                                 vertical advance -                    */
-  /*                                   ( vertBearingY + height )           */
-  /*                                                                       */
-  /*    max_before_BL           :: Maximum of horiBearingY (resp.          */
-  /*                               vertBearingY).                          */
-  /*                                                                       */
-  /*    min_after_BL            :: Minimum of                              */
-  /*                                                                       */
-  /*                                 horiBearingY - height                 */
-  /*                                                                       */
-  /*                               resp.                                   */
-  /*                                                                       */
-  /*                                 vertBearingX - width                  */
-  /*                                                                       */
-  /*    pads                    :: Unused (to make the size of the record  */
-  /*                               a multiple of 32 bits.                  */
-  /*                                                                       */
-  typedef struct  TT_SBit_LineMetricsRec_
-  {
-    FT_Char  ascender;
-    FT_Char  descender;
-    FT_Byte  max_width;
-    FT_Char  caret_slope_numerator;
-    FT_Char  caret_slope_denominator;
-    FT_Char  caret_offset;
-    FT_Char  min_origin_SB;
-    FT_Char  min_advance_SB;
-    FT_Char  max_before_BL;
-    FT_Char  min_after_BL;
-    FT_Char  pads[2];
-
-  } TT_SBit_LineMetricsRec, *TT_SBit_LineMetrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_RangeRec                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A TrueType/OpenType subIndexTable as defined in the `EBLC'         */
-  /*    (Microsoft) or `bloc' (Apple) tables.                              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    first_glyph   :: The first glyph index in the range.               */
-  /*                                                                       */
-  /*    last_glyph    :: The last glyph index in the range.                */
-  /*                                                                       */
-  /*    index_format  :: The format of index table.  Valid values are 1    */
-  /*                     to 5.                                             */
-  /*                                                                       */
-  /*    image_format  :: The format of `EBDT' image data.                  */
-  /*                                                                       */
-  /*    image_offset  :: The offset to image data in `EBDT'.               */
-  /*                                                                       */
-  /*    image_size    :: For index formats 2 and 5.  This is the size in   */
-  /*                     bytes of each glyph bitmap.                       */
-  /*                                                                       */
-  /*    big_metrics   :: For index formats 2 and 5.  This is the big       */
-  /*                     metrics for each glyph bitmap.                    */
-  /*                                                                       */
-  /*    num_glyphs    :: For index formats 4 and 5.  This is the number of */
-  /*                     glyphs in the code array.                         */
-  /*                                                                       */
-  /*    glyph_offsets :: For index formats 1 and 3.                        */
-  /*                                                                       */
-  /*    glyph_codes   :: For index formats 4 and 5.                        */
-  /*                                                                       */
-  /*    table_offset  :: The offset of the index table in the `EBLC'       */
-  /*                     table.  Only used during strike loading.          */
-  /*                                                                       */
-  typedef struct  TT_SBit_RangeRec_
-  {
-    FT_UShort           first_glyph;
-    FT_UShort           last_glyph;
-
-    FT_UShort           index_format;
-    FT_UShort           image_format;
-    FT_ULong            image_offset;
-
-    FT_ULong            image_size;
-    TT_SBit_MetricsRec  metrics;
-    FT_ULong            num_glyphs;
-
-    FT_ULong*           glyph_offsets;
-    FT_UShort*          glyph_codes;
-
-    FT_ULong            table_offset;
-
-  } TT_SBit_RangeRec, *TT_SBit_Range;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_StrikeRec                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used describe a given bitmap strike in the `EBLC'      */
-  /*    (Microsoft) or `bloc' (Apple) tables.                              */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*   num_index_ranges :: The number of index ranges.                     */
-  /*                                                                       */
-  /*   index_ranges     :: An array of glyph index ranges.                 */
-  /*                                                                       */
-  /*   color_ref        :: Unused.  `color_ref' is put in for future       */
-  /*                       enhancements, but these fields are already      */
-  /*                       in use by other platforms (e.g. Newton).        */
-  /*                       For details, please see                         */
-  /*                                                                       */
-  /*                         https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html */
-  /*                                                                       */
-  /*   hori             :: The line metrics for horizontal layouts.        */
-  /*                                                                       */
-  /*   vert             :: The line metrics for vertical layouts.          */
-  /*                                                                       */
-  /*   start_glyph      :: The lowest glyph index for this strike.         */
-  /*                                                                       */
-  /*   end_glyph        :: The highest glyph index for this strike.        */
-  /*                                                                       */
-  /*   x_ppem           :: The number of horizontal pixels per EM.         */
-  /*                                                                       */
-  /*   y_ppem           :: The number of vertical pixels per EM.           */
-  /*                                                                       */
-  /*   bit_depth        :: The bit depth.  Valid values are 1, 2, 4,       */
-  /*                       and 8.                                          */
-  /*                                                                       */
-  /*   flags            :: Is this a vertical or horizontal strike?  For   */
-  /*                       details, please see                             */
-  /*                                                                       */
-  /*                         https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6bloc.html */
-  /*                                                                       */
-  typedef struct  TT_SBit_StrikeRec_
-  {
-    FT_Int                  num_ranges;
-    TT_SBit_Range           sbit_ranges;
-    FT_ULong                ranges_offset;
-
-    FT_ULong                color_ref;
-
-    TT_SBit_LineMetricsRec  hori;
-    TT_SBit_LineMetricsRec  vert;
-
-    FT_UShort               start_glyph;
-    FT_UShort               end_glyph;
-
-    FT_Byte                 x_ppem;
-    FT_Byte                 y_ppem;
-
-    FT_Byte                 bit_depth;
-    FT_Char                 flags;
-
-  } TT_SBit_StrikeRec, *TT_SBit_Strike;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_ComponentRec                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A simple structure to describe a compound sbit element.            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    glyph_code :: The element's glyph index.                           */
-  /*                                                                       */
-  /*    x_offset   :: The element's left bearing.                          */
-  /*                                                                       */
-  /*    y_offset   :: The element's top bearing.                           */
-  /*                                                                       */
-  typedef struct  TT_SBit_ComponentRec_
-  {
-    FT_UShort  glyph_code;
-    FT_Char    x_offset;
-    FT_Char    y_offset;
-
-  } TT_SBit_ComponentRec, *TT_SBit_Component;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_SBit_ScaleRec                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used describe a given bitmap scaling table, as defined */
-  /*    in the `EBSC' table.                                               */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    hori              :: The horizontal line metrics.                  */
-  /*                                                                       */
-  /*    vert              :: The vertical line metrics.                    */
-  /*                                                                       */
-  /*    x_ppem            :: The number of horizontal pixels per EM.       */
-  /*                                                                       */
-  /*    y_ppem            :: The number of vertical pixels per EM.         */
-  /*                                                                       */
-  /*    x_ppem_substitute :: Substitution x_ppem value.                    */
-  /*                                                                       */
-  /*    y_ppem_substitute :: Substitution y_ppem value.                    */
-  /*                                                                       */
-  typedef struct  TT_SBit_ScaleRec_
-  {
-    TT_SBit_LineMetricsRec  hori;
-    TT_SBit_LineMetricsRec  vert;
-
-    FT_Byte                 x_ppem;
-    FT_Byte                 y_ppem;
-
-    FT_Byte                 x_ppem_substitute;
-    FT_Byte                 y_ppem_substitute;
-
-  } TT_SBit_ScaleRec, *TT_SBit_Scale;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                  POSTSCRIPT GLYPH NAMES SUPPORT                   ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Post_20Rec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Postscript names sub-table, format 2.0.  Stores the PS name of     */
-  /*    each glyph in the font face.                                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_glyphs    :: The number of named glyphs in the table.          */
-  /*                                                                       */
-  /*    num_names     :: The number of PS names stored in the table.       */
-  /*                                                                       */
-  /*    glyph_indices :: The indices of the glyphs in the names arrays.    */
-  /*                                                                       */
-  /*    glyph_names   :: The PS names not in Mac Encoding.                 */
-  /*                                                                       */
-  typedef struct  TT_Post_20Rec_
-  {
-    FT_UShort   num_glyphs;
-    FT_UShort   num_names;
-    FT_UShort*  glyph_indices;
-    FT_Char**   glyph_names;
-
-  } TT_Post_20Rec, *TT_Post_20;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Post_25Rec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Postscript names sub-table, format 2.5.  Stores the PS name of     */
-  /*    each glyph in the font face.                                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_glyphs :: The number of glyphs in the table.                   */
-  /*                                                                       */
-  /*    offsets    :: An array of signed offsets in a normal Mac           */
-  /*                  Postscript name encoding.                            */
-  /*                                                                       */
-  typedef struct  TT_Post_25_
-  {
-    FT_UShort  num_glyphs;
-    FT_Char*   offsets;
-
-  } TT_Post_25Rec, *TT_Post_25;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Post_NamesRec                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Postscript names table, either format 2.0 or 2.5.                  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    loaded    :: A flag to indicate whether the PS names are loaded.   */
-  /*                                                                       */
-  /*    format_20 :: The sub-table used for format 2.0.                    */
-  /*                                                                       */
-  /*    format_25 :: The sub-table used for format 2.5.                    */
-  /*                                                                       */
-  typedef struct  TT_Post_NamesRec_
-  {
-    FT_Bool  loaded;
-
-    union
-    {
-      TT_Post_20Rec  format_20;
-      TT_Post_25Rec  format_25;
-
-    } names;
-
-  } TT_Post_NamesRec, *TT_Post_Names;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                    GX VARIATION TABLE SUPPORT                     ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  typedef struct GX_BlendRec_  *GX_Blend;
-#endif
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***              EMBEDDED BDF PROPERTIES TABLE SUPPORT                ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*
-   * These types are used to support a `BDF ' table that isn't part of the
-   * official TrueType specification.  It is mainly used in SFNT-based
-   * bitmap fonts that were generated from a set of BDF fonts.
-   *
-   * The format of the table is as follows.
-   *
-   *   USHORT   version      `BDF ' table version number, should be 0x0001.
-   *   USHORT   strikeCount  Number of strikes (bitmap sizes) in this table.
-   *   ULONG    stringTable  Offset (from start of BDF table) to string
-   *                         table.
-   *
-   * This is followed by an array of `strikeCount' descriptors, having the
-   * following format.
-   *
-   *   USHORT   ppem         Vertical pixels per EM for this strike.
-   *   USHORT   numItems     Number of items for this strike (properties and
-   *                         atoms).  Maximum is 255.
-   *
-   * This array in turn is followed by `strikeCount' value sets.  Each
-   * `value set' is an array of `numItems' items with the following format.
-   *
-   *   ULONG    item_name    Offset in string table to item name.
-   *   USHORT   item_type    The item type.  Possible values are
-   *                            0 => string (e.g., COMMENT)
-   *                            1 => atom   (e.g., FONT or even SIZE)
-   *                            2 => int32
-   *                            3 => uint32
-   *                         0x10 => A flag to indicate a properties.  This
-   *                                 is ORed with the above values.
-   *   ULONG    item_value   For strings  => Offset into string table without
-   *                                         the corresponding double quotes.
-   *                         For atoms    => Offset into string table.
-   *                         For integers => Direct value.
-   *
-   * All strings in the string table consist of bytes and are
-   * zero-terminated.
-   *
-   */
-
-#ifdef TT_CONFIG_OPTION_BDF
-
-  typedef struct  TT_BDFRec_
-  {
-    FT_Byte*   table;
-    FT_Byte*   table_end;
-    FT_Byte*   strings;
-    FT_ULong   strings_size;
-    FT_UInt    num_strikes;
-    FT_Bool    loaded;
-
-  } TT_BDFRec, *TT_BDF;
-
-#endif /* TT_CONFIG_OPTION_BDF */
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /***                  ORIGINAL TT_FACE CLASS DEFINITION                ***/
-  /***                                                                   ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This structure/class is defined here because it is common to the      */
-  /* following formats: TTF, OpenType-TT, and OpenType-CFF.                */
-  /*                                                                       */
-  /* Note, however, that the classes TT_Size and TT_GlyphSlot are not      */
-  /* shared between font drivers, and are thus defined in `ttobjs.h'.      */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    TT_Face                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a TrueType face/font object.  A TT_Face encapsulates   */
-  /*    the resolution and scaling independent parts of a TrueType font    */
-  /*    resource.                                                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The TT_Face structure is also used as a `parent class' for the     */
-  /*    OpenType-CFF class (T2_Face).                                      */
-  /*                                                                       */
-  typedef struct TT_FaceRec_*  TT_Face;
-
-
-  /* a function type used for the truetype bytecode interpreter hooks */
-  typedef FT_Error
-  (*TT_Interpreter)( void*  exec_context );
-
-  /* forward declaration */
-  typedef struct TT_LoaderRec_*  TT_Loader;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Loader_GotoTableFunc                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Seeks a stream to the start of a given TrueType table.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    tag    :: A 4-byte tag used to name the table.                     */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    length :: The length of the table in bytes.  Set to 0 if not       */
-  /*              needed.                                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The stream cursor must be at the font file's origin.               */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Loader_GotoTableFunc)( TT_Face    face,
-                              FT_ULong   tag,
-                              FT_Stream  stream,
-                              FT_ULong*  length );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Loader_StartGlyphFunc                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Seeks a stream to the start of a given glyph element, and opens a  */
-  /*    frame for it.                                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    loader      :: The current TrueType glyph loader object.           */
-  /*                                                                       */
-  /*    glyph index :: The index of the glyph to access.                   */
-  /*                                                                       */
-  /*    offset      :: The offset of the glyph according to the            */
-  /*                   `locations' table.                                  */
-  /*                                                                       */
-  /*    byte_count  :: The size of the frame in bytes.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function is normally equivalent to FT_STREAM_SEEK(offset)     */
-  /*    followed by FT_FRAME_ENTER(byte_count) with the loader's stream,   */
-  /*    but alternative formats (e.g. compressed ones) might use something */
-  /*    different.                                                         */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Loader_StartGlyphFunc)( TT_Loader  loader,
-                               FT_UInt    glyph_index,
-                               FT_ULong   offset,
-                               FT_UInt    byte_count );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Loader_ReadGlyphFunc                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Reads one glyph element (its header, a simple glyph, or a          */
-  /*    composite) from the loader's current stream frame.                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    loader :: The current TrueType glyph loader object.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  typedef FT_Error
-  (*TT_Loader_ReadGlyphFunc)( TT_Loader  loader );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <FuncType>                                                            */
-  /*    TT_Loader_EndGlyphFunc                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Closes the current loader stream frame for the glyph.              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    loader :: The current TrueType glyph loader object.                */
-  /*                                                                       */
-  typedef void
-  (*TT_Loader_EndGlyphFunc)( TT_Loader  loader );
-
-
-  typedef enum TT_SbitTableType_
-  {
-    TT_SBIT_TABLE_TYPE_NONE = 0,
-    TT_SBIT_TABLE_TYPE_EBLC, /* `EBLC' (Microsoft), */
-                             /* `bloc' (Apple)      */
-    TT_SBIT_TABLE_TYPE_CBLC, /* `CBLC' (Google)     */
-    TT_SBIT_TABLE_TYPE_SBIX, /* `sbix' (Apple)      */
-
-    /* do not remove */
-    TT_SBIT_TABLE_TYPE_MAX
-
-  } 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                            */
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Face                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType face class.  These objects model the resolution and   */
-  /*    point-size independent data found in a TrueType font file.         */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root                 :: The base FT_Face structure, managed by the */
-  /*                            base layer.                                */
-  /*                                                                       */
-  /*    ttc_header           :: The TrueType collection header, used when  */
-  /*                            the file is a `ttc' rather than a `ttf'.   */
-  /*                            For ordinary font files, the field         */
-  /*                            `ttc_header.count' is set to 0.            */
-  /*                                                                       */
-  /*    format_tag           :: The font format tag.                       */
-  /*                                                                       */
-  /*    num_tables           :: The number of TrueType tables in this font */
-  /*                            file.                                      */
-  /*                                                                       */
-  /*    dir_tables           :: The directory of TrueType tables for this  */
-  /*                            font file.                                 */
-  /*                                                                       */
-  /*    header               :: The font's font header (`head' table).     */
-  /*                            Read on font opening.                      */
-  /*                                                                       */
-  /*    horizontal           :: The font's horizontal header (`hhea'       */
-  /*                            table).  This field also contains the      */
-  /*                            associated horizontal metrics table        */
-  /*                            (`hmtx').                                  */
-  /*                                                                       */
-  /*    max_profile          :: The font's maximum profile table.  Read on */
-  /*                            font opening.  Note that some maximum      */
-  /*                            values cannot be taken directly from this  */
-  /*                            table.  We thus define additional fields   */
-  /*                            below to hold the computed maxima.         */
-  /*                                                                       */
-  /*    vertical_info        :: A boolean which is set when the font file  */
-  /*                            contains vertical metrics.  If not, the    */
-  /*                            value of the `vertical' field is           */
-  /*                            undefined.                                 */
-  /*                                                                       */
-  /*    vertical             :: The font's vertical header (`vhea' table). */
-  /*                            This field also contains the associated    */
-  /*                            vertical metrics table (`vmtx'), if found. */
-  /*                            IMPORTANT: The contents of this field is   */
-  /*                            undefined if the `vertical_info' field is  */
-  /*                            unset.                                     */
-  /*                                                                       */
-  /*    num_names            :: The number of name records within this     */
-  /*                            TrueType font.                             */
-  /*                                                                       */
-  /*    name_table           :: The table of name records (`name').        */
-  /*                                                                       */
-  /*    os2                  :: The font's OS/2 table (`OS/2').            */
-  /*                                                                       */
-  /*    postscript           :: The font's PostScript table (`post'        */
-  /*                            table).  The PostScript glyph names are    */
-  /*                            not loaded by the driver on face opening.  */
-  /*                            See the `ttpost' module for more details.  */
-  /*                                                                       */
-  /*    cmap_table           :: Address of the face's `cmap' SFNT table    */
-  /*                            in memory (it's an extracted frame).       */
-  /*                                                                       */
-  /*    cmap_size            :: The size in bytes of the `cmap_table'      */
-  /*                            described above.                           */
-  /*                                                                       */
-  /*    goto_table           :: A function called by each TrueType table   */
-  /*                            loader to position a stream's cursor to    */
-  /*                            the start of a given table according to    */
-  /*                            its tag.  It defaults to TT_Goto_Face but  */
-  /*                            can be different for strange formats (e.g. */
-  /*                            Type 42).                                  */
-  /*                                                                       */
-  /*    access_glyph_frame   :: A function used to access the frame of a   */
-  /*                            given glyph within the face's font file.   */
-  /*                                                                       */
-  /*    forget_glyph_frame   :: A function used to forget the frame of a   */
-  /*                            given glyph when all data has been loaded. */
-  /*                                                                       */
-  /*    read_glyph_header    :: A function used to read a glyph header.    */
-  /*                            It must be called between an `access' and  */
-  /*                            `forget'.                                  */
-  /*                                                                       */
-  /*    read_simple_glyph    :: A function used to read a simple glyph.    */
-  /*                            It must be called after the header was     */
-  /*                            read, and before the `forget'.             */
-  /*                                                                       */
-  /*    read_composite_glyph :: A function used to read a composite glyph. */
-  /*                            It must be called after the header was     */
-  /*                            read, and before the `forget'.             */
-  /*                                                                       */
-  /*    sfnt                 :: A pointer to the SFNT service.             */
-  /*                                                                       */
-  /*    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.                   */
-  /*                                                                       */
-  /*    gasp                 :: The grid-fitting and scaling properties    */
-  /*                            table (`gasp').  This table is optional in */
-  /*                            TrueType/OpenType fonts.                   */
-  /*                                                                       */
-  /*    pclt                 :: The `pclt' SFNT table.                     */
-  /*                                                                       */
-  /*    num_sbit_scales      :: The number of sbit scales for this font.   */
-  /*                                                                       */
-  /*    sbit_scales          :: Array of sbit scales embedded in this      */
-  /*                            font.  This table is optional in a         */
-  /*                            TrueType/OpenType font.                    */
-  /*                                                                       */
-  /*    postscript_names     :: A table used to store the Postscript names */
-  /*                            of  the glyphs for this font.  See the     */
-  /*                            file  `ttconfig.h' for comments on the     */
-  /*                            TT_CONFIG_OPTION_POSTSCRIPT_NAMES option.  */
-  /*                                                                       */
-  /*    font_program_size    :: Size in bytecodes of the face's font       */
-  /*                            program.  0 if none defined.  Ignored for  */
-  /*                            Type 2 fonts.                              */
-  /*                                                                       */
-  /*    font_program         :: The face's font program (bytecode stream)  */
-  /*                            executed at load time, also used during    */
-  /*                            glyph rendering.  Comes from the `fpgm'    */
-  /*                            table.  Ignored for Type 2 font fonts.     */
-  /*                                                                       */
-  /*    cvt_program_size     :: The size in bytecodes of the face's cvt    */
-  /*                            program.  Ignored for Type 2 fonts.        */
-  /*                                                                       */
-  /*    cvt_program          :: The face's cvt program (bytecode stream)   */
-  /*                            executed each time an instance/size is     */
-  /*                            changed/reset.  Comes from the `prep'      */
-  /*                            table.  Ignored for Type 2 fonts.          */
-  /*                                                                       */
-  /*    cvt_size             :: Size of the control value table (in        */
-  /*                            entries).   Ignored for Type 2 fonts.      */
-  /*                                                                       */
-  /*    cvt                  :: The face's original control value table.   */
-  /*                            Coordinates are expressed in unscaled font */
-  /*                            units.  Comes from the `cvt ' table.       */
-  /*                            Ignored for Type 2 fonts.                  */
-  /*                                                                       */
-  /*    interpreter          :: A pointer to the TrueType bytecode         */
-  /*                            interpreters field is also used to hook    */
-  /*                            the debugger in `ttdebug'.                 */
-  /*                                                                       */
-  /*    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.       */
-  /*                                                                       */
-  /*    doblend              :: A boolean which is set if the font should  */
-  /*                            be blended (this is for GX var).           */
-  /*                                                                       */
-  /*    blend                :: Contains the data needed to control GX     */
-  /*                            variation tables (rather like Multiple     */
-  /*                            Master data).                              */
-  /*                                                                       */
-  /*    is_default_instance  :: Set if the glyph outlines can be used      */
-  /*                            unmodified (i.e., without applying glyph   */
-  /*                            variation deltas).                         */
-  /*                                                                       */
-  /*    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.   */
-  /*                                                                       */
-  /*    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    */
-  /*                            backwards 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_
-  {
-    FT_FaceRec            root;
-
-    TTC_HeaderRec         ttc_header;
-
-    FT_ULong              format_tag;
-    FT_UShort             num_tables;
-    TT_Table              dir_tables;
-
-    TT_Header             header;       /* TrueType header table          */
-    TT_HoriHeader         horizontal;   /* TrueType horizontal header     */
-
-    TT_MaxProfile         max_profile;
-
-    FT_Bool               vertical_info;
-    TT_VertHeader         vertical;     /* TT Vertical header, if present */
-
-    FT_UShort             num_names;    /* number of name records  */
-    TT_NameTableRec       name_table;   /* name table              */
-
-    TT_OS2                os2;          /* TrueType OS/2 table            */
-    TT_Postscript         postscript;   /* TrueType Postscript table      */
-
-    FT_Byte*              cmap_table;   /* extracted `cmap' table */
-    FT_ULong              cmap_size;
-
-    TT_Loader_GotoTableFunc   goto_table;
-
-    TT_Loader_StartGlyphFunc  access_glyph_frame;
-    TT_Loader_EndGlyphFunc    forget_glyph_frame;
-    TT_Loader_ReadGlyphFunc   read_glyph_header;
-    TT_Loader_ReadGlyphFunc   read_simple_glyph;
-    TT_Loader_ReadGlyphFunc   read_composite_glyph;
-
-    /* a typeless pointer to the SFNT_Interface table used to load */
-    /* the basic TrueType tables in the face object                */
-    void*                 sfnt;
-
-    /* a typeless pointer to the FT_Service_PsCMapsRec table used to */
-    /* 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
-
-
-    /***********************************************************************/
-    /*                                                                     */
-    /* Optional TrueType/OpenType tables                                   */
-    /*                                                                     */
-    /***********************************************************************/
-
-    /* grid-fitting and scaling table */
-    TT_GaspRec            gasp;                 /* the `gasp' table */
-
-    /* PCL 5 table */
-    TT_PCLT               pclt;
-
-    /* embedded bitmaps support */
-    FT_ULong              num_sbit_scales;
-    TT_SBit_Scale         sbit_scales;
-
-    /* postscript names table */
-    TT_Post_NamesRec      postscript_names;
-
-
-    /***********************************************************************/
-    /*                                                                     */
-    /* TrueType-specific fields (ignored by the OTF-Type2 driver)          */
-    /*                                                                     */
-    /***********************************************************************/
-
-    /* the font program, if any */
-    FT_ULong              font_program_size;
-    FT_Byte*              font_program;
-
-    /* the cvt program, if any */
-    FT_ULong              cvt_program_size;
-    FT_Byte*              cvt_program;
-
-    /* the original, unscaled, control value table */
-    FT_ULong              cvt_size;
-    FT_Short*             cvt;
-
-    /* A pointer to the bytecode interpreter to use.  This is also */
-    /* used to hook the debugger for the `ttdebug' utility.        */
-    TT_Interpreter        interpreter;
-
-
-    /***********************************************************************/
-    /*                                                                     */
-    /* Other tables or fields. This is used by derivative formats like     */
-    /* OpenType.                                                           */
-    /*                                                                     */
-    /***********************************************************************/
-
-    FT_Generic            extra;
-
-    const char*           postscript_name;
-
-    FT_ULong              glyf_len;
-    FT_ULong              glyf_offset;    /* since 2.7.1 */
-
-    FT_Bool               isCFF2;         /* since 2.7.1 */
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    FT_Bool               doblend;
-    GX_Blend              blend;
-
-    FT_Bool               is_default_instance;   /* since 2.7.1 */
-    FT_UInt32             variation_support;     /* since 2.7.1 */
-#endif
-
-    /* since version 2.2 */
-
-    FT_ULong              horz_metrics_size;
-    FT_ULong              vert_metrics_size;
-
-    FT_ULong              num_locations; /* in broken TTF, gid > 0xFFFF */
-    FT_Byte*              glyph_locations;
-
-    FT_Byte*              hdmx_table;
-    FT_ULong              hdmx_table_size;
-    FT_UInt               hdmx_record_count;
-    FT_ULong              hdmx_record_size;
-    FT_Byte*              hdmx_record_sizes;
-
-    FT_Byte*              sbit_table;
-    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;
-    FT_UInt               num_kern_tables;
-    FT_UInt32             kern_avail_bits;
-    FT_UInt32             kern_order_bits;
-
-#ifdef TT_CONFIG_OPTION_BDF
-    TT_BDFRec             bdf;
-#endif /* TT_CONFIG_OPTION_BDF */
-
-    /* since 2.3.0 */
-    FT_ULong              horz_metrics_offset;
-    FT_ULong              vert_metrics_offset;
-
-#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_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;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  <Struct>                                                             */
-  /*     TT_GlyphZoneRec                                                   */
-  /*                                                                       */
-  /*  <Description>                                                        */
-  /*     A glyph zone is used to load, scale and hint glyph outline        */
-  /*     coordinates.                                                      */
-  /*                                                                       */
-  /*  <Fields>                                                             */
-  /*     memory       :: A handle to the memory manager.                   */
-  /*                                                                       */
-  /*     max_points   :: The maximum size in points of the zone.           */
-  /*                                                                       */
-  /*     max_contours :: Max size in links contours of the zone.           */
-  /*                                                                       */
-  /*     n_points     :: The current number of points in the zone.         */
-  /*                                                                       */
-  /*     n_contours   :: The current number of contours in the zone.       */
-  /*                                                                       */
-  /*     org          :: The original glyph coordinates (font              */
-  /*                     units/scaled).                                    */
-  /*                                                                       */
-  /*     cur          :: The current glyph coordinates (scaled/hinted).    */
-  /*                                                                       */
-  /*     tags         :: The point control tags.                           */
-  /*                                                                       */
-  /*     contours     :: The contours end points.                          */
-  /*                                                                       */
-  /*     first_point  :: Offset of the current subglyph's first point.     */
-  /*                                                                       */
-  typedef struct  TT_GlyphZoneRec_
-  {
-    FT_Memory   memory;
-    FT_UShort   max_points;
-    FT_Short    max_contours;
-    FT_UShort   n_points;    /* number of points in zone    */
-    FT_Short    n_contours;  /* number of contours          */
-
-    FT_Vector*  org;         /* original point coordinates  */
-    FT_Vector*  cur;         /* current point coordinates   */
-    FT_Vector*  orus;        /* original (unscaled) point coordinates */
-
-    FT_Byte*    tags;        /* current touch flags         */
-    FT_UShort*  contours;    /* contour end points          */
-
-    FT_UShort   first_point; /* offset of first (#0) point  */
-
-  } TT_GlyphZoneRec, *TT_GlyphZone;
-
-
-  /* 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_
-  {
-    TT_Face          face;
-    TT_Size          size;
-    FT_GlyphSlot     glyph;
-    FT_GlyphLoader   gloader;
-
-    FT_ULong         load_flags;
-    FT_UInt          glyph_index;
-
-    FT_Stream        stream;
-    FT_Int           byte_len;
-
-    FT_Short         n_contours;
-    FT_BBox          bbox;
-    FT_Int           left_bearing;
-    FT_Int           advance;
-    FT_Int           linear;
-    FT_Bool          linear_def;
-    FT_Vector        pp1;
-    FT_Vector        pp2;
-
-    /* the zone where we load our glyphs */
-    TT_GlyphZoneRec  base;
-    TT_GlyphZoneRec  zone;
-
-    TT_ExecContext   exec;
-    FT_Byte*         instructions;
-    FT_ULong         ins_pos;
-
-    /* for possible extensibility in other formats */
-    void*            other;
-
-    /* since version 2.1.8 */
-    FT_Int           top_bearing;
-    FT_Int           vadvance;
-    FT_Vector        pp3;
-    FT_Vector        pp4;
-
-    /* since version 2.2.1 */
-    FT_Byte*         cursor;
-    FT_Byte*         limit;
-
-    /* since version 2.6.2 */
-    FT_ListRec       composites;
-
-  } TT_LoaderRec;
-
-
-FT_END_HEADER
-
-#endif /* TTTYPES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/t1tables.h b/third_party/freetype/include/freetype/t1tables.h
deleted file mode 100644
index 81c9034..0000000
--- a/third_party/freetype/include/freetype/t1tables.h
+++ /dev/null
@@ -1,761 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1tables.h                                                             */
-/*                                                                         */
-/*    Basic Type 1/Type 2 tables definitions and interface (specification  */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1TABLES_H_
-#define T1TABLES_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>                                                             */
-  /*    type1_tables                                                       */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Type 1 Tables                                                      */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Type~1 (PostScript) specific font tables.                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the definition of Type 1-specific tables,    */
-  /*    including structures related to other PostScript font formats.     */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    PS_FontInfoRec                                                     */
-  /*    PS_FontInfo                                                        */
-  /*    PS_PrivateRec                                                      */
-  /*    PS_Private                                                         */
-  /*                                                                       */
-  /*    CID_FaceDictRec                                                    */
-  /*    CID_FaceDict                                                       */
-  /*    CID_FaceInfoRec                                                    */
-  /*    CID_FaceInfo                                                       */
-  /*                                                                       */
-  /*    FT_Has_PS_Glyph_Names                                              */
-  /*    FT_Get_PS_Font_Info                                                */
-  /*    FT_Get_PS_Font_Private                                             */
-  /*    FT_Get_PS_Font_Value                                               */
-  /*                                                                       */
-  /*    T1_Blend_Flags                                                     */
-  /*    T1_EncodingType                                                    */
-  /*    PS_Dict_Keys                                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* Note that we separate font data in PS_FontInfoRec and PS_PrivateRec */
-  /* structures in order to support Multiple Master fonts.               */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_FontInfoRec                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a Type~1 or Type~2 FontInfo dictionary.  */
-  /*    Note that for Multiple Master fonts, each instance has its own     */
-  /*    FontInfo dictionary.                                               */
-  /*                                                                       */
-  typedef struct  PS_FontInfoRec_
-  {
-    FT_String*  version;
-    FT_String*  notice;
-    FT_String*  full_name;
-    FT_String*  family_name;
-    FT_String*  weight;
-    FT_Long     italic_angle;
-    FT_Bool     is_fixed_pitch;
-    FT_Short    underline_position;
-    FT_UShort   underline_thickness;
-
-  } PS_FontInfoRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_FontInfo                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a @PS_FontInfoRec structure.                           */
-  /*                                                                       */
-  typedef struct PS_FontInfoRec_*  PS_FontInfo;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    T1_FontInfo                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This type is equivalent to @PS_FontInfoRec.  It is deprecated but  */
-  /*    kept to maintain source compatibility between various versions of  */
-  /*    FreeType.                                                          */
-  /*                                                                       */
-  typedef PS_FontInfoRec  T1_FontInfo;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_PrivateRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a Type~1 or Type~2 private dictionary.   */
-  /*    Note that for Multiple Master fonts, each instance has its own     */
-  /*    Private dictionary.                                                */
-  /*                                                                       */
-  typedef struct  PS_PrivateRec_
-  {
-    FT_Int     unique_id;
-    FT_Int     lenIV;
-
-    FT_Byte    num_blue_values;
-    FT_Byte    num_other_blues;
-    FT_Byte    num_family_blues;
-    FT_Byte    num_family_other_blues;
-
-    FT_Short   blue_values[14];
-    FT_Short   other_blues[10];
-
-    FT_Short   family_blues      [14];
-    FT_Short   family_other_blues[10];
-
-    FT_Fixed   blue_scale;
-    FT_Int     blue_shift;
-    FT_Int     blue_fuzz;
-
-    FT_UShort  standard_width[1];
-    FT_UShort  standard_height[1];
-
-    FT_Byte    num_snap_widths;
-    FT_Byte    num_snap_heights;
-    FT_Bool    force_bold;
-    FT_Bool    round_stem_up;
-
-    FT_Short   snap_widths [13];  /* including std width  */
-    FT_Short   snap_heights[13];  /* including std height */
-
-    FT_Fixed   expansion_factor;
-
-    FT_Long    language_group;
-    FT_Long    password;
-
-    FT_Short   min_feature[2];
-
-  } PS_PrivateRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    PS_Private                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a @PS_PrivateRec structure.                            */
-  /*                                                                       */
-  typedef struct PS_PrivateRec_*  PS_Private;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    T1_Private                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   This type is equivalent to @PS_PrivateRec.  It is deprecated but    */
-  /*   kept to maintain source compatibility between various versions of   */
-  /*   FreeType.                                                           */
-  /*                                                                       */
-  typedef PS_PrivateRec  T1_Private;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    T1_Blend_Flags                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A set of flags used to indicate which fields are present in a      */
-  /*    given blend dictionary (font info or private).  Used to support    */
-  /*    Multiple Masters fonts.                                            */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    T1_BLEND_UNDERLINE_POSITION ::                                     */
-  /*    T1_BLEND_UNDERLINE_THICKNESS ::                                    */
-  /*    T1_BLEND_ITALIC_ANGLE ::                                           */
-  /*    T1_BLEND_BLUE_VALUES ::                                            */
-  /*    T1_BLEND_OTHER_BLUES ::                                            */
-  /*    T1_BLEND_STANDARD_WIDTH ::                                         */
-  /*    T1_BLEND_STANDARD_HEIGHT ::                                        */
-  /*    T1_BLEND_STEM_SNAP_WIDTHS ::                                       */
-  /*    T1_BLEND_STEM_SNAP_HEIGHTS ::                                      */
-  /*    T1_BLEND_BLUE_SCALE ::                                             */
-  /*    T1_BLEND_BLUE_SHIFT ::                                             */
-  /*    T1_BLEND_FAMILY_BLUES ::                                           */
-  /*    T1_BLEND_FAMILY_OTHER_BLUES ::                                     */
-  /*    T1_BLEND_FORCE_BOLD ::                                             */
-  /*                                                                       */
-  typedef enum  T1_Blend_Flags_
-  {
-    /* required fields in a FontInfo blend dictionary */
-    T1_BLEND_UNDERLINE_POSITION = 0,
-    T1_BLEND_UNDERLINE_THICKNESS,
-    T1_BLEND_ITALIC_ANGLE,
-
-    /* required fields in a Private blend dictionary */
-    T1_BLEND_BLUE_VALUES,
-    T1_BLEND_OTHER_BLUES,
-    T1_BLEND_STANDARD_WIDTH,
-    T1_BLEND_STANDARD_HEIGHT,
-    T1_BLEND_STEM_SNAP_WIDTHS,
-    T1_BLEND_STEM_SNAP_HEIGHTS,
-    T1_BLEND_BLUE_SCALE,
-    T1_BLEND_BLUE_SHIFT,
-    T1_BLEND_FAMILY_BLUES,
-    T1_BLEND_FAMILY_OTHER_BLUES,
-    T1_BLEND_FORCE_BOLD,
-
-    T1_BLEND_MAX    /* do not remove */
-
-  } T1_Blend_Flags;
-
-
-  /* these constants are deprecated; use the corresponding */
-  /* `T1_Blend_Flags' values instead                       */
-#define t1_blend_underline_position   T1_BLEND_UNDERLINE_POSITION
-#define t1_blend_underline_thickness  T1_BLEND_UNDERLINE_THICKNESS
-#define t1_blend_italic_angle         T1_BLEND_ITALIC_ANGLE
-#define t1_blend_blue_values          T1_BLEND_BLUE_VALUES
-#define t1_blend_other_blues          T1_BLEND_OTHER_BLUES
-#define t1_blend_standard_widths      T1_BLEND_STANDARD_WIDTH
-#define t1_blend_standard_height      T1_BLEND_STANDARD_HEIGHT
-#define t1_blend_stem_snap_widths     T1_BLEND_STEM_SNAP_WIDTHS
-#define t1_blend_stem_snap_heights    T1_BLEND_STEM_SNAP_HEIGHTS
-#define t1_blend_blue_scale           T1_BLEND_BLUE_SCALE
-#define t1_blend_blue_shift           T1_BLEND_BLUE_SHIFT
-#define t1_blend_family_blues         T1_BLEND_FAMILY_BLUES
-#define t1_blend_family_other_blues   T1_BLEND_FAMILY_OTHER_BLUES
-#define t1_blend_force_bold           T1_BLEND_FORCE_BOLD
-#define t1_blend_max                  T1_BLEND_MAX
-
-  /* */
-
-
-  /* maximum number of Multiple Masters designs, as defined in the spec */
-#define T1_MAX_MM_DESIGNS     16
-
-  /* maximum number of Multiple Masters axes, as defined in the spec */
-#define T1_MAX_MM_AXIS        4
-
-  /* maximum number of elements in a design map */
-#define T1_MAX_MM_MAP_POINTS  20
-
-
-  /* this structure is used to store the BlendDesignMap entry for an axis */
-  typedef struct  PS_DesignMap_
-  {
-    FT_Byte    num_points;
-    FT_Long*   design_points;
-    FT_Fixed*  blend_points;
-
-  } PS_DesignMapRec, *PS_DesignMap;
-
-  /* backwards-compatible definition */
-  typedef PS_DesignMapRec  T1_DesignMap;
-
-
-  typedef struct  PS_BlendRec_
-  {
-    FT_UInt          num_designs;
-    FT_UInt          num_axis;
-
-    FT_String*       axis_names[T1_MAX_MM_AXIS];
-    FT_Fixed*        design_pos[T1_MAX_MM_DESIGNS];
-    PS_DesignMapRec  design_map[T1_MAX_MM_AXIS];
-
-    FT_Fixed*        weight_vector;
-    FT_Fixed*        default_weight_vector;
-
-    PS_FontInfo      font_infos[T1_MAX_MM_DESIGNS + 1];
-    PS_Private       privates  [T1_MAX_MM_DESIGNS + 1];
-
-    FT_ULong         blend_bitflags;
-
-    FT_BBox*         bboxes    [T1_MAX_MM_DESIGNS + 1];
-
-    /* since 2.3.0 */
-
-    /* undocumented, optional: the default design instance;   */
-    /* corresponds to default_weight_vector --                */
-    /* num_default_design_vector == 0 means it is not present */
-    /* in the font and associated metrics files               */
-    FT_UInt          default_design_vector[T1_MAX_MM_DESIGNS];
-    FT_UInt          num_default_design_vector;
-
-  } PS_BlendRec, *PS_Blend;
-
-
-  /* backwards-compatible definition */
-  typedef PS_BlendRec  T1_Blend;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_FaceDictRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to represent data in a CID top-level dictionary.  */
-  /*                                                                       */
-  typedef struct  CID_FaceDictRec_
-  {
-    PS_PrivateRec  private_dict;
-
-    FT_UInt        len_buildchar;
-    FT_Fixed       forcebold_threshold;
-    FT_Pos         stroke_width;
-    FT_Fixed       expansion_factor;
-
-    FT_Byte        paint_type;
-    FT_Byte        font_type;
-    FT_Matrix      font_matrix;
-    FT_Vector      font_offset;
-
-    FT_UInt        num_subrs;
-    FT_ULong       subrmap_offset;
-    FT_Int         sd_bytes;
-
-  } CID_FaceDictRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_FaceDict                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a @CID_FaceDictRec structure.                          */
-  /*                                                                       */
-  typedef struct CID_FaceDictRec_*  CID_FaceDict;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_FontDict                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This type is equivalent to @CID_FaceDictRec.  It is deprecated but */
-  /*    kept to maintain source compatibility between various versions of  */
-  /*    FreeType.                                                          */
-  /*                                                                       */
-  typedef CID_FaceDictRec  CID_FontDict;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_FaceInfoRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to represent CID Face information.                */
-  /*                                                                       */
-  typedef struct  CID_FaceInfoRec_
-  {
-    FT_String*      cid_font_name;
-    FT_Fixed        cid_version;
-    FT_Int          cid_font_type;
-
-    FT_String*      registry;
-    FT_String*      ordering;
-    FT_Int          supplement;
-
-    PS_FontInfoRec  font_info;
-    FT_BBox         font_bbox;
-    FT_ULong        uid_base;
-
-    FT_Int          num_xuid;
-    FT_ULong        xuid[16];
-
-    FT_ULong        cidmap_offset;
-    FT_Int          fd_bytes;
-    FT_Int          gd_bytes;
-    FT_ULong        cid_count;
-
-    FT_Int          num_dicts;
-    CID_FaceDict    font_dicts;
-
-    FT_ULong        data_offset;
-
-  } CID_FaceInfoRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_FaceInfo                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a @CID_FaceInfoRec structure.                          */
-  /*                                                                       */
-  typedef struct CID_FaceInfoRec_*  CID_FaceInfo;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_Info                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*   This type is equivalent to @CID_FaceInfoRec.  It is deprecated but  */
-  /*   kept to maintain source compatibility between various versions of   */
-  /*   FreeType.                                                           */
-  /*                                                                       */
-  typedef CID_FaceInfoRec  CID_Info;
-
-
-  /************************************************************************
-   *
-   * @function:
-   *    FT_Has_PS_Glyph_Names
-   *
-   * @description:
-   *    Return true if a given face provides reliable PostScript glyph
-   *    names.  This is similar to using the @FT_HAS_GLYPH_NAMES macro,
-   *    except that certain fonts (mostly TrueType) contain incorrect
-   *    glyph name tables.
-   *
-   *    When this function returns true, the caller is sure that the glyph
-   *    names returned by @FT_Get_Glyph_Name are reliable.
-   *
-   * @input:
-   *    face ::
-   *       face handle
-   *
-   * @return:
-   *    Boolean.  True if glyph names are reliable.
-   *
-   */
-  FT_EXPORT( FT_Int )
-  FT_Has_PS_Glyph_Names( FT_Face  face );
-
-
-  /************************************************************************
-   *
-   * @function:
-   *    FT_Get_PS_Font_Info
-   *
-   * @description:
-   *    Retrieve the @PS_FontInfoRec structure corresponding to a given
-   *    PostScript font.
-   *
-   * @input:
-   *    face ::
-   *       PostScript face handle.
-   *
-   * @output:
-   *    afont_info ::
-   *       Output font info structure pointer.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *    String pointers within the @PS_FontInfoRec structure are owned by
-   *    the face and don't need to be freed by the caller.  Missing entries
-   *    in the font's FontInfo dictionary are represented by NULL pointers.
-   *
-   *    If the font's format is not PostScript-based, this function will
-   *    return the `FT_Err_Invalid_Argument' error code.
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_PS_Font_Info( FT_Face      face,
-                       PS_FontInfo  afont_info );
-
-
-  /************************************************************************
-   *
-   * @function:
-   *    FT_Get_PS_Font_Private
-   *
-   * @description:
-   *    Retrieve the @PS_PrivateRec structure corresponding to a given
-   *    PostScript font.
-   *
-   * @input:
-   *    face ::
-   *       PostScript face handle.
-   *
-   * @output:
-   *    afont_private ::
-   *       Output private dictionary structure pointer.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *    The string pointers within the @PS_PrivateRec structure are owned by
-   *    the face and don't need to be freed by the caller.
-   *
-   *    If the font's format is not PostScript-based, this function returns
-   *    the `FT_Err_Invalid_Argument' error code.
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_PS_Font_Private( FT_Face     face,
-                          PS_Private  afont_private );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    T1_EncodingType                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration describing the `Encoding' entry in a Type 1         */
-  /*    dictionary.                                                        */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    T1_ENCODING_TYPE_NONE ::                                           */
-  /*    T1_ENCODING_TYPE_ARRAY ::                                          */
-  /*    T1_ENCODING_TYPE_STANDARD ::                                       */
-  /*    T1_ENCODING_TYPE_ISOLATIN1 ::                                      */
-  /*    T1_ENCODING_TYPE_EXPERT ::                                         */
-  /*                                                                       */
-  typedef enum  T1_EncodingType_
-  {
-    T1_ENCODING_TYPE_NONE = 0,
-    T1_ENCODING_TYPE_ARRAY,
-    T1_ENCODING_TYPE_STANDARD,
-    T1_ENCODING_TYPE_ISOLATIN1,
-    T1_ENCODING_TYPE_EXPERT
-
-  } T1_EncodingType;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    PS_Dict_Keys                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration used in calls to @FT_Get_PS_Font_Value to identify  */
-  /*    the Type~1 dictionary entry to retrieve.                           */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    PS_DICT_FONT_TYPE ::                                               */
-  /*    PS_DICT_FONT_MATRIX ::                                             */
-  /*    PS_DICT_FONT_BBOX ::                                               */
-  /*    PS_DICT_PAINT_TYPE ::                                              */
-  /*    PS_DICT_FONT_NAME ::                                               */
-  /*    PS_DICT_UNIQUE_ID ::                                               */
-  /*    PS_DICT_NUM_CHAR_STRINGS ::                                        */
-  /*    PS_DICT_CHAR_STRING_KEY ::                                         */
-  /*    PS_DICT_CHAR_STRING ::                                             */
-  /*    PS_DICT_ENCODING_TYPE ::                                           */
-  /*    PS_DICT_ENCODING_ENTRY ::                                          */
-  /*    PS_DICT_NUM_SUBRS ::                                               */
-  /*    PS_DICT_SUBR ::                                                    */
-  /*    PS_DICT_STD_HW ::                                                  */
-  /*    PS_DICT_STD_VW ::                                                  */
-  /*    PS_DICT_NUM_BLUE_VALUES ::                                         */
-  /*    PS_DICT_BLUE_VALUE ::                                              */
-  /*    PS_DICT_BLUE_FUZZ ::                                               */
-  /*    PS_DICT_NUM_OTHER_BLUES ::                                         */
-  /*    PS_DICT_OTHER_BLUE ::                                              */
-  /*    PS_DICT_NUM_FAMILY_BLUES ::                                        */
-  /*    PS_DICT_FAMILY_BLUE ::                                             */
-  /*    PS_DICT_NUM_FAMILY_OTHER_BLUES ::                                  */
-  /*    PS_DICT_FAMILY_OTHER_BLUE ::                                       */
-  /*    PS_DICT_BLUE_SCALE ::                                              */
-  /*    PS_DICT_BLUE_SHIFT ::                                              */
-  /*    PS_DICT_NUM_STEM_SNAP_H ::                                         */
-  /*    PS_DICT_STEM_SNAP_H ::                                             */
-  /*    PS_DICT_NUM_STEM_SNAP_V ::                                         */
-  /*    PS_DICT_STEM_SNAP_V ::                                             */
-  /*    PS_DICT_FORCE_BOLD ::                                              */
-  /*    PS_DICT_RND_STEM_UP ::                                             */
-  /*    PS_DICT_MIN_FEATURE ::                                             */
-  /*    PS_DICT_LEN_IV ::                                                  */
-  /*    PS_DICT_PASSWORD ::                                                */
-  /*    PS_DICT_LANGUAGE_GROUP ::                                          */
-  /*    PS_DICT_VERSION ::                                                 */
-  /*    PS_DICT_NOTICE ::                                                  */
-  /*    PS_DICT_FULL_NAME ::                                               */
-  /*    PS_DICT_FAMILY_NAME ::                                             */
-  /*    PS_DICT_WEIGHT ::                                                  */
-  /*    PS_DICT_IS_FIXED_PITCH ::                                          */
-  /*    PS_DICT_UNDERLINE_POSITION ::                                      */
-  /*    PS_DICT_UNDERLINE_THICKNESS ::                                     */
-  /*    PS_DICT_FS_TYPE ::                                                 */
-  /*    PS_DICT_ITALIC_ANGLE ::                                            */
-  /*                                                                       */
-  typedef enum  PS_Dict_Keys_
-  {
-    /* conventionally in the font dictionary */
-    PS_DICT_FONT_TYPE,              /* FT_Byte         */
-    PS_DICT_FONT_MATRIX,            /* FT_Fixed        */
-    PS_DICT_FONT_BBOX,              /* FT_Fixed        */
-    PS_DICT_PAINT_TYPE,             /* FT_Byte         */
-    PS_DICT_FONT_NAME,              /* FT_String*      */
-    PS_DICT_UNIQUE_ID,              /* FT_Int          */
-    PS_DICT_NUM_CHAR_STRINGS,       /* FT_Int          */
-    PS_DICT_CHAR_STRING_KEY,        /* FT_String*      */
-    PS_DICT_CHAR_STRING,            /* FT_String*      */
-    PS_DICT_ENCODING_TYPE,          /* T1_EncodingType */
-    PS_DICT_ENCODING_ENTRY,         /* FT_String*      */
-
-    /* conventionally in the font Private dictionary */
-    PS_DICT_NUM_SUBRS,              /* FT_Int     */
-    PS_DICT_SUBR,                   /* FT_String* */
-    PS_DICT_STD_HW,                 /* FT_UShort  */
-    PS_DICT_STD_VW,                 /* FT_UShort  */
-    PS_DICT_NUM_BLUE_VALUES,        /* FT_Byte    */
-    PS_DICT_BLUE_VALUE,             /* FT_Short   */
-    PS_DICT_BLUE_FUZZ,              /* FT_Int     */
-    PS_DICT_NUM_OTHER_BLUES,        /* FT_Byte    */
-    PS_DICT_OTHER_BLUE,             /* FT_Short   */
-    PS_DICT_NUM_FAMILY_BLUES,       /* FT_Byte    */
-    PS_DICT_FAMILY_BLUE,            /* FT_Short   */
-    PS_DICT_NUM_FAMILY_OTHER_BLUES, /* FT_Byte    */
-    PS_DICT_FAMILY_OTHER_BLUE,      /* FT_Short   */
-    PS_DICT_BLUE_SCALE,             /* FT_Fixed   */
-    PS_DICT_BLUE_SHIFT,             /* FT_Int     */
-    PS_DICT_NUM_STEM_SNAP_H,        /* FT_Byte    */
-    PS_DICT_STEM_SNAP_H,            /* FT_Short   */
-    PS_DICT_NUM_STEM_SNAP_V,        /* FT_Byte    */
-    PS_DICT_STEM_SNAP_V,            /* FT_Short   */
-    PS_DICT_FORCE_BOLD,             /* FT_Bool    */
-    PS_DICT_RND_STEM_UP,            /* FT_Bool    */
-    PS_DICT_MIN_FEATURE,            /* FT_Short   */
-    PS_DICT_LEN_IV,                 /* FT_Int     */
-    PS_DICT_PASSWORD,               /* FT_Long    */
-    PS_DICT_LANGUAGE_GROUP,         /* FT_Long    */
-
-    /* conventionally in the font FontInfo dictionary */
-    PS_DICT_VERSION,                /* FT_String* */
-    PS_DICT_NOTICE,                 /* FT_String* */
-    PS_DICT_FULL_NAME,              /* FT_String* */
-    PS_DICT_FAMILY_NAME,            /* FT_String* */
-    PS_DICT_WEIGHT,                 /* FT_String* */
-    PS_DICT_IS_FIXED_PITCH,         /* FT_Bool    */
-    PS_DICT_UNDERLINE_POSITION,     /* FT_Short   */
-    PS_DICT_UNDERLINE_THICKNESS,    /* FT_UShort  */
-    PS_DICT_FS_TYPE,                /* FT_UShort  */
-    PS_DICT_ITALIC_ANGLE,           /* FT_Long    */
-
-    PS_DICT_MAX = PS_DICT_ITALIC_ANGLE
-
-  } PS_Dict_Keys;
-
-
-  /************************************************************************
-   *
-   * @function:
-   *    FT_Get_PS_Font_Value
-   *
-   * @description:
-   *    Retrieve the value for the supplied key from a PostScript font.
-   *
-   * @input:
-   *    face ::
-   *       PostScript face handle.
-   *
-   *    key ::
-   *       An enumeration value representing the dictionary key to retrieve.
-   *
-   *    idx ::
-   *       For array values, this specifies the index to be returned.
-   *
-   *    value ::
-   *       A pointer to memory into which to write the value.
-   *
-   *    valen_len ::
-   *       The size, in bytes, of the memory supplied for the value.
-   *
-   * @output:
-   *    value ::
-   *       The value matching the above key, if it exists.
-   *
-   * @return:
-   *    The amount of memory (in bytes) required to hold the requested
-   *    value (if it exists, -1 otherwise).
-   *
-   * @note:
-   *    The values returned are not pointers into the internal structures of
-   *    the face, but are `fresh' copies, so that the memory containing them
-   *    belongs to the calling application.  This also enforces the
-   *    `read-only' nature of these values, i.e., this function cannot be
-   *    used to manipulate the face.
-   *
-   *    `value' is a void pointer because the values returned can be of
-   *    various types.
-   *
-   *    If either `value' is NULL or `value_len' is too small, just the
-   *    required memory size for the requested entry is returned.
-   *
-   *    The `idx' parameter is used, not only to retrieve elements of, for
-   *    example, the FontMatrix or FontBBox, but also to retrieve name keys
-   *    from the CharStrings dictionary, and the charstrings themselves.  It
-   *    is ignored for atomic values.
-   *
-   *    PS_DICT_BLUE_SCALE returns a value that is scaled up by 1000.  To
-   *    get the value as in the font stream, you need to divide by
-   *    65536000.0 (to remove the FT_Fixed scale, and the x1000 scale).
-   *
-   *    IMPORTANT: Only key/value pairs read by the FreeType interpreter can
-   *    be retrieved.  So, for example, PostScript procedures such as NP,
-   *    ND, and RD are not available.  Arbitrary keys are, obviously, not be
-   *    available either.
-   *
-   *    If the font's format is not PostScript-based, this function returns
-   *    the `FT_Err_Invalid_Argument' error code.
-   *
-   */
-  FT_EXPORT( FT_Long )
-  FT_Get_PS_Font_Value( FT_Face       face,
-                        PS_Dict_Keys  key,
-                        FT_UInt       idx,
-                        void         *value,
-                        FT_Long       value_len );
-
-  /* */
-
-FT_END_HEADER
-
-#endif /* T1TABLES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ttnameid.h b/third_party/freetype/include/freetype/ttnameid.h
deleted file mode 100644
index 7da5c45..0000000
--- a/third_party/freetype/include/freetype/ttnameid.h
+++ /dev/null
@@ -1,1237 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttnameid.h                                                             */
-/*                                                                         */
-/*    TrueType name ID definitions (specification only).                   */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTNAMEID_H_
-#define TTNAMEID_H_
-
-
-#include <ft2build.h>
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    truetype_tables                                                    */
-  /*                                                                       */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Possible values for the `platform' identifier code in the name        */
-  /* records of the TTF `name' table.                                      */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_PLATFORM_XXX
-   *
-   * @description:
-   *   A list of valid values for the `platform_id' identifier code in
-   *   @FT_CharMapRec and @FT_SfntName structures.
-   *
-   * @values:
-   *   TT_PLATFORM_APPLE_UNICODE ::
-   *     Used by Apple to indicate a Unicode character map and/or name entry.
-   *     See @TT_APPLE_ID_XXX for corresponding `encoding_id' values.  Note
-   *     that name entries in this format are coded as big-endian UCS-2
-   *     character codes _only_.
-   *
-   *   TT_PLATFORM_MACINTOSH ::
-   *     Used by Apple to indicate a MacOS-specific charmap and/or name entry.
-   *     See @TT_MAC_ID_XXX for corresponding `encoding_id' values.  Note that
-   *     most TrueType fonts contain an Apple roman charmap to be usable on
-   *     MacOS systems (even if they contain a Microsoft charmap as well).
-   *
-   *   TT_PLATFORM_ISO ::
-   *     This value was used to specify ISO/IEC 10646 charmaps.  It is however
-   *     now deprecated.  See @TT_ISO_ID_XXX for a list of corresponding
-   *     `encoding_id' values.
-   *
-   *   TT_PLATFORM_MICROSOFT ::
-   *     Used by Microsoft to indicate Windows-specific charmaps.  See
-   *     @TT_MS_ID_XXX for a list of corresponding `encoding_id' values.
-   *     Note that most fonts contain a Unicode charmap using
-   *     (TT_PLATFORM_MICROSOFT, @TT_MS_ID_UNICODE_CS).
-   *
-   *   TT_PLATFORM_CUSTOM ::
-   *     Used to indicate application-specific charmaps.
-   *
-   *   TT_PLATFORM_ADOBE ::
-   *     This value isn't part of any font format specification, but is used
-   *     by FreeType to report Adobe-specific charmaps in an @FT_CharMapRec
-   *     structure.  See @TT_ADOBE_ID_XXX.
-   */
-
-#define TT_PLATFORM_APPLE_UNICODE  0
-#define TT_PLATFORM_MACINTOSH      1
-#define TT_PLATFORM_ISO            2 /* deprecated */
-#define TT_PLATFORM_MICROSOFT      3
-#define TT_PLATFORM_CUSTOM         4
-#define TT_PLATFORM_ADOBE          7 /* artificial */
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_APPLE_ID_XXX
-   *
-   * @description:
-   *   A list of valid values for the `encoding_id' for
-   *   @TT_PLATFORM_APPLE_UNICODE charmaps and name entries.
-   *
-   * @values:
-   *   TT_APPLE_ID_DEFAULT ::
-   *     Unicode version 1.0.
-   *
-   *   TT_APPLE_ID_UNICODE_1_1 ::
-   *     Unicode 1.1; specifies Hangul characters starting at U+34xx.
-   *
-   *   TT_APPLE_ID_ISO_10646 ::
-   *     Deprecated (identical to preceding).
-   *
-   *   TT_APPLE_ID_UNICODE_2_0 ::
-   *     Unicode 2.0 and beyond (UTF-16 BMP only).
-   *
-   *   TT_APPLE_ID_UNICODE_32 ::
-   *     Unicode 3.1 and beyond, using UTF-32.
-   *
-   *   TT_APPLE_ID_VARIANT_SELECTOR ::
-   *     From Adobe, not Apple.  Not a normal cmap.  Specifies variations
-   *     on a real 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_UNICODE_32        4 /* 2.0 or later, full repertoire */
-#define TT_APPLE_ID_VARIANT_SELECTOR  5 /* variation selector data */
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_MAC_ID_XXX
-   *
-   * @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
-#define TT_MAC_ID_JAPANESE              1
-#define TT_MAC_ID_TRADITIONAL_CHINESE   2
-#define TT_MAC_ID_KOREAN                3
-#define TT_MAC_ID_ARABIC                4
-#define TT_MAC_ID_HEBREW                5
-#define TT_MAC_ID_GREEK                 6
-#define TT_MAC_ID_RUSSIAN               7
-#define TT_MAC_ID_RSYMBOL               8
-#define TT_MAC_ID_DEVANAGARI            9
-#define TT_MAC_ID_GURMUKHI             10
-#define TT_MAC_ID_GUJARATI             11
-#define TT_MAC_ID_ORIYA                12
-#define TT_MAC_ID_BENGALI              13
-#define TT_MAC_ID_TAMIL                14
-#define TT_MAC_ID_TELUGU               15
-#define TT_MAC_ID_KANNADA              16
-#define TT_MAC_ID_MALAYALAM            17
-#define TT_MAC_ID_SINHALESE            18
-#define TT_MAC_ID_BURMESE              19
-#define TT_MAC_ID_KHMER                20
-#define TT_MAC_ID_THAI                 21
-#define TT_MAC_ID_LAOTIAN              22
-#define TT_MAC_ID_GEORGIAN             23
-#define TT_MAC_ID_ARMENIAN             24
-#define TT_MAC_ID_MALDIVIAN            25
-#define TT_MAC_ID_SIMPLIFIED_CHINESE   25
-#define TT_MAC_ID_TIBETAN              26
-#define TT_MAC_ID_MONGOLIAN            27
-#define TT_MAC_ID_GEEZ                 28
-#define TT_MAC_ID_SLAVIC               29
-#define TT_MAC_ID_VIETNAMESE           30
-#define TT_MAC_ID_SINDHI               31
-#define TT_MAC_ID_UNINTERP             32
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_ISO_ID_XXX
-   *
-   * @description:
-   *   A list of valid values for the `encoding_id' for
-   *   @TT_PLATFORM_ISO charmaps and name entries.
-   *
-   *   Their use is now deprecated.
-   *
-   * @values:
-   *   TT_ISO_ID_7BIT_ASCII ::
-   *     ASCII.
-   *   TT_ISO_ID_10646 ::
-   *     ISO/10646.
-   *   TT_ISO_ID_8859_1 ::
-   *     Also known as Latin-1.
-   */
-
-#define TT_ISO_ID_7BIT_ASCII  0
-#define TT_ISO_ID_10646       1
-#define TT_ISO_ID_8859_1      2
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_MS_ID_XXX
-   *
-   * @description:
-   *   A list of valid values for the `encoding_id' for
-   *   @TT_PLATFORM_MICROSOFT charmaps and name entries.
-   *
-   * @values:
-   *   TT_MS_ID_SYMBOL_CS ::
-   *     Corresponds to Microsoft symbol encoding. See
-   *     @FT_ENCODING_MS_SYMBOL.
-   *
-   *   TT_MS_ID_UNICODE_CS ::
-   *     Corresponds to a Microsoft WGL4 charmap, matching Unicode.  See
-   *     @FT_ENCODING_UNICODE.
-   *
-   *   TT_MS_ID_SJIS ::
-   *     Corresponds to SJIS 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_BIG_5 ::
-   *     Corresponds to 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.
-   *
-   *   TT_MS_ID_JOHAB ::
-   *     Corresponds to 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.)
-   */
-
-#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_BIG_5        4
-#define TT_MS_ID_WANSUNG      5
-#define TT_MS_ID_JOHAB        6
-#define TT_MS_ID_UCS_4       10
-
-
-  /***********************************************************************
-   *
-   * @enum:
-   *   TT_ADOBE_ID_XXX
-   *
-   * @description:
-   *   A list of valid values for the `encoding_id' for
-   *   @TT_PLATFORM_ADOBE charmaps.  This is a FreeType-specific extension!
-   *
-   * @values:
-   *   TT_ADOBE_ID_STANDARD ::
-   *     Adobe standard encoding.
-   *   TT_ADOBE_ID_EXPERT ::
-   *     Adobe expert encoding.
-   *   TT_ADOBE_ID_CUSTOM ::
-   *     Adobe custom encoding.
-   *   TT_ADOBE_ID_LATIN_1 ::
-   *     Adobe Latin~1 encoding.
-   */
-
-#define TT_ADOBE_ID_STANDARD  0
-#define TT_ADOBE_ID_EXPERT    1
-#define TT_ADOBE_ID_CUSTOM    2
-#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 */
-  /*                                                                       */
-#define TT_MAC_LANGID_ENGLISH                       0
-#define TT_MAC_LANGID_FRENCH                        1
-#define TT_MAC_LANGID_GERMAN                        2
-#define TT_MAC_LANGID_ITALIAN                       3
-#define TT_MAC_LANGID_DUTCH                         4
-#define TT_MAC_LANGID_SWEDISH                       5
-#define TT_MAC_LANGID_SPANISH                       6
-#define TT_MAC_LANGID_DANISH                        7
-#define TT_MAC_LANGID_PORTUGUESE                    8
-#define TT_MAC_LANGID_NORWEGIAN                     9
-#define TT_MAC_LANGID_HEBREW                       10
-#define TT_MAC_LANGID_JAPANESE                     11
-#define TT_MAC_LANGID_ARABIC                       12
-#define TT_MAC_LANGID_FINNISH                      13
-#define TT_MAC_LANGID_GREEK                        14
-#define TT_MAC_LANGID_ICELANDIC                    15
-#define TT_MAC_LANGID_MALTESE                      16
-#define TT_MAC_LANGID_TURKISH                      17
-#define TT_MAC_LANGID_CROATIAN                     18
-#define TT_MAC_LANGID_CHINESE_TRADITIONAL          19
-#define TT_MAC_LANGID_URDU                         20
-#define TT_MAC_LANGID_HINDI                        21
-#define TT_MAC_LANGID_THAI                         22
-#define TT_MAC_LANGID_KOREAN                       23
-#define TT_MAC_LANGID_LITHUANIAN                   24
-#define TT_MAC_LANGID_POLISH                       25
-#define TT_MAC_LANGID_HUNGARIAN                    26
-#define TT_MAC_LANGID_ESTONIAN                     27
-#define TT_MAC_LANGID_LETTISH                      28
-#define TT_MAC_LANGID_SAAMISK                      29
-#define TT_MAC_LANGID_FAEROESE                     30
-#define TT_MAC_LANGID_FARSI                        31
-#define TT_MAC_LANGID_RUSSIAN                      32
-#define TT_MAC_LANGID_CHINESE_SIMPLIFIED           33
-#define TT_MAC_LANGID_FLEMISH                      34
-#define TT_MAC_LANGID_IRISH                        35
-#define TT_MAC_LANGID_ALBANIAN                     36
-#define TT_MAC_LANGID_ROMANIAN                     37
-#define TT_MAC_LANGID_CZECH                        38
-#define TT_MAC_LANGID_SLOVAK                       39
-#define TT_MAC_LANGID_SLOVENIAN                    40
-#define TT_MAC_LANGID_YIDDISH                      41
-#define TT_MAC_LANGID_SERBIAN                      42
-#define TT_MAC_LANGID_MACEDONIAN                   43
-#define TT_MAC_LANGID_BULGARIAN                    44
-#define TT_MAC_LANGID_UKRAINIAN                    45
-#define TT_MAC_LANGID_BYELORUSSIAN                 46
-#define TT_MAC_LANGID_UZBEK                        47
-#define TT_MAC_LANGID_KAZAKH                       48
-#define TT_MAC_LANGID_AZERBAIJANI                  49
-#define TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT  49
-#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT    50
-#define TT_MAC_LANGID_ARMENIAN                     51
-#define TT_MAC_LANGID_GEORGIAN                     52
-#define TT_MAC_LANGID_MOLDAVIAN                    53
-#define TT_MAC_LANGID_KIRGHIZ                      54
-#define TT_MAC_LANGID_TAJIKI                       55
-#define TT_MAC_LANGID_TURKMEN                      56
-#define TT_MAC_LANGID_MONGOLIAN                    57
-#define TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT   57
-#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT    58
-#define TT_MAC_LANGID_PASHTO                       59
-#define TT_MAC_LANGID_KURDISH                      60
-#define TT_MAC_LANGID_KASHMIRI                     61
-#define TT_MAC_LANGID_SINDHI                       62
-#define TT_MAC_LANGID_TIBETAN                      63
-#define TT_MAC_LANGID_NEPALI                       64
-#define TT_MAC_LANGID_SANSKRIT                     65
-#define TT_MAC_LANGID_MARATHI                      66
-#define TT_MAC_LANGID_BENGALI                      67
-#define TT_MAC_LANGID_ASSAMESE                     68
-#define TT_MAC_LANGID_GUJARATI                     69
-#define TT_MAC_LANGID_PUNJABI                      70
-#define TT_MAC_LANGID_ORIYA                        71
-#define TT_MAC_LANGID_MALAYALAM                    72
-#define TT_MAC_LANGID_KANNADA                      73
-#define TT_MAC_LANGID_TAMIL                        74
-#define TT_MAC_LANGID_TELUGU                       75
-#define TT_MAC_LANGID_SINHALESE                    76
-#define TT_MAC_LANGID_BURMESE                      77
-#define TT_MAC_LANGID_KHMER                        78
-#define TT_MAC_LANGID_LAO                          79
-#define TT_MAC_LANGID_VIETNAMESE                   80
-#define TT_MAC_LANGID_INDONESIAN                   81
-#define TT_MAC_LANGID_TAGALOG                      82
-#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT           83
-#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT          84
-#define TT_MAC_LANGID_AMHARIC                      85
-#define TT_MAC_LANGID_TIGRINYA                     86
-#define TT_MAC_LANGID_GALLA                        87
-#define TT_MAC_LANGID_SOMALI                       88
-#define TT_MAC_LANGID_SWAHILI                      89
-#define TT_MAC_LANGID_RUANDA                       90
-#define TT_MAC_LANGID_RUNDI                        91
-#define TT_MAC_LANGID_CHEWA                        92
-#define TT_MAC_LANGID_MALAGASY                     93
-#define TT_MAC_LANGID_ESPERANTO                    94
-#define TT_MAC_LANGID_WELSH                       128
-#define TT_MAC_LANGID_BASQUE                      129
-#define TT_MAC_LANGID_CATALAN                     130
-#define TT_MAC_LANGID_LATIN                       131
-#define TT_MAC_LANGID_QUECHUA                     132
-#define TT_MAC_LANGID_GUARANI                     133
-#define TT_MAC_LANGID_AYMARA                      134
-#define TT_MAC_LANGID_TATAR                       135
-#define TT_MAC_LANGID_UIGHUR                      136
-#define TT_MAC_LANGID_DZONGKHA                    137
-#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
-#define TT_MAC_LANGID_BRETON                      142
-#define TT_MAC_LANGID_INUKTITUT                   143
-#define TT_MAC_LANGID_SCOTTISH_GAELIC             144
-#define TT_MAC_LANGID_MANX_GAELIC                 145
-#define TT_MAC_LANGID_IRISH_GAELIC                146
-#define TT_MAC_LANGID_TONGAN                      147
-#define TT_MAC_LANGID_GREEK_POLYTONIC             148
-#define TT_MAC_LANGID_GREELANDIC                  149
-#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          */
-  /*                                                                       */
-
-#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
-#define TT_MS_LANGID_ARABIC_LIBYA                      0x1001
-#define TT_MS_LANGID_ARABIC_ALGERIA                    0x1401
-#define TT_MS_LANGID_ARABIC_MOROCCO                    0x1801
-#define TT_MS_LANGID_ARABIC_TUNISIA                    0x1C01
-#define TT_MS_LANGID_ARABIC_OMAN                       0x2001
-#define TT_MS_LANGID_ARABIC_YEMEN                      0x2401
-#define TT_MS_LANGID_ARABIC_SYRIA                      0x2801
-#define TT_MS_LANGID_ARABIC_JORDAN                     0x2C01
-#define TT_MS_LANGID_ARABIC_LEBANON                    0x3001
-#define TT_MS_LANGID_ARABIC_KUWAIT                     0x3401
-#define TT_MS_LANGID_ARABIC_UAE                        0x3801
-#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_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_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_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
-#define TT_MS_LANGID_ENGLISH_CANADA                    0x1009
-#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND               0x1409
-#define TT_MS_LANGID_ENGLISH_IRELAND                   0x1809
-#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA              0x1C09
-#define TT_MS_LANGID_ENGLISH_JAMAICA                   0x2009
-#define TT_MS_LANGID_ENGLISH_CARIBBEAN                 0x2409
-#define TT_MS_LANGID_ENGLISH_BELIZE                    0x2809
-#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_GUATEMALA                 0x100A
-#define TT_MS_LANGID_SPANISH_COSTA_RICA                0x140A
-#define TT_MS_LANGID_SPANISH_PANAMA                    0x180A
-#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC        0x1C0A
-#define TT_MS_LANGID_SPANISH_VENEZUELA                 0x200A
-#define TT_MS_LANGID_SPANISH_COLOMBIA                  0x240A
-#define TT_MS_LANGID_SPANISH_PERU                      0x280A
-#define TT_MS_LANGID_SPANISH_ARGENTINA                 0x2C0A
-#define TT_MS_LANGID_SPANISH_ECUADOR                   0x300A
-#define TT_MS_LANGID_SPANISH_CHILE                     0x340A
-#define TT_MS_LANGID_SPANISH_URUGUAY                   0x380A
-#define TT_MS_LANGID_SPANISH_PARAGUAY                  0x3C0A
-#define TT_MS_LANGID_SPANISH_BOLIVIA                   0x400A
-#define TT_MS_LANGID_SPANISH_EL_SALVADOR               0x440A
-#define TT_MS_LANGID_SPANISH_HONDURAS                  0x480A
-#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
-#define TT_MS_LANGID_FRENCH_CANADA                     0x0C0C
-#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_DUTCH_NETHERLANDS                 0x0413
-#define TT_MS_LANGID_DUTCH_BELGIUM                     0x0813
-#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL           0x0414
-#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK          0x0814
-#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_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_SLOVAK_SLOVAKIA                   0x041B
-#define TT_MS_LANGID_ALBANIAN_ALBANIA                  0x041C
-#define TT_MS_LANGID_SWEDISH_SWEDEN                    0x041D
-#define TT_MS_LANGID_SWEDISH_FINLAND                   0x081D
-#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_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_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_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
-#define TT_MS_LANGID_SAMI_LULE_NORWAY                  0x103B
-#define TT_MS_LANGID_SAMI_LULE_SWEDEN                  0x143B
-#define TT_MS_LANGID_SAMI_SOUTHERN_NORWAY              0x183B
-#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_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_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_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_TAMIL_INDIA                       0x0449
-#define TT_MS_LANGID_TELUGU_INDIA                      0x044A
-#define TT_MS_LANGID_KANNADA_INDIA                     0x044B
-#define TT_MS_LANGID_MALAYALAM_INDIA                   0x044C
-#define TT_MS_LANGID_ASSAMESE_INDIA                    0x044D
-#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_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_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_INUKTITUT_CANADA                  0x045D
-#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_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_IGBO_NIGERIA                      0x0470
-#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_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_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
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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
-
-  /* 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
-  /* 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
-
-  /* The following code is new as of 2000-01-21 */
-#define TT_NAME_ID_SAMPLE_TEXT          19
-
-  /* This is new in OpenType 1.3 */
-#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
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Bit mask values for the Unicode Ranges from the TTF `OS2 ' table.     */
-  /*                                                                       */
-  /* Updated 08-Nov-2008.                                                  */
-  /*                                                                       */
-
-  /* Bit  0   Basic Latin */
-#define TT_UCR_BASIC_LATIN                     (1L <<  0) /* U+0020-U+007E */
-  /* Bit  1   C1 Controls and Latin-1 Supplement */
-#define TT_UCR_LATIN1_SUPPLEMENT               (1L <<  1) /* U+0080-U+00FF */
-  /* Bit  2   Latin Extended-A */
-#define TT_UCR_LATIN_EXTENDED_A                (1L <<  2) /* U+0100-U+017F */
-  /* Bit  3   Latin Extended-B */
-#define TT_UCR_LATIN_EXTENDED_B                (1L <<  3) /* U+0180-U+024F */
-  /* Bit  4   IPA Extensions                 */
-  /*          Phonetic Extensions            */
-  /*          Phonetic Extensions Supplement */
-#define TT_UCR_IPA_EXTENSIONS                  (1L <<  4) /* U+0250-U+02AF */
-                                                          /* U+1D00-U+1D7F */
-                                                          /* U+1D80-U+1DBF */
-  /* Bit  5   Spacing Modifier Letters */
-  /*          Modifier Tone Letters    */
-#define TT_UCR_SPACING_MODIFIER                (1L <<  5) /* U+02B0-U+02FF */
-                                                          /* U+A700-U+A71F */
-  /* Bit  6   Combining Diacritical Marks            */
-  /*          Combining Diacritical Marks Supplement */
-#define TT_UCR_COMBINING_DIACRITICS            (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 */
-  /* Bit  8   Coptic */
-#define TT_UCR_COPTIC                          (1L <<  8) /* U+2C80-U+2CFF */
-  /* Bit  9   Cyrillic            */
-  /*          Cyrillic Supplement */
-  /*          Cyrillic Extended-A */
-  /*          Cyrillic Extended-B */
-#define TT_UCR_CYRILLIC                        (1L <<  9) /* U+0400-U+04FF */
-                                                          /* U+0500-U+052F */
-                                                          /* U+2DE0-U+2DFF */
-                                                          /* U+A640-U+A69F */
-  /* Bit 10   Armenian */
-#define TT_UCR_ARMENIAN                        (1L << 10) /* U+0530-U+058F */
-  /* Bit 11   Hebrew */
-#define TT_UCR_HEBREW                          (1L << 11) /* U+0590-U+05FF */
-  /* Bit 12   Vai */
-#define TT_UCR_VAI                             (1L << 12) /* U+A500-U+A63F */
-  /* Bit 13   Arabic            */
-  /*          Arabic Supplement */
-#define TT_UCR_ARABIC                          (1L << 13) /* U+0600-U+06FF */
-                                                          /* U+0750-U+077F */
-  /* Bit 14   NKo */
-#define TT_UCR_NKO                             (1L << 14) /* U+07C0-U+07FF */
-  /* Bit 15   Devanagari */
-#define TT_UCR_DEVANAGARI                      (1L << 15) /* U+0900-U+097F */
-  /* Bit 16   Bengali */
-#define TT_UCR_BENGALI                         (1L << 16) /* U+0980-U+09FF */
-  /* Bit 17   Gurmukhi */
-#define TT_UCR_GURMUKHI                        (1L << 17) /* U+0A00-U+0A7F */
-  /* Bit 18   Gujarati */
-#define TT_UCR_GUJARATI                        (1L << 18) /* U+0A80-U+0AFF */
-  /* Bit 19   Oriya */
-#define TT_UCR_ORIYA                           (1L << 19) /* U+0B00-U+0B7F */
-  /* Bit 20   Tamil */
-#define TT_UCR_TAMIL                           (1L << 20) /* U+0B80-U+0BFF */
-  /* Bit 21   Telugu */
-#define TT_UCR_TELUGU                          (1L << 21) /* U+0C00-U+0C7F */
-  /* Bit 22   Kannada */
-#define TT_UCR_KANNADA                         (1L << 22) /* U+0C80-U+0CFF */
-  /* Bit 23   Malayalam */
-#define TT_UCR_MALAYALAM                       (1L << 23) /* U+0D00-U+0D7F */
-  /* Bit 24   Thai */
-#define TT_UCR_THAI                            (1L << 24) /* U+0E00-U+0E7F */
-  /* Bit 25   Lao */
-#define TT_UCR_LAO                             (1L << 25) /* U+0E80-U+0EFF */
-  /* Bit 26   Georgian            */
-  /*          Georgian Supplement */
-#define TT_UCR_GEORGIAN                        (1L << 26) /* U+10A0-U+10FF */
-                                                          /* U+2D00-U+2D2F */
-  /* Bit 27   Balinese */
-#define TT_UCR_BALINESE                        (1L << 27) /* U+1B00-U+1B7F */
-  /* Bit 28   Hangul Jamo */
-#define TT_UCR_HANGUL_JAMO                     (1L << 28) /* U+1100-U+11FF */
-  /* Bit 29   Latin Extended Additional */
-  /*          Latin Extended-C          */
-  /*          Latin Extended-D          */
-#define TT_UCR_LATIN_EXTENDED_ADDITIONAL       (1L << 29) /* U+1E00-U+1EFF */
-                                                          /* U+2C60-U+2C7F */
-                                                          /* U+A720-U+A7FF */
-  /* Bit 30   Greek Extended */
-#define TT_UCR_GREEK_EXTENDED                  (1L << 30) /* U+1F00-U+1FFF */
-  /* Bit 31   General Punctuation      */
-  /*          Supplemental Punctuation */
-#define TT_UCR_GENERAL_PUNCTUATION             (1L << 31) /* U+2000-U+206F */
-                                                          /* U+2E00-U+2E7F */
-  /* 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 */
-  /* Bit 35   Letterlike Symbols */
-#define TT_UCR_LETTERLIKE_SYMBOLS              (1L <<  3) /* U+2100-U+214F */
-  /* Bit 36   Number Forms */
-#define TT_UCR_NUMBER_FORMS                    (1L <<  4) /* U+2150-U+218F */
-  /* Bit 37   Arrows                           */
-  /*          Supplemental Arrows-A            */
-  /*          Supplemental Arrows-B            */
-  /*          Miscellaneous Symbols and Arrows */
-#define TT_UCR_ARROWS                          (1L <<  5) /* U+2190-U+21FF */
-                                                          /* U+27F0-U+27FF */
-                                                          /* U+2900-U+297F */
-                                                          /* U+2B00-U+2BFF */
-  /* Bit 38   Mathematical Operators               */
-  /*          Supplemental Mathematical Operators  */
-  /*          Miscellaneous Mathematical Symbols-A */
-  /*          Miscellaneous Mathematical Symbols-B */
-#define TT_UCR_MATHEMATICAL_OPERATORS          (1L <<  6) /* U+2200-U+22FF */
-                                                          /* U+2A00-U+2AFF */
-                                                          /* U+27C0-U+27EF */
-                                                          /* U+2980-U+29FF */
-  /* Bit 39 Miscellaneous Technical */
-#define TT_UCR_MISCELLANEOUS_TECHNICAL         (1L <<  7) /* U+2300-U+23FF */
-  /* Bit 40   Control Pictures */
-#define TT_UCR_CONTROL_PICTURES                (1L <<  8) /* U+2400-U+243F */
-  /* Bit 41   Optical Character Recognition */
-#define TT_UCR_OCR                             (1L <<  9) /* U+2440-U+245F */
-  /* Bit 42   Enclosed Alphanumerics */
-#define TT_UCR_ENCLOSED_ALPHANUMERICS          (1L << 10) /* U+2460-U+24FF */
-  /* Bit 43   Box Drawing */
-#define TT_UCR_BOX_DRAWING                     (1L << 11) /* U+2500-U+257F */
-  /* Bit 44   Block Elements */
-#define TT_UCR_BLOCK_ELEMENTS                  (1L << 12) /* U+2580-U+259F */
-  /* Bit 45   Geometric Shapes */
-#define TT_UCR_GEOMETRIC_SHAPES                (1L << 13) /* U+25A0-U+25FF */
-  /* Bit 46   Miscellaneous Symbols */
-#define TT_UCR_MISCELLANEOUS_SYMBOLS           (1L << 14) /* U+2600-U+26FF */
-  /* Bit 47   Dingbats */
-#define TT_UCR_DINGBATS                        (1L << 15) /* U+2700-U+27BF */
-  /* Bit 48   CJK Symbols and Punctuation */
-#define TT_UCR_CJK_SYMBOLS                     (1L << 16) /* U+3000-U+303F */
-  /* Bit 49   Hiragana */
-#define TT_UCR_HIRAGANA                        (1L << 17) /* U+3040-U+309F */
-  /* Bit 50   Katakana                     */
-  /*          Katakana Phonetic Extensions */
-#define TT_UCR_KATAKANA                        (1L << 18) /* U+30A0-U+30FF */
-                                                          /* U+31F0-U+31FF */
-  /* Bit 51   Bopomofo          */
-  /*          Bopomofo Extended */
-#define TT_UCR_BOPOMOFO                        (1L << 19) /* U+3100-U+312F */
-                                                          /* U+31A0-U+31BF */
-  /* Bit 52   Hangul Compatibility Jamo */
-#define TT_UCR_HANGUL_COMPATIBILITY_JAMO       (1L << 20) /* U+3130-U+318F */
-  /* Bit 53   Phags-Pa */
-#define TT_UCR_CJK_MISC                        (1L << 21) /* U+A840-U+A87F */
-#define TT_UCR_KANBUN  TT_UCR_CJK_MISC /* deprecated */
-#define TT_UCR_PHAGSPA
-  /* Bit 54   Enclosed CJK Letters and Months */
-#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS     (1L << 22) /* U+3200-U+32FF */
-  /* Bit 55   CJK Compatibility */
-#define TT_UCR_CJK_COMPATIBILITY               (1L << 23) /* U+3300-U+33FF */
-  /* Bit 56   Hangul Syllables */
-#define TT_UCR_HANGUL                          (1L << 24) /* U+AC00-U+D7A3 */
-  /* 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                      */
-#define TT_UCR_SURROGATES                      (1L << 25) /* U+D800-U+DB7F */
-                                                          /* U+DB80-U+DBFF */
-                                                          /* U+DC00-U+DFFF */
-#define TT_UCR_NON_PLANE_0  TT_UCR_SURROGATES
-  /* Bit 58  Phoenician */
-#define TT_UCR_PHOENICIAN                      (1L << 26) /*U+10900-U+1091F*/
-  /* Bit 59   CJK Unified Ideographs             */
-  /*          CJK Radicals Supplement            */
-  /*          Kangxi Radicals                    */
-  /*          Ideographic Description Characters */
-  /*          CJK Unified Ideographs Extension A */
-  /*          CJK Unified Ideographs Extension B */
-  /*          Kanbun                             */
-#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS          (1L << 27) /* U+4E00-U+9FFF */
-                                                          /* U+2E80-U+2EFF */
-                                                          /* U+2F00-U+2FDF */
-                                                          /* U+2FF0-U+2FFF */
-                                                          /* U+3400-U+4DB5 */
-                                                          /*U+20000-U+2A6DF*/
-                                                          /* U+3190-U+319F */
-  /* Bit 60   Private Use */
-#define TT_UCR_PRIVATE_USE                     (1L << 28) /* U+E000-U+F8FF */
-  /* Bit 61   CJK Strokes                             */
-  /*          CJK Compatibility Ideographs            */
-  /*          CJK Compatibility Ideographs Supplement */
-#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS    (1L << 29) /* U+31C0-U+31EF */
-                                                          /* U+F900-U+FAFF */
-                                                          /*U+2F800-U+2FA1F*/
-  /* 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 */
-  /* Bit 64   Combining Half Marks */
-#define TT_UCR_COMBINING_HALF_MARKS            (1L <<  0) /* U+FE20-U+FE2F */
-  /* Bit 65   Vertical forms          */
-  /*          CJK Compatibility Forms */
-#define TT_UCR_CJK_COMPATIBILITY_FORMS         (1L <<  1) /* U+FE10-U+FE1F */
-                                                          /* U+FE30-U+FE4F */
-  /* 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 */
-  /* Bit 68   Halfwidth and Fullwidth Forms */
-#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS       (1L <<  4) /* U+FF00-U+FFEF */
-  /* Bit 69   Specials */
-#define TT_UCR_SPECIALS                        (1L <<  5) /* U+FFF0-U+FFFD */
-  /* Bit 70   Tibetan */
-#define TT_UCR_TIBETAN                         (1L <<  6) /* U+0F00-U+0FFF */
-  /* Bit 71   Syriac */
-#define TT_UCR_SYRIAC                          (1L <<  7) /* U+0700-U+074F */
-  /* Bit 72   Thaana */
-#define TT_UCR_THAANA                          (1L <<  8) /* U+0780-U+07BF */
-  /* Bit 73   Sinhala */
-#define TT_UCR_SINHALA                         (1L <<  9) /* U+0D80-U+0DFF */
-  /* Bit 74   Myanmar */
-#define TT_UCR_MYANMAR                         (1L << 10) /* U+1000-U+109F */
-  /* Bit 75   Ethiopic            */
-  /*          Ethiopic Supplement */
-  /*          Ethiopic Extended   */
-#define TT_UCR_ETHIOPIC                        (1L << 11) /* U+1200-U+137F */
-                                                          /* U+1380-U+139F */
-                                                          /* U+2D80-U+2DDF */
-  /* Bit 76   Cherokee */
-#define TT_UCR_CHEROKEE                        (1L << 12) /* U+13A0-U+13FF */
-  /* Bit 77   Unified Canadian Aboriginal Syllabics */
-#define TT_UCR_CANADIAN_ABORIGINAL_SYLLABICS   (1L << 13) /* U+1400-U+167F */
-  /* Bit 78   Ogham */
-#define TT_UCR_OGHAM                           (1L << 14) /* U+1680-U+169F */
-  /* Bit 79   Runic */
-#define TT_UCR_RUNIC                           (1L << 15) /* U+16A0-U+16FF */
-  /* Bit 80   Khmer         */
-  /*          Khmer Symbols */
-#define TT_UCR_KHMER                           (1L << 16) /* U+1780-U+17FF */
-                                                          /* U+19E0-U+19FF */
-  /* Bit 81   Mongolian */
-#define TT_UCR_MONGOLIAN                       (1L << 17) /* U+1800-U+18AF */
-  /* Bit 82   Braille Patterns */
-#define TT_UCR_BRAILLE                         (1L << 18) /* U+2800-U+28FF */
-  /* Bit 83   Yi Syllables */
-  /*          Yi Radicals  */
-#define TT_UCR_YI                              (1L << 19) /* U+A000-U+A48F */
-                                                          /* U+A490-U+A4CF */
-  /* Bit 84   Tagalog  */
-  /*          Hanunoo  */
-  /*          Buhid    */
-  /*          Tagbanwa */
-#define TT_UCR_PHILIPPINE                      (1L << 20) /* U+1700-U+171F */
-                                                          /* U+1720-U+173F */
-                                                          /* U+1740-U+175F */
-                                                          /* U+1760-U+177F */
-  /* Bit 85   Old Italic */
-#define TT_UCR_OLD_ITALIC                      (1L << 21) /*U+10300-U+1032F*/
-  /* Bit 86   Gothic */
-#define TT_UCR_GOTHIC                          (1L << 22) /*U+10330-U+1034F*/
-  /* Bit 87   Deseret */
-#define TT_UCR_DESERET                         (1L << 23) /*U+10400-U+1044F*/
-  /* Bit 88   Byzantine Musical Symbols      */
-  /*          Musical Symbols                */
-  /*          Ancient Greek Musical Notation */
-#define TT_UCR_MUSICAL_SYMBOLS                 (1L << 24) /*U+1D000-U+1D0FF*/
-                                                          /*U+1D100-U+1D1FF*/
-                                                          /*U+1D200-U+1D24F*/
-  /* Bit 89   Mathematical Alphanumeric Symbols */
-#define TT_UCR_MATH_ALPHANUMERIC_SYMBOLS       (1L << 25) /*U+1D400-U+1D7FF*/
-  /* Bit 90   Private Use (plane 15) */
-  /*          Private Use (plane 16) */
-#define TT_UCR_PRIVATE_USE_SUPPLEMENTARY       (1L << 26) /*U+F0000-U+FFFFD*/
-                                                        /*U+100000-U+10FFFD*/
-  /* Bit 91   Variation Selectors            */
-  /*          Variation Selectors Supplement */
-#define TT_UCR_VARIATION_SELECTORS             (1L << 27) /* U+FE00-U+FE0F */
-                                                          /*U+E0100-U+E01EF*/
-  /* Bit 92   Tags */
-#define TT_UCR_TAGS                            (1L << 28) /*U+E0000-U+E007F*/
-  /* Bit 93   Limbu */
-#define TT_UCR_LIMBU                           (1L << 29) /* U+1900-U+194F */
-  /* Bit 94   Tai Le */
-#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 */
-  /* Bit 96   Buginese */
-#define TT_UCR_BUGINESE                        (1L <<  0) /* U+1A00-U+1A1F */
-  /* Bit 97   Glagolitic */
-#define TT_UCR_GLAGOLITIC                      (1L <<  1) /* U+2C00-U+2C5F */
-  /* Bit 98   Tifinagh */
-#define TT_UCR_TIFINAGH                        (1L <<  2) /* U+2D30-U+2D7F */
-  /* Bit 99   Yijing Hexagram Symbols */
-#define TT_UCR_YIJING                          (1L <<  3) /* U+4DC0-U+4DFF */
-  /* Bit 100  Syloti Nagri */
-#define TT_UCR_SYLOTI_NAGRI                    (1L <<  4) /* U+A800-U+A82F */
-  /* Bit 101  Linear B Syllabary */
-  /*          Linear B Ideograms */
-  /*          Aegean Numbers     */
-#define TT_UCR_LINEAR_B                        (1L <<  5) /*U+10000-U+1007F*/
-                                                          /*U+10080-U+100FF*/
-                                                          /*U+10100-U+1013F*/
-  /* Bit 102  Ancient Greek Numbers */
-#define TT_UCR_ANCIENT_GREEK_NUMBERS           (1L <<  6) /*U+10140-U+1018F*/
-  /* Bit 103  Ugaritic */
-#define TT_UCR_UGARITIC                        (1L <<  7) /*U+10380-U+1039F*/
-  /* Bit 104  Old Persian */
-#define TT_UCR_OLD_PERSIAN                     (1L <<  8) /*U+103A0-U+103DF*/
-  /* Bit 105  Shavian */
-#define TT_UCR_SHAVIAN                         (1L <<  9) /*U+10450-U+1047F*/
-  /* Bit 106  Osmanya */
-#define TT_UCR_OSMANYA                         (1L << 10) /*U+10480-U+104AF*/
-  /* Bit 107  Cypriot Syllabary */
-#define TT_UCR_CYPRIOT_SYLLABARY               (1L << 11) /*U+10800-U+1083F*/
-  /* Bit 108  Kharoshthi */
-#define TT_UCR_KHAROSHTHI                      (1L << 12) /*U+10A00-U+10A5F*/
-  /* Bit 109  Tai Xuan Jing Symbols */
-#define TT_UCR_TAI_XUAN_JING                   (1L << 13) /*U+1D300-U+1D35F*/
-  /* Bit 110  Cuneiform                         */
-  /*          Cuneiform Numbers and Punctuation */
-#define TT_UCR_CUNEIFORM                       (1L << 14) /*U+12000-U+123FF*/
-                                                          /*U+12400-U+1247F*/
-  /* Bit 111  Counting Rod Numerals */
-#define TT_UCR_COUNTING_ROD_NUMERALS           (1L << 15) /*U+1D360-U+1D37F*/
-  /* Bit 112  Sundanese */
-#define TT_UCR_SUNDANESE                       (1L << 16) /* U+1B80-U+1BBF */
-  /* Bit 113  Lepcha */
-#define TT_UCR_LEPCHA                          (1L << 17) /* U+1C00-U+1C4F */
-  /* Bit 114  Ol Chiki */
-#define TT_UCR_OL_CHIKI                        (1L << 18) /* U+1C50-U+1C7F */
-  /* Bit 115  Saurashtra */
-#define TT_UCR_SAURASHTRA                      (1L << 19) /* U+A880-U+A8DF */
-  /* Bit 116  Kayah Li */
-#define TT_UCR_KAYAH_LI                        (1L << 20) /* U+A900-U+A92F */
-  /* Bit 117  Rejang */
-#define TT_UCR_REJANG                          (1L << 21) /* U+A930-U+A95F */
-  /* Bit 118  Cham */
-#define TT_UCR_CHAM                            (1L << 22) /* U+AA00-U+AA5F */
-  /* Bit 119  Ancient Symbols */
-#define TT_UCR_ANCIENT_SYMBOLS                 (1L << 23) /*U+10190-U+101CF*/
-  /* Bit 120  Phaistos Disc */
-#define TT_UCR_PHAISTOS_DISC                   (1L << 24) /*U+101D0-U+101FF*/
-  /* Bit 121  Carian */
-  /*          Lycian */
-  /*          Lydian */
-#define TT_UCR_OLD_ANATOLIAN                   (1L << 25) /*U+102A0-U+102DF*/
-                                                          /*U+10280-U+1029F*/
-                                                          /*U+10920-U+1093F*/
-  /* Bit 122  Domino Tiles  */
-  /*          Mahjong Tiles */
-#define TT_UCR_GAME_TILES                      (1L << 26) /*U+1F030-U+1F09F*/
-                                                          /*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
-
-
-#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 */
-
-
-FT_END_HEADER
-
-#endif /* TTNAMEID_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/tttables.h b/third_party/freetype/include/freetype/tttables.h
deleted file mode 100644
index 7a278e2..0000000
--- a/third_party/freetype/include/freetype/tttables.h
+++ /dev/null
@@ -1,856 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  tttables.h                                                             */
-/*                                                                         */
-/*    Basic SFNT/TrueType tables definitions and interface                 */
-/*    (specification only).                                                */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTTABLES_H_
-#define TTTABLES_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>                                                             */
-  /*    truetype_tables                                                    */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    TrueType Tables                                                    */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    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.          */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    TT_Header                                                          */
-  /*    TT_HoriHeader                                                      */
-  /*    TT_VertHeader                                                      */
-  /*    TT_OS2                                                             */
-  /*    TT_Postscript                                                      */
-  /*    TT_PCLT                                                            */
-  /*    TT_MaxProfile                                                      */
-  /*                                                                       */
-  /*    FT_Sfnt_Tag                                                        */
-  /*    FT_Get_Sfnt_Table                                                  */
-  /*    FT_Load_Sfnt_Table                                                 */
-  /*    FT_Sfnt_Table_Info                                                 */
-  /*                                                                       */
-  /*    FT_Get_CMap_Language_ID                                            */
-  /*    FT_Get_CMap_Format                                                 */
-  /*                                                                       */
-  /*    FT_PARAM_TAG_UNPATENTED_HINTING                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Header                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType font header table.  All       */
-  /*    fields follow the TrueType specification.                          */
-  /*                                                                       */
-  typedef struct  TT_Header_
-  {
-    FT_Fixed   Table_Version;
-    FT_Fixed   Font_Revision;
-
-    FT_Long    CheckSum_Adjust;
-    FT_Long    Magic_Number;
-
-    FT_UShort  Flags;
-    FT_UShort  Units_Per_EM;
-
-    FT_Long    Created [2];
-    FT_Long    Modified[2];
-
-    FT_Short   xMin;
-    FT_Short   yMin;
-    FT_Short   xMax;
-    FT_Short   yMax;
-
-    FT_UShort  Mac_Style;
-    FT_UShort  Lowest_Rec_PPEM;
-
-    FT_Short   Font_Direction;
-    FT_Short   Index_To_Loc_Format;
-    FT_Short   Glyph_Data_Format;
-
-  } TT_Header;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_HoriHeader                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType horizontal header, the `hhea' */
-  /*    table, as well as the corresponding horizontal metrics table,      */
-  /*    i.e., the `hmtx' table.                                            */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Version                :: The table version.                       */
-  /*                                                                       */
-  /*    Ascender               :: The font's ascender, i.e., the distance  */
-  /*                              from the baseline to the top-most of all */
-  /*                              glyph points found in the font.          */
-  /*                                                                       */
-  /*                              This value is invalid in many fonts, as  */
-  /*                              it is usually set by the font designer,  */
-  /*                              and often reflects only a portion of the */
-  /*                              glyphs found in the font (maybe ASCII).  */
-  /*                                                                       */
-  /*                              You should use the `sTypoAscender' 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 bottom-most of  */
-  /*                              all glyph points found in the font.  It  */
-  /*                              is negative.                             */
-  /*                                                                       */
-  /*                              This value is invalid in many fonts, as  */
-  /*                              it is usually set by the font designer,  */
-  /*                              and often reflects only a portion of the */
-  /*                              glyphs found in the font (maybe ASCII).  */
-  /*                                                                       */
-  /*                              You should use the `sTypoDescender'      */
-  /*                              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  */
-  /*                              get the BTB, i.e., the                   */
-  /*                              baseline-to-baseline distance for the    */
-  /*                              font.                                    */
-  /*                                                                       */
-  /*    advance_Width_Max      :: This field is the maximum of all advance */
-  /*                              widths found in the font.  It can be     */
-  /*                              used to compute the maximum width of an  */
-  /*                              arbitrary string of text.                */
-  /*                                                                       */
-  /*    min_Left_Side_Bearing  :: The minimum left side bearing of all     */
-  /*                              glyphs within the font.                  */
-  /*                                                                       */
-  /*    min_Right_Side_Bearing :: The minimum right side bearing of all    */
-  /*                              glyphs within the font.                  */
-  /*                                                                       */
-  /*    xMax_Extent            :: The maximum horizontal extent (i.e., the */
-  /*                              `width' of a glyph's bounding box) for   */
-  /*                              all glyphs in the font.                  */
-  /*                                                                       */
-  /*    caret_Slope_Rise       :: The rise coefficient of the cursor's     */
-  /*                              slope of the cursor (slope=rise/run).    */
-  /*                                                                       */
-  /*    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.                                */
-  /*                                                                       */
-  /*    number_Of_HMetrics     :: Number of HMetrics entries in the `hmtx' */
-  /*                              table -- this value can be smaller than  */
-  /*                              the total number of glyphs in the font.  */
-  /*                                                                       */
-  /*    long_metrics           :: A pointer into the `hmtx' table.         */
-  /*                                                                       */
-  /*    short_metrics          :: A pointer into the `hmtx' table.         */
-  /*                                                                       */
-  /* <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: `caret_Slope_Rise', */
-  /*    `caret_Slope_Run', and `caret_Offset'.                             */
-  /*                                                                       */
-  /*    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.                                                */
-  /*                                                                       */
-  typedef struct  TT_HoriHeader_
-  {
-    FT_Fixed   Version;
-    FT_Short   Ascender;
-    FT_Short   Descender;
-    FT_Short   Line_Gap;
-
-    FT_UShort  advance_Width_Max;      /* advance width maximum */
-
-    FT_Short   min_Left_Side_Bearing;  /* minimum left-sb       */
-    FT_Short   min_Right_Side_Bearing; /* minimum right-sb      */
-    FT_Short   xMax_Extent;            /* xmax extents          */
-    FT_Short   caret_Slope_Rise;
-    FT_Short   caret_Slope_Run;
-    FT_Short   caret_Offset;
-
-    FT_Short   Reserved[4];
-
-    FT_Short   metric_Data_Format;
-    FT_UShort  number_Of_HMetrics;
-
-    /* The following fields are not defined by the TrueType specification */
-    /* but they are used to connect the metrics header to the relevant    */
-    /* `hmtx' table.                                                      */
-
-    void*      long_metrics;
-    void*      short_metrics;
-
-  } TT_HoriHeader;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_VertHeader                                                      */
-  /*                                                                       */
-  /* <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.                                                  */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    Version                 :: The table version.                      */
-  /*                                                                       */
-  /*    Ascender                :: The font's ascender, i.e., the distance */
-  /*                               from the baseline to the top-most of    */
-  /*                               all glyph points found in the font.     */
-  /*                                                                       */
-  /*                               This value is invalid in many fonts, as */
-  /*                               it is usually set by the font designer, */
-  /*                               and often reflects only a portion of    */
-  /*                               the glyphs found in the font (maybe     */
-  /*                               ASCII).                                 */
-  /*                                                                       */
-  /*                               You should use the `sTypoAscender'      */
-  /*                               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       */
-  /*                               bottom-most of all glyph points found   */
-  /*                               in the font.  It is negative.           */
-  /*                                                                       */
-  /*                               This value is invalid in many fonts, as */
-  /*                               it is usually set by the font designer, */
-  /*                               and often reflects only a portion of    */
-  /*                               the glyphs found in the font (maybe     */
-  /*                               ASCII).                                 */
-  /*                                                                       */
-  /*                               You should use the `sTypoDescender'     */
-  /*                               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 */
-  /*                               get the BTB, i.e., the                  */
-  /*                               baseline-to-baseline distance for the   */
-  /*                               font.                                   */
-  /*                                                                       */
-  /*    advance_Height_Max      :: This field is the maximum of all        */
-  /*                               advance heights found in the font.  It  */
-  /*                               can be used to compute the maximum      */
-  /*                               height of an arbitrary string of text.  */
-  /*                                                                       */
-  /*    min_Top_Side_Bearing    :: The minimum top side bearing of all     */
-  /*                               glyphs within the font.                 */
-  /*                                                                       */
-  /*    min_Bottom_Side_Bearing :: The minimum bottom side bearing of all  */
-  /*                               glyphs within the font.                 */
-  /*                                                                       */
-  /*    yMax_Extent             :: The maximum vertical extent (i.e., the  */
-  /*                               `height' of a glyph's bounding box) for */
-  /*                               all glyphs in the font.                 */
-  /*                                                                       */
-  /*    caret_Slope_Rise        :: The rise coefficient of the cursor's    */
-  /*                               slope of the cursor (slope=rise/run).   */
-  /*                                                                       */
-  /*    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.                               */
-  /*                                                                       */
-  /*    number_Of_HMetrics      :: 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.        */
-  /*                                                                       */
-  /*    short_metrics           :: A pointer into the `vmtx' table.        */
-  /*                                                                       */
-  /* <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: `Ascender',         */
-  /*    `Descender', `Line_Gap', `caret_Slope_Rise', `caret_Slope_Run',    */
-  /*    and `caret_Offset'.                                                */
-  /*                                                                       */
-  /*    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.                                                */
-  /*                                                                       */
-  typedef struct  TT_VertHeader_
-  {
-    FT_Fixed   Version;
-    FT_Short   Ascender;
-    FT_Short   Descender;
-    FT_Short   Line_Gap;
-
-    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   caret_Slope_Rise;
-    FT_Short   caret_Slope_Run;
-    FT_Short   caret_Offset;
-
-    FT_Short   Reserved[4];
-
-    FT_Short   metric_Data_Format;
-    FT_UShort  number_Of_VMetrics;
-
-    /* The following fields are not defined by the TrueType specification */
-    /* but they are used to connect the metrics header to the relevant    */
-    /* `hmtx' or `vmtx' table.                                            */
-
-    void*      long_metrics;
-    void*      short_metrics;
-
-  } TT_VertHeader;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_OS2                                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used 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. */
-  /*                                                                       */
-  /*    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'.                                               */
-
-  typedef struct  TT_OS2_
-  {
-    FT_UShort  version;                /* 0x0001 - more or 0xFFFF */
-    FT_Short   xAvgCharWidth;
-    FT_UShort  usWeightClass;
-    FT_UShort  usWidthClass;
-    FT_UShort  fsType;
-    FT_Short   ySubscriptXSize;
-    FT_Short   ySubscriptYSize;
-    FT_Short   ySubscriptXOffset;
-    FT_Short   ySubscriptYOffset;
-    FT_Short   ySuperscriptXSize;
-    FT_Short   ySuperscriptYSize;
-    FT_Short   ySuperscriptXOffset;
-    FT_Short   ySuperscriptYOffset;
-    FT_Short   yStrikeoutSize;
-    FT_Short   yStrikeoutPosition;
-    FT_Short   sFamilyClass;
-
-    FT_Byte    panose[10];
-
-    FT_ULong   ulUnicodeRange1;        /* Bits 0-31   */
-    FT_ULong   ulUnicodeRange2;        /* Bits 32-63  */
-    FT_ULong   ulUnicodeRange3;        /* Bits 64-95  */
-    FT_ULong   ulUnicodeRange4;        /* Bits 96-127 */
-
-    FT_Char    achVendID[4];
-
-    FT_UShort  fsSelection;
-    FT_UShort  usFirstCharIndex;
-    FT_UShort  usLastCharIndex;
-    FT_Short   sTypoAscender;
-    FT_Short   sTypoDescender;
-    FT_Short   sTypoLineGap;
-    FT_UShort  usWinAscent;
-    FT_UShort  usWinDescent;
-
-    /* only version 1 and higher: */
-
-    FT_ULong   ulCodePageRange1;       /* Bits 0-31   */
-    FT_ULong   ulCodePageRange2;       /* Bits 32-63  */
-
-    /* only version 2 and higher: */
-
-    FT_Short   sxHeight;
-    FT_Short   sCapHeight;
-    FT_UShort  usDefaultChar;
-    FT_UShort  usBreakChar;
-    FT_UShort  usMaxContext;
-
-    /* only version 5 and higher: */
-
-    FT_UShort  usLowerOpticalPointSize;       /* in twips (1/20th points) */
-    FT_UShort  usUpperOpticalPointSize;       /* in twips (1/20th points) */
-
-  } TT_OS2;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_Postscript                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType `post' 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.                                 */
-  /*                                                                       */
-  /* <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_
-  {
-    FT_Fixed  FormatType;
-    FT_Fixed  italicAngle;
-    FT_Short  underlinePosition;
-    FT_Short  underlineThickness;
-    FT_ULong  isFixedPitch;
-    FT_ULong  minMemType42;
-    FT_ULong  maxMemType42;
-    FT_ULong  minMemType1;
-    FT_ULong  maxMemType1;
-
-    /* Glyph names follow in the file, but we don't   */
-    /* load them by default.  See file `ttpost.c'.    */
-
-  } TT_Postscript;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_PCLT                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a TrueType `PCLT' table.  All fields     */
-  /*    comply to the TrueType specification.                              */
-  /*                                                                       */
-  typedef struct  TT_PCLT_
-  {
-    FT_Fixed   Version;
-    FT_ULong   FontNumber;
-    FT_UShort  Pitch;
-    FT_UShort  xHeight;
-    FT_UShort  Style;
-    FT_UShort  TypeFamily;
-    FT_UShort  CapHeight;
-    FT_UShort  SymbolSet;
-    FT_Char    TypeFace[16];
-    FT_Char    CharacterComplement[8];
-    FT_Char    FileName[6];
-    FT_Char    StrokeWeight;
-    FT_Char    WidthType;
-    FT_Byte    SerifStyle;
-    FT_Byte    Reserved;
-
-  } TT_PCLT;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_MaxProfile                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The maximum profile (`maxp') table contains many max values, which */
-  /*    can be used to pre-allocate arrays.  This ensures that no memory   */
-  /*    allocation occurs during a glyph load.                             */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    version               :: The version number.                       */
-  /*                                                                       */
-  /*    numGlyphs             :: The number of glyphs in this TrueType     */
-  /*                             font.                                     */
-  /*                                                                       */
-  /*    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'.            */
-  /*                                                                       */
-  /*    maxCompositeContours  :: The maximum number of contours in a       */
-  /*                             composite TrueType glyph.  See also the   */
-  /*                             structure element `maxContours'.          */
-  /*                                                                       */
-  /*    maxZones              :: The maximum number of zones used for      */
-  /*                             glyph hinting.                            */
-  /*                                                                       */
-  /*    maxTwilightPoints     :: The maximum number of points in the       */
-  /*                             twilight zone used for glyph hinting.     */
-  /*                                                                       */
-  /*    maxStorage            :: The maximum number of elements in the     */
-  /*                             storage area used for glyph hinting.      */
-  /*                                                                       */
-  /*    maxFunctionDefs       :: The maximum number of function            */
-  /*                             definitions in the TrueType bytecode for  */
-  /*                             this font.                                */
-  /*                                                                       */
-  /*    maxInstructionDefs    :: The maximum number of instruction         */
-  /*                             definitions in the TrueType bytecode for  */
-  /*                             this font.                                */
-  /*                                                                       */
-  /*    maxStackElements      :: The maximum number of stack elements used */
-  /*                             during bytecode interpretation.           */
-  /*                                                                       */
-  /*    maxSizeOfInstructions :: The maximum number of TrueType opcodes    */
-  /*                             used for glyph hinting.                   */
-  /*                                                                       */
-  /*    maxComponentElements  :: The maximum number of simple (i.e., non-  */
-  /*                             composite) glyphs in a composite glyph.   */
-  /*                                                                       */
-  /*    maxComponentDepth     :: The maximum nesting depth of composite    */
-  /*                             glyphs.                                   */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This structure is only used during font loading.                   */
-  /*                                                                       */
-  typedef struct  TT_MaxProfile_
-  {
-    FT_Fixed   version;
-    FT_UShort  numGlyphs;
-    FT_UShort  maxPoints;
-    FT_UShort  maxContours;
-    FT_UShort  maxCompositePoints;
-    FT_UShort  maxCompositeContours;
-    FT_UShort  maxZones;
-    FT_UShort  maxTwilightPoints;
-    FT_UShort  maxStorage;
-    FT_UShort  maxFunctionDefs;
-    FT_UShort  maxInstructionDefs;
-    FT_UShort  maxStackElements;
-    FT_UShort  maxSizeOfInstructions;
-    FT_UShort  maxComponentElements;
-    FT_UShort  maxComponentDepth;
-
-  } TT_MaxProfile;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Enum>                                                                */
-  /*    FT_Sfnt_Tag                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An enumeration used to specify the index of an SFNT table.         */
-  /*    Used in the @FT_Get_Sfnt_Table API function.                       */
-  /*                                                                       */
-  /* <Values>                                                              */
-  /*    FT_SFNT_HEAD :: To access the font's @TT_Header structure.         */
-  /*                                                                       */
-  /*    FT_SFNT_MAXP :: To access the font's @TT_MaxProfile structure.     */
-  /*                                                                       */
-  /*    FT_SFNT_OS2  :: To access the font's @TT_OS2 structure.            */
-  /*                                                                       */
-  /*    FT_SFNT_HHEA :: To access the font's @TT_HoriHeader structure.     */
-  /*                                                                       */
-  /*    FT_SFNT_VHEA :: To access the font's @TT_VertHeader structure.     */
-  /*                                                                       */
-  /*    FT_SFNT_POST :: To access the font's @TT_Postscript structure.     */
-  /*                                                                       */
-  /*    FT_SFNT_PCLT :: To access the font's @TT_PCLT structure.           */
-  /*                                                                       */
-  typedef enum  FT_Sfnt_Tag_
-  {
-    FT_SFNT_HEAD,
-    FT_SFNT_MAXP,
-    FT_SFNT_OS2,
-    FT_SFNT_HHEA,
-    FT_SFNT_VHEA,
-    FT_SFNT_POST,
-    FT_SFNT_PCLT,
-
-    FT_SFNT_MAX
-
-  } FT_Sfnt_Tag;
-
-  /* these constants are deprecated; use the corresponding `FT_Sfnt_Tag' */
-  /* values instead                                                      */
-#define ft_sfnt_head  FT_SFNT_HEAD
-#define ft_sfnt_maxp  FT_SFNT_MAXP
-#define ft_sfnt_os2   FT_SFNT_OS2
-#define ft_sfnt_hhea  FT_SFNT_HHEA
-#define ft_sfnt_vhea  FT_SFNT_VHEA
-#define ft_sfnt_post  FT_SFNT_POST
-#define ft_sfnt_pclt  FT_SFNT_PCLT
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_Sfnt_Table                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a pointer to a given SFNT table within a face.              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source.                                    */
-  /*                                                                       */
-  /*    tag  :: The index of the SFNT table.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A type-less pointer to the table.  This will be~0 in case of       */
-  /*    error, or if the corresponding table was not found *OR* loaded     */
-  /*    from the file.                                                     */
-  /*                                                                       */
-  /*    Use a typecast according to `tag' to access the structure          */
-  /*    elements.                                                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The table is owned by the face object and disappears with it.      */
-  /*                                                                       */
-  /*    This function is only useful to access SFNT tables that are loaded */
-  /*    by the sfnt, truetype, and opentype drivers.  See @FT_Sfnt_Tag for */
-  /*    a list.                                                            */
-  /*                                                                       */
-  /*    Here an example how to access the `vhea' table:                    */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      TT_VertHeader*  vert_header;                                     */
-  /*                                                                       */
-  /*                                                                       */
-  /*      vert_header =                                                    */
-  /*        (TT_VertHeader*)FT_Get_Sfnt_Table( face, FT_SFNT_VHEA );       */
-  /*    }                                                                  */
-  /*                                                                       */
-  FT_EXPORT( void* )
-  FT_Get_Sfnt_Table( FT_Face      face,
-                     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).
-  *
-  */
-  FT_EXPORT( FT_Error )
-  FT_Load_Sfnt_Table( FT_Face    face,
-                      FT_ULong   tag,
-                      FT_Long    offset,
-                      FT_Byte*   buffer,
-                      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.
-  *
-  */
-  FT_EXPORT( FT_Error )
-  FT_Sfnt_Table_Info( FT_Face    face,
-                      FT_UInt    table_index,
-                      FT_ULong  *tag,
-                      FT_ULong  *length );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_CMap_Language_ID                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return TrueType/sfnt specific cmap language ID.  Definitions of    */
-  /*    language ID values are in `ttnameid.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.            */
-  /*                                                                       */
-  /*    For a format~14 cmap (to access Unicode IVS), the return value is  */
-  /*    0xFFFFFFFF.                                                        */
-  /*                                                                       */
-  FT_EXPORT( FT_ULong )
-  FT_Get_CMap_Language_ID( FT_CharMap  charmap );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Get_CMap_Format                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return TrueType/sfnt specific cmap format.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    charmap ::                                                         */
-  /*      The target charmap.                                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The format of `charmap'.  If `charmap' doesn't belong to a         */
-  /*    TrueType/sfnt face, return -1.                                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Long )
-  FT_Get_CMap_Format( FT_CharMap  charmap );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* TTTABLES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/tttags.h b/third_party/freetype/include/freetype/tttags.h
deleted file mode 100644
index 32eb2fd..0000000
--- a/third_party/freetype/include/freetype/tttags.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  tttags.h                                                               */
-/*                                                                         */
-/*    Tags for TrueType and OpenType tables (specification only).          */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTAGS_H_
-#define TTAGS_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
-
-
-#define TTAG_avar  FT_MAKE_TAG( 'a', 'v', 'a', 'r' )
-#define TTAG_BASE  FT_MAKE_TAG( 'B', 'A', 'S', 'E' )
-#define TTAG_bdat  FT_MAKE_TAG( 'b', 'd', 'a', 't' )
-#define TTAG_BDF   FT_MAKE_TAG( 'B', 'D', 'F', ' ' )
-#define TTAG_bhed  FT_MAKE_TAG( 'b', 'h', 'e', 'd' )
-#define TTAG_bloc  FT_MAKE_TAG( 'b', 'l', 'o', 'c' )
-#define TTAG_bsln  FT_MAKE_TAG( 'b', 's', 'l', 'n' )
-#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' )
-#define TTAG_cvt   FT_MAKE_TAG( 'c', 'v', 't', ' ' )
-#define TTAG_DSIG  FT_MAKE_TAG( 'D', 'S', 'I', 'G' )
-#define TTAG_EBDT  FT_MAKE_TAG( 'E', 'B', 'D', 'T' )
-#define TTAG_EBLC  FT_MAKE_TAG( 'E', 'B', 'L', 'C' )
-#define TTAG_EBSC  FT_MAKE_TAG( 'E', 'B', 'S', 'C' )
-#define TTAG_feat  FT_MAKE_TAG( 'f', 'e', 'a', 't' )
-#define TTAG_FOND  FT_MAKE_TAG( 'F', 'O', 'N', 'D' )
-#define TTAG_fpgm  FT_MAKE_TAG( 'f', 'p', 'g', 'm' )
-#define TTAG_fvar  FT_MAKE_TAG( 'f', 'v', 'a', 'r' )
-#define TTAG_gasp  FT_MAKE_TAG( 'g', 'a', 's', 'p' )
-#define TTAG_GDEF  FT_MAKE_TAG( 'G', 'D', 'E', 'F' )
-#define TTAG_glyf  FT_MAKE_TAG( 'g', 'l', 'y', 'f' )
-#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' )
-#define TTAG_hmtx  FT_MAKE_TAG( 'h', 'm', 't', 'x' )
-#define TTAG_JSTF  FT_MAKE_TAG( 'J', 'S', 'T', 'F' )
-#define TTAG_just  FT_MAKE_TAG( 'j', 'u', 's', 't' )
-#define TTAG_kern  FT_MAKE_TAG( 'k', 'e', 'r', 'n' )
-#define TTAG_lcar  FT_MAKE_TAG( 'l', 'c', 'a', 'r' )
-#define TTAG_loca  FT_MAKE_TAG( 'l', 'o', 'c', 'a' )
-#define TTAG_LTSH  FT_MAKE_TAG( 'L', 'T', 'S', 'H' )
-#define TTAG_LWFN  FT_MAKE_TAG( 'L', 'W', 'F', 'N' )
-#define TTAG_MATH  FT_MAKE_TAG( 'M', 'A', 'T', 'H' )
-#define TTAG_maxp  FT_MAKE_TAG( 'm', 'a', 'x', 'p' )
-#define TTAG_META  FT_MAKE_TAG( 'M', 'E', 'T', 'A' )
-#define TTAG_MMFX  FT_MAKE_TAG( 'M', 'M', 'F', 'X' )
-#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' )
-#define TTAG_OTTO  FT_MAKE_TAG( 'O', 'T', 'T', 'O' )
-#define TTAG_PCLT  FT_MAKE_TAG( 'P', 'C', 'L', 'T' )
-#define TTAG_POST  FT_MAKE_TAG( 'P', 'O', 'S', 'T' )
-#define TTAG_post  FT_MAKE_TAG( 'p', 'o', 's', 't' )
-#define TTAG_prep  FT_MAKE_TAG( 'p', 'r', 'e', 'p' )
-#define TTAG_prop  FT_MAKE_TAG( 'p', 'r', 'o', 'p' )
-#define TTAG_sbix  FT_MAKE_TAG( 's', 'b', 'i', 'x' )
-#define TTAG_sfnt  FT_MAKE_TAG( 's', 'f', 'n', 't' )
-#define TTAG_SING  FT_MAKE_TAG( 'S', 'I', 'N', 'G' )
-#define TTAG_trak  FT_MAKE_TAG( 't', 'r', 'a', 'k' )
-#define TTAG_true  FT_MAKE_TAG( 't', 'r', 'u', 'e' )
-#define TTAG_ttc   FT_MAKE_TAG( 't', 't', 'c', ' ' )
-#define TTAG_ttcf  FT_MAKE_TAG( 't', 't', 'c', 'f' )
-#define TTAG_TYP1  FT_MAKE_TAG( 'T', 'Y', 'P', '1' )
-#define TTAG_typ1  FT_MAKE_TAG( 't', 'y', 'p', '1' )
-#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' )
-
-
-FT_END_HEADER
-
-#endif /* TTAGS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/ft2build.h b/third_party/freetype/include/ft2build.h
deleted file mode 100644
index e7d808f..0000000
--- a/third_party/freetype/include/ft2build.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ft2build.h                                                             */
-/*                                                                         */
-/*    FreeType 2 build and setup macros.                                   */
-/*                                                                         */
-/*  Copyright 1996-2017 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 is the `entry point' for FreeType header file inclusions.  It is */
-  /* the only header file which should be included directly; all other     */
-  /* FreeType header files should be accessed with macro names (after      */
-  /* including `ft2build.h').                                              */
-  /*                                                                       */
-  /* A typical example is                                                  */
-  /*                                                                       */
-  /*   #include <ft2build.h>                                               */
-  /*   #include FT_FREETYPE_H                                              */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef FT2BUILD_H_
-#define FT2BUILD_H_
-
-#include <freetype/config/ftheader.h>
-
-#endif /* FT2BUILD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/basepic.c b/third_party/freetype/src/base/basepic.c
deleted file mode 100644
index 57fb816..0000000
--- a/third_party/freetype/src/base/basepic.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  basepic.c                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for base.            */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "basepic.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from ftglyph.c */
-  void
-  FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class*  clazz );
-
-  void
-  FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class*  clazz );
-
-#ifdef FT_CONFIG_OPTION_MAC_FONTS
-  /* forward declaration of PIC init function from ftrfork.c */
-  /* (not modularized)                                       */
-  void
-  FT_Init_Table_ft_raccess_guess_table( ft_raccess_guess_rec*  record );
-#endif
-
-  /* forward declaration of PIC init functions from ftinit.c */
-  FT_Error
-  ft_create_default_module_classes( FT_Library  library );
-
-  void
-  ft_destroy_default_module_classes( FT_Library  library );
-
-
-  void
-  ft_base_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->base )
-    {
-      /* destroy default module classes            */
-      /* (in case FT_Add_Default_Modules was used) */
-      ft_destroy_default_module_classes( library );
-
-      FT_FREE( pic_container->base );
-      pic_container->base = NULL;
-    }
-  }
-
-
-  FT_Error
-  ft_base_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    BasePIC*           container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->base = container;
-
-    /* initialize default modules list and pointers */
-    error = ft_create_default_module_classes( library );
-    if ( error )
-      goto Exit;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    FT_Init_Class_ft_outline_glyph_class(
-      &container->ft_outline_glyph_class );
-    FT_Init_Class_ft_bitmap_glyph_class(
-      &container->ft_bitmap_glyph_class );
-#ifdef FT_CONFIG_OPTION_MAC_FONTS
-    FT_Init_Table_ft_raccess_guess_table(
-      (ft_raccess_guess_rec*)&container->ft_raccess_guess_table );
-#endif
-
-  Exit:
-    if ( error )
-      ft_base_pic_free( library );
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/basepic.h b/third_party/freetype/src/base/basepic.h
deleted file mode 100644
index 258d4ce..0000000
--- a/third_party/freetype/src/base/basepic.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  basepic.h                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for base.            */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 BASEPIC_H_
-#define BASEPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_OUTLINE_GLYPH_CLASS_GET  &ft_outline_glyph_class
-#define FT_BITMAP_GLYPH_CLASS_GET   &ft_bitmap_glyph_class
-#define FT_DEFAULT_MODULES_GET      ft_default_modules
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-#define FT_RACCESS_GUESS_TABLE_GET  ft_raccess_guess_table
-#endif
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#include FT_GLYPH_H
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-#include FT_INTERNAL_RFORK_H
-#endif
-
-
-FT_BEGIN_HEADER
-
-  typedef struct  BasePIC_
-  {
-    FT_Module_Class**  default_module_classes;
-    FT_Glyph_Class     ft_outline_glyph_class;
-    FT_Glyph_Class     ft_bitmap_glyph_class;
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-    ft_raccess_guess_rec  ft_raccess_guess_table[FT_RACCESS_N_RULES];
-#endif
-
-  } BasePIC;
-
-
-#define GET_PIC( lib )  ( (BasePIC*)( (lib)->pic_container.base ) )
-
-#define FT_OUTLINE_GLYPH_CLASS_GET                      \
-          ( &GET_PIC( library )->ft_outline_glyph_class )
-#define FT_BITMAP_GLYPH_CLASS_GET                        \
-          ( &GET_PIC( library )->ft_bitmap_glyph_class )
-#define FT_DEFAULT_MODULES_GET                           \
-          ( GET_PIC( library )->default_module_classes )
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-#define FT_RACCESS_GUESS_TABLE_GET                       \
-          ( GET_PIC( library )->ft_raccess_guess_table )
-#endif
-
-
-  /* see basepic.c for the implementation */
-  void
-  ft_base_pic_free( FT_Library  library );
-
-  FT_Error
-  ft_base_pic_init( FT_Library  library );
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-#endif /* BASEPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftadvanc.c b/third_party/freetype/src/base/ftadvanc.c
deleted file mode 100644
index 1557607..0000000
--- a/third_party/freetype/src/base/ftadvanc.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftadvanc.c                                                             */
-/*                                                                         */
-/*    Quick computation of advance widths (body).                          */
-/*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_ADVANCES_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-  static FT_Error
-  _ft_face_scale_advances( FT_Face    face,
-                           FT_Fixed*  advances,
-                           FT_UInt    count,
-                           FT_Int32   flags )
-  {
-    FT_Fixed  scale;
-    FT_UInt   nn;
-
-
-    if ( flags & FT_LOAD_NO_SCALE )
-      return FT_Err_Ok;
-
-    if ( !face->size )
-      return FT_THROW( Invalid_Size_Handle );
-
-    if ( flags & FT_LOAD_VERTICAL_LAYOUT )
-      scale = face->size->metrics.y_scale;
-    else
-      scale = face->size->metrics.x_scale;
-
-    /* this must be the same scaling as to get linear{Hori,Vert}Advance */
-    /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c)        */
-
-    for ( nn = 0; nn < count; nn++ )
-      advances[nn] = FT_MulDiv( advances[nn], scale, 64 );
-
-    return FT_Err_Ok;
-  }
-
-
-   /* at the moment, we can perform fast advance retrieval only in */
-   /* the following cases:                                         */
-   /*                                                              */
-   /*  - 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( face, flags )                      \
-          ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING )    || \
-            FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT )
-
-
-  /* documentation is in ftadvanc.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Advance( FT_Face    face,
-                  FT_UInt    gindex,
-                  FT_Int32   flags,
-                  FT_Fixed  *padvance )
-  {
-    FT_Face_GetAdvancesFunc  func;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !padvance )
-      return FT_THROW( Invalid_Argument );
-
-    if ( gindex >= (FT_UInt)face->num_glyphs )
-      return FT_THROW( Invalid_Glyph_Index );
-
-    func = face->driver->clazz->get_advances;
-    if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
-    {
-      FT_Error  error;
-
-
-      error = func( face, gindex, 1, flags, padvance );
-      if ( !error )
-        return _ft_face_scale_advances( face, padvance, 1, flags );
-
-      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
-        return error;
-    }
-
-    return FT_Get_Advances( face, gindex, 1, flags, padvance );
-  }
-
-
-  /* documentation is in ftadvanc.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Advances( FT_Face    face,
-                   FT_UInt    start,
-                   FT_UInt    count,
-                   FT_Int32   flags,
-                   FT_Fixed  *padvances )
-  {
-    FT_Face_GetAdvancesFunc  func;
-    FT_UInt                  num, end, nn;
-    FT_Error                 error = FT_Err_Ok;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !padvances )
-      return FT_THROW( Invalid_Argument );
-
-    num = (FT_UInt)face->num_glyphs;
-    end = start + count;
-    if ( start >= num || end < start || end > num )
-      return FT_THROW( Invalid_Glyph_Index );
-
-    if ( count == 0 )
-      return FT_Err_Ok;
-
-    func = face->driver->clazz->get_advances;
-    if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) )
-    {
-      error = func( face, start, count, flags, padvances );
-      if ( !error )
-        return _ft_face_scale_advances( face, padvances, count, flags );
-
-      if ( FT_ERR_NEQ( error, Unimplemented_Feature ) )
-        return error;
-    }
-
-    error = FT_Err_Ok;
-
-    if ( flags & FT_ADVANCE_FLAG_FAST_ONLY )
-      return FT_THROW( Unimplemented_Feature );
-
-    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
-    for ( nn = 0; nn < count; nn++ )
-    {
-      error = FT_Load_Glyph( face, start + nn, flags );
-      if ( error )
-        break;
-
-      /* scale from 26.6 to 16.16 */
-      padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                      ? face->glyph->advance.y * 1024
-                      : face->glyph->advance.x * 1024;
-    }
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftbase.c b/third_party/freetype/src/base/ftbase.c
deleted file mode 100644
index 993ac72..0000000
--- a/third_party/freetype/src/base/ftbase.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbase.c                                                               */
-/*                                                                         */
-/*    Single object library component (body only).                         */
-/*                                                                         */
-/*  Copyright 1996-2017 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>
-
-#define  FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include "ftpic.c"
-#include "basepic.c"
-#include "ftadvanc.c"
-#include "ftcalc.c"
-#include "ftdbgmem.c"
-#include "ftgloadr.c"
-#include "fthash.c"
-#include "ftobjs.c"
-#include "ftoutln.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/third_party/freetype/src/base/ftbase.h b/third_party/freetype/src/base/ftbase.h
deleted file mode 100644
index 2072284..0000000
--- a/third_party/freetype/src/base/ftbase.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbase.h                                                               */
-/*                                                                         */
-/*    The FreeType private functions used in base module (specification).  */
-/*                                                                         */
-/*  Copyright 2008-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya.      */
-/*                                                                         */
-/*  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 FTBASE_H_
-#define FTBASE_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* 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 )
-  open_face_PS_from_sfnt_stream( FT_Library     library,
-                                 FT_Stream      stream,
-                                 FT_Long        face_index,
-                                 FT_Int         num_params,
-                                 FT_Parameter  *params,
-                                 FT_Face       *aface );
-
-
-  /* Create a new FT_Face given a buffer and a driver name. */
-  /* From ftmac.c.                                          */
-  FT_LOCAL( FT_Error )
-  open_face_from_buffer( FT_Library   library,
-                         FT_Byte*     base,
-                         FT_ULong     size,
-                         FT_Long      face_index,
-                         const char*  driver_name,
-                         FT_Face     *aface );
-
-
-#if  defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \
-    !defined( FT_MACINTOSH )
-  /* Mac OS X/Darwin kernel often changes recommended method to access */
-  /* the resource fork and older methods makes the kernel issue the    */
-  /* warning of deprecated method.  To calm it down, the methods based */
-  /* on Darwin VFS should be grouped and skip the rest methods after   */
-  /* the case the resource is opened but found to lack a font in it.   */
-  FT_LOCAL( FT_Bool )
-  ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt  rule_index );
-#endif
-
-
-FT_END_HEADER
-
-#endif /* FTBASE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftbitmap.c b/third_party/freetype/src/base/ftbitmap.c
deleted file mode 100644
index 88c88c4..0000000
--- a/third_party/freetype/src/base/ftbitmap.c
+++ /dev/null
@@ -1,809 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbitmap.c                                                             */
-/*                                                                         */
-/*    FreeType utility functions for bitmaps (body).                       */
-/*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_BITMAP_H
-#include FT_IMAGE_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-  static
-  const FT_Bitmap  null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 };
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Bitmap_Init( FT_Bitmap  *abitmap )
-  {
-    if ( abitmap )
-      *abitmap = null_bitmap;
-  }
-
-
-  /* deprecated function name; retained for ABI compatibility */
-
-  FT_EXPORT_DEF( void )
-  FT_Bitmap_New( FT_Bitmap  *abitmap )
-  {
-    if ( abitmap )
-      *abitmap = null_bitmap;
-  }
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Bitmap_Copy( FT_Library        library,
-                  const FT_Bitmap  *source,
-                  FT_Bitmap        *target)
-  {
-    FT_Memory  memory;
-    FT_Error   error  = FT_Err_Ok;
-
-    FT_Int    pitch;
-    FT_ULong  size;
-
-    FT_Int  source_pitch_sign, target_pitch_sign;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !source || !target )
-      return FT_THROW( Invalid_Argument );
-
-    if ( source == target )
-      return FT_Err_Ok;
-
-    source_pitch_sign = source->pitch < 0 ? -1 : 1;
-    target_pitch_sign = target->pitch < 0 ? -1 : 1;
-
-    if ( !source->buffer )
-    {
-      *target = *source;
-      if ( source_pitch_sign != target_pitch_sign )
-        target->pitch = -target->pitch;
-
-      return FT_Err_Ok;
-    }
-
-    memory = library->memory;
-    pitch  = source->pitch;
-
-    if ( pitch < 0 )
-      pitch = -pitch;
-    size = (FT_ULong)pitch * source->rows;
-
-    if ( target->buffer )
-    {
-      FT_Int    target_pitch = target->pitch;
-      FT_ULong  target_size;
-
-
-      if ( target_pitch < 0 )
-        target_pitch = -target_pitch;
-      target_size = (FT_ULong)target_pitch * target->rows;
-
-      if ( target_size != size )
-        (void)FT_QREALLOC( target->buffer, target_size, size );
-    }
-    else
-      (void)FT_QALLOC( target->buffer, size );
-
-    if ( !error )
-    {
-      unsigned char *p;
-
-
-      p = target->buffer;
-      *target = *source;
-      target->buffer = p;
-
-      if ( source_pitch_sign == target_pitch_sign )
-        FT_MEM_COPY( target->buffer, source->buffer, size );
-      else
-      {
-        /* take care of bitmap flow */
-        FT_UInt   i;
-        FT_Byte*  s = source->buffer;
-        FT_Byte*  t = target->buffer;
-
-
-        t += (FT_ULong)pitch * ( target->rows - 1 );
-
-        for ( i = target->rows; i > 0; i-- )
-        {
-          FT_ARRAY_COPY( t, s, pitch );
-
-          s += pitch;
-          t -= pitch;
-        }
-      }
-    }
-
-    return error;
-  }
-
-
-  /* Enlarge `bitmap' horizontally and vertically by `xpixels' */
-  /* and `ypixels', respectively.                              */
-
-  static FT_Error
-  ft_bitmap_assure_buffer( FT_Memory   memory,
-                           FT_Bitmap*  bitmap,
-                           FT_UInt     xpixels,
-                           FT_UInt     ypixels )
-  {
-    FT_Error        error;
-    int             pitch;
-    int             new_pitch;
-    FT_UInt         bpp;
-    FT_UInt         i, width, height;
-    unsigned char*  buffer = NULL;
-
-
-    width  = bitmap->width;
-    height = bitmap->rows;
-    pitch  = bitmap->pitch;
-    if ( pitch < 0 )
-      pitch = -pitch;
-
-    switch ( bitmap->pixel_mode )
-    {
-    case FT_PIXEL_MODE_MONO:
-      bpp       = 1;
-      new_pitch = (int)( ( width + xpixels + 7 ) >> 3 );
-      break;
-    case FT_PIXEL_MODE_GRAY2:
-      bpp       = 2;
-      new_pitch = (int)( ( width + xpixels + 3 ) >> 2 );
-      break;
-    case FT_PIXEL_MODE_GRAY4:
-      bpp       = 4;
-      new_pitch = (int)( ( 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 );
-      break;
-    default:
-      return FT_THROW( Invalid_Glyph_Format );
-    }
-
-    /* if no need to allocate memory */
-    if ( ypixels == 0 && new_pitch <= pitch )
-    {
-      /* zero the padding */
-      FT_UInt  bit_width = (FT_UInt)pitch * 8;
-      FT_UInt  bit_last  = ( width + xpixels ) * bpp;
-
-
-      if ( bit_last < bit_width )
-      {
-        FT_Byte*  line  = bitmap->buffer + ( bit_last >> 3 );
-        FT_Byte*  end   = bitmap->buffer + pitch;
-        FT_UInt   shift = bit_last & 7;
-        FT_UInt   mask  = 0xFF00U >> shift;
-        FT_UInt   count = height;
-
-
-        for ( ; count > 0; count--, line += pitch, end += pitch )
-        {
-          FT_Byte*  write = line;
-
-
-          if ( shift > 0 )
-          {
-            write[0] = (FT_Byte)( write[0] & mask );
-            write++;
-          }
-          if ( write < end )
-            FT_MEM_ZERO( write, end - write );
-        }
-      }
-
-      return FT_Err_Ok;
-    }
-
-    /* otherwise allocate new buffer */
-    if ( FT_QALLOC_MULT( buffer, new_pitch, bitmap->rows + ypixels ) )
-      return error;
-
-    /* new rows get added at the top of the bitmap, */
-    /* thus take care of the flow direction         */
-    if ( bitmap->pitch > 0 )
-    {
-      FT_UInt  len = ( width * bpp + 7 ) >> 3;
-
-
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * ( ypixels + i ),
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
-    }
-    else
-    {
-      FT_UInt  len = ( width * bpp + 7 ) >> 3;
-
-
-      for ( i = 0; i < bitmap->rows; i++ )
-        FT_MEM_COPY( buffer + (FT_UInt)new_pitch * i,
-                     bitmap->buffer + (FT_UInt)pitch * i,
-                     len );
-    }
-
-    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;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Bitmap_Embolden( FT_Library  library,
-                      FT_Bitmap*  bitmap,
-                      FT_Pos      xStrength,
-                      FT_Pos      yStrength )
-  {
-    FT_Error        error;
-    unsigned char*  p;
-    FT_Int          i, x, pitch;
-    FT_UInt         y;
-    FT_Int          xstr, ystr;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !bitmap || !bitmap->buffer )
-      return FT_THROW( Invalid_Argument );
-
-    if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) ||
-         ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) )
-      return FT_THROW( Invalid_Argument );
-
-    xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6;
-    ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6;
-
-    if ( xstr == 0 && ystr == 0 )
-      return FT_Err_Ok;
-    else if ( xstr < 0 || ystr < 0 )
-      return FT_THROW( Invalid_Argument );
-
-    switch ( bitmap->pixel_mode )
-    {
-    case FT_PIXEL_MODE_GRAY2:
-    case FT_PIXEL_MODE_GRAY4:
-      {
-        FT_Bitmap  tmp;
-
-
-        /* convert to 8bpp */
-        FT_Bitmap_Init( &tmp );
-        error = FT_Bitmap_Convert( library, bitmap, &tmp, 1 );
-        if ( error )
-          return error;
-
-        FT_Bitmap_Done( library, bitmap );
-        *bitmap = tmp;
-      }
-      break;
-
-    case FT_PIXEL_MODE_MONO:
-      if ( xstr > 8 )
-        xstr = 8;
-      break;
-
-    case FT_PIXEL_MODE_LCD:
-      xstr *= 3;
-      break;
-
-    case FT_PIXEL_MODE_LCD_V:
-      ystr *= 3;
-      break;
-
-    case FT_PIXEL_MODE_BGRA:
-      /* We don't embolden color glyphs. */
-      return FT_Err_Ok;
-    }
-
-    error = ft_bitmap_assure_buffer( library->memory, bitmap,
-                                     (FT_UInt)xstr, (FT_UInt)ystr );
-    if ( error )
-      return error;
-
-    /* take care of bitmap flow */
-    pitch = bitmap->pitch;
-    if ( pitch > 0 )
-      p = bitmap->buffer + pitch * ystr;
-    else
-    {
-      pitch = -pitch;
-      p = bitmap->buffer + (FT_UInt)pitch * ( bitmap->rows - 1 );
-    }
-
-    /* for each row */
-    for ( y = 0; y < bitmap->rows; y++ )
-    {
-      /*
-       * Horizontally:
-       *
-       * From the last pixel on, make each pixel or'ed with the
-       * `xstr' pixels before it.
-       */
-      for ( x = pitch - 1; x >= 0; x-- )
-      {
-        unsigned char  tmp;
-
-
-        tmp = p[x];
-        for ( i = 1; i <= xstr; i++ )
-        {
-          if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO )
-          {
-            p[x] |= tmp >> i;
-
-            /* the maximum value of 8 for `xstr' comes from here */
-            if ( x > 0 )
-              p[x] |= p[x - 1] << ( 8 - i );
-
-#if 0
-            if ( p[x] == 0xFF )
-              break;
-#endif
-          }
-          else
-          {
-            if ( x - i >= 0 )
-            {
-              if ( p[x] + p[x - i] > bitmap->num_grays - 1 )
-              {
-                p[x] = (unsigned char)( bitmap->num_grays - 1 );
-                break;
-              }
-              else
-              {
-                p[x] = (unsigned char)( p[x] + p[x - i] );
-                if ( p[x] == bitmap->num_grays - 1 )
-                  break;
-              }
-            }
-            else
-              break;
-          }
-        }
-      }
-
-      /*
-       * Vertically:
-       *
-       * Make the above `ystr' rows or'ed with it.
-       */
-      for ( x = 1; x <= ystr; x++ )
-      {
-        unsigned char*  q;
-
-
-        q = p - bitmap->pitch * x;
-        for ( i = 0; i < pitch; i++ )
-          q[i] |= p[i];
-      }
-
-      p += bitmap->pitch;
-    }
-
-    bitmap->width += (FT_UInt)xstr;
-    bitmap->rows += (FT_UInt)ystr;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Byte
-  ft_gray_for_premultiplied_srgb_bgra( const FT_Byte*  bgra )
-  {
-    FT_UInt  a = bgra[3];
-    FT_UInt  l;
-
-
-    /* Short-circuit transparent color to avoid division by zero. */
-    if ( !a )
-      return 0;
-
-    /*
-     * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722
-     * coefficients for RGB channels *on the linear colors*.
-     * 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
-     *
-     * We do the computation with integers only, applying a gamma of 2.0.
-     * We guarantee 32-bit arithmetic to avoid overflow but the resulting
-     * luminosity fits into 16 bits.
-     *
-     */
-
-    l = (  4732UL /* 0.0722 * 65536 */ * bgra[0] * bgra[0] +
-          46871UL /* 0.7152 * 65536 */ * bgra[1] * bgra[1] +
-          13933UL /* 0.2126 * 65536 */ * bgra[2] * bgra[2] ) >> 16;
-
-    /*
-     * Final transparency can be determined as follows.
-     *
-     * - If alpha is zero, we want 0.
-     * - If alpha is zero and luminosity is zero, we want 255.
-     * - If alpha is zero and luminosity is one, we want 0.
-     *
-     * So the formula is a * (1 - l) = a - l * a.
-     *
-     * We still need to undo premultiplication by dividing l by a*a.
-     *
-     */
-
-    return (FT_Byte)( a - l / a );
-  }
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Bitmap_Convert( FT_Library        library,
-                     const FT_Bitmap  *source,
-                     FT_Bitmap        *target,
-                     FT_Int            alignment )
-  {
-    FT_Error   error = FT_Err_Ok;
-    FT_Memory  memory;
-
-    FT_Byte*  s;
-    FT_Byte*  t;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !source || !target )
-      return FT_THROW( Invalid_Argument );
-
-    memory = library->memory;
-
-    switch ( source->pixel_mode )
-    {
-    case FT_PIXEL_MODE_MONO:
-    case FT_PIXEL_MODE_GRAY:
-    case FT_PIXEL_MODE_GRAY2:
-    case FT_PIXEL_MODE_GRAY4:
-    case FT_PIXEL_MODE_LCD:
-    case FT_PIXEL_MODE_LCD_V:
-    case FT_PIXEL_MODE_BGRA:
-      {
-        FT_Int    pad, old_target_pitch, target_pitch;
-        FT_ULong  old_size;
-
-
-        old_target_pitch = target->pitch;
-        if ( old_target_pitch < 0 )
-          old_target_pitch = -old_target_pitch;
-
-        old_size = target->rows * (FT_UInt)old_target_pitch;
-
-        target->pixel_mode = FT_PIXEL_MODE_GRAY;
-        target->rows       = source->rows;
-        target->width      = source->width;
-
-        pad = 0;
-        if ( alignment > 0 )
-        {
-          pad = (FT_Int)source->width % alignment;
-          if ( pad != 0 )
-            pad = alignment - pad;
-        }
-
-        target_pitch = (FT_Int)source->width + pad;
-
-        if ( target_pitch > 0                                               &&
-             (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,
-                          old_size, target->rows * (FT_UInt)target_pitch ) )
-          return error;
-
-        target->pitch = target->pitch < 0 ? -target_pitch : target_pitch;
-      }
-      break;
-
-    default:
-      error = FT_THROW( Invalid_Argument );
-    }
-
-    s = source->buffer;
-    t = target->buffer;
-
-    /* take care of bitmap flow */
-    if ( source->pitch < 0 )
-      s -= source->pitch * (FT_Int)( source->rows - 1 );
-    if ( target->pitch < 0 )
-      t -= target->pitch * (FT_Int)( target->rows - 1 );
-
-    switch ( source->pixel_mode )
-    {
-    case FT_PIXEL_MODE_MONO:
-      {
-        FT_UInt  i;
-
-
-        target->num_grays = 2;
-
-        for ( i = source->rows; i > 0; i-- )
-        {
-          FT_Byte*  ss = s;
-          FT_Byte*  tt = t;
-          FT_UInt   j;
-
-
-          /* get the full bytes */
-          for ( j = source->width >> 3; j > 0; j-- )
-          {
-            FT_Int  val = ss[0]; /* avoid a byte->int cast on each line */
-
-
-            tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 );
-            tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 );
-            tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 );
-            tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 );
-            tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 );
-            tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 );
-            tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 );
-            tt[7] = (FT_Byte)(   val & 0x01 );
-
-            tt += 8;
-            ss += 1;
-          }
-
-          /* get remaining pixels (if any) */
-          j = source->width & 7;
-          if ( j > 0 )
-          {
-            FT_Int  val = *ss;
-
-
-            for ( ; j > 0; j-- )
-            {
-              tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7);
-              val <<= 1;
-              tt   += 1;
-            }
-          }
-
-          s += source->pitch;
-          t += target->pitch;
-        }
-      }
-      break;
-
-
-    case FT_PIXEL_MODE_GRAY:
-    case FT_PIXEL_MODE_LCD:
-    case FT_PIXEL_MODE_LCD_V:
-      {
-        FT_UInt  width = source->width;
-        FT_UInt  i;
-
-
-        target->num_grays = 256;
-
-        for ( i = source->rows; i > 0; i-- )
-        {
-          FT_ARRAY_COPY( t, s, width );
-
-          s += source->pitch;
-          t += target->pitch;
-        }
-      }
-      break;
-
-
-    case FT_PIXEL_MODE_GRAY2:
-      {
-        FT_UInt  i;
-
-
-        target->num_grays = 4;
-
-        for ( i = source->rows; i > 0; i-- )
-        {
-          FT_Byte*  ss = s;
-          FT_Byte*  tt = t;
-          FT_UInt   j;
-
-
-          /* get the full bytes */
-          for ( j = source->width >> 2; j > 0; j-- )
-          {
-            FT_Int  val = ss[0];
-
-
-            tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 );
-            tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 );
-            tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 );
-            tt[3] = (FT_Byte)( ( val & 0x03 ) );
-
-            ss += 1;
-            tt += 4;
-          }
-
-          j = source->width & 3;
-          if ( j > 0 )
-          {
-            FT_Int  val = ss[0];
-
-
-            for ( ; j > 0; j-- )
-            {
-              tt[0]  = (FT_Byte)( ( val & 0xC0 ) >> 6 );
-              val  <<= 2;
-              tt    += 1;
-            }
-          }
-
-          s += source->pitch;
-          t += target->pitch;
-        }
-      }
-      break;
-
-
-    case FT_PIXEL_MODE_GRAY4:
-      {
-        FT_UInt  i;
-
-
-        target->num_grays = 16;
-
-        for ( i = source->rows; i > 0; i-- )
-        {
-          FT_Byte*  ss = s;
-          FT_Byte*  tt = t;
-          FT_UInt   j;
-
-
-          /* get the full bytes */
-          for ( j = source->width >> 1; j > 0; j-- )
-          {
-            FT_Int  val = ss[0];
-
-
-            tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 );
-            tt[1] = (FT_Byte)( ( val & 0x0F ) );
-
-            ss += 1;
-            tt += 2;
-          }
-
-          if ( source->width & 1 )
-            tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 );
-
-          s += source->pitch;
-          t += target->pitch;
-        }
-      }
-      break;
-
-
-    case FT_PIXEL_MODE_BGRA:
-      {
-        FT_UInt  i;
-
-
-        target->num_grays = 256;
-
-        for ( i = source->rows; i > 0; i-- )
-        {
-          FT_Byte*  ss = s;
-          FT_Byte*  tt = t;
-          FT_UInt   j;
-
-
-          for ( j = source->width; j > 0; j-- )
-          {
-            tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss );
-
-            ss += 4;
-            tt += 1;
-          }
-
-          s += source->pitch;
-          t += target->pitch;
-        }
-      }
-      break;
-
-    default:
-      ;
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot  slot )
-  {
-    if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP   &&
-         !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
-    {
-      FT_Bitmap  bitmap;
-      FT_Error   error;
-
-
-      FT_Bitmap_Init( &bitmap );
-      error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap );
-      if ( error )
-        return error;
-
-      slot->bitmap = bitmap;
-      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftbitmap.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Bitmap_Done( FT_Library  library,
-                  FT_Bitmap  *bitmap )
-  {
-    FT_Memory  memory;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !bitmap )
-      return FT_THROW( Invalid_Argument );
-
-    memory = library->memory;
-
-    FT_FREE( bitmap->buffer );
-    *bitmap = null_bitmap;
-
-    return FT_Err_Ok;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftcalc.c b/third_party/freetype/src/base/ftcalc.c
deleted file mode 100644
index f052550..0000000
--- a/third_party/freetype/src/base/ftcalc.c
+++ /dev/null
@@ -1,1003 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcalc.c                                                               */
-/*                                                                         */
-/*    Arithmetic computations (body).                                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Support for 1-complement arithmetic has been totally dropped in this  */
-  /* release.  You can still write your own code if you need it.           */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Implementing basic computation routines.                              */
-  /*                                                                       */
-  /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(),   */
-  /* and FT_FloorFix() are declared in freetype.h.                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_GLYPH_H
-#include FT_TRIGONOMETRY_H
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-#ifdef FT_MULFIX_ASSEMBLER
-#undef FT_MulFix
-#endif
-
-/* we need to emulate a 64-bit data type if a real one isn't available */
-
-#ifndef FT_LONG64
-
-  typedef struct  FT_Int64_
-  {
-    FT_UInt32  lo;
-    FT_UInt32  hi;
-
-  } FT_Int64;
-
-#endif /* !FT_LONG64 */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_calc
-
-
-  /* transfer sign leaving a positive number */
-#define FT_MOVE_SIGN( x, s ) \
-  FT_BEGIN_STMNT             \
-    if ( x < 0 )             \
-    {                        \
-      x = -x;                \
-      s = -s;                \
-    }                        \
-  FT_END_STMNT
-
-  /* The following three functions are available regardless of whether */
-  /* FT_LONG64 is defined.                                             */
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_RoundFix( FT_Fixed  a )
-  {
-    return ( a + 0x8000L - ( a < 0 ) ) & ~0xFFFFL;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_CeilFix( FT_Fixed  a )
-  {
-    return ( a + 0xFFFFL ) & ~0xFFFFL;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_FloorFix( FT_Fixed  a )
-  {
-    return a & ~0xFFFFL;
-  }
-
-#ifndef FT_MSB
-
-  FT_BASE_DEF ( FT_Int )
-  FT_MSB( FT_UInt32 z )
-  {
-    FT_Int  shift = 0;
-
-
-    /* determine msb bit index in `shift' */
-    if ( z & 0xFFFF0000UL )
-    {
-      z     >>= 16;
-      shift  += 16;
-    }
-    if ( z & 0x0000FF00UL )
-    {
-      z     >>= 8;
-      shift  += 8;
-    }
-    if ( z & 0x000000F0UL )
-    {
-      z     >>= 4;
-      shift  += 4;
-    }
-    if ( z & 0x0000000CUL )
-    {
-      z     >>= 2;
-      shift  += 2;
-    }
-    if ( z & 0x00000002UL )
-    {
-   /* z     >>= 1; */
-      shift  += 1;
-    }
-
-    return shift;
-  }
-
-#endif /* !FT_MSB */
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( FT_Fixed )
-  FT_Hypot( FT_Fixed  x,
-            FT_Fixed  y )
-  {
-    FT_Vector  v;
-
-
-    v.x = x;
-    v.y = y;
-
-    return FT_Vector_Length( &v );
-  }
-
-
-#ifdef FT_LONG64
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_MulDiv( FT_Long  a_,
-             FT_Long  b_,
-             FT_Long  c_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt64  a, b, c, d;
-    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_;
-
-    d = c > 0 ? ( a * b + ( c >> 1 ) ) / c
-              : 0x7FFFFFFFUL;
-
-    d_ = (FT_Long)d;
-
-    return s < 0 ? -d_ : d_;
-  }
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( FT_Long )
-  FT_MulDiv_No_Round( FT_Long  a_,
-                      FT_Long  b_,
-                      FT_Long  c_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt64  a, b, c, d;
-    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_;
-
-    d = c > 0 ? a * b / c
-              : 0x7FFFFFFFUL;
-
-    d_ = (FT_Long)d;
-
-    return s < 0 ? -d_ : d_;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_MulFix( FT_Long  a_,
-             FT_Long  b_ )
-  {
-#ifdef FT_MULFIX_ASSEMBLER
-
-    return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ );
-
-#else
-
-    FT_Int64  ab = (FT_Int64)a_ * (FT_Int64)b_;
-
-    /* this requires arithmetic right shift of signed numbers */
-    return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 );
-
-#endif /* FT_MULFIX_ASSEMBLER */
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_DivFix( FT_Long  a_,
-             FT_Long  b_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt64  a, b, q;
-    FT_Long    q_;
-
-
-    FT_MOVE_SIGN( a_, s );
-    FT_MOVE_SIGN( b_, s );
-
-    a = (FT_UInt64)a_;
-    b = (FT_UInt64)b_;
-
-    q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b
-              : 0x7FFFFFFFUL;
-
-    q_ = (FT_Long)q;
-
-    return s < 0 ? -q_ : q_;
-  }
-
-
-#else /* !FT_LONG64 */
-
-
-  static void
-  ft_multo64( FT_UInt32  x,
-              FT_UInt32  y,
-              FT_Int64  *z )
-  {
-    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;
-
-
-    lo1 = x & 0x0000FFFFU;  hi1 = x >> 16;
-    lo2 = y & 0x0000FFFFU;  hi2 = y >> 16;
-
-    lo = lo1 * lo2;
-    i1 = lo1 * hi2;
-    i2 = lo2 * hi1;
-    hi = hi1 * hi2;
-
-    /* Check carry overflow of i1 + i2 */
-    i1 += i2;
-    hi += (FT_UInt32)( i1 < i2 ) << 16;
-
-    hi += i1 >> 16;
-    i1  = i1 << 16;
-
-    /* Check carry overflow of i1 + lo */
-    lo += i1;
-    hi += ( lo < i1 );
-
-    z->lo = lo;
-    z->hi = hi;
-  }
-
-
-  static FT_UInt32
-  ft_div64by32( FT_UInt32  hi,
-                FT_UInt32  lo,
-                FT_UInt32  y )
-  {
-    FT_UInt32  r, q;
-    FT_Int     i;
-
-
-    if ( hi >= y )
-      return (FT_UInt32)0x7FFFFFFFL;
-
-    /* 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.            */
-
-    i = 31 - FT_MSB( hi );
-    r = ( hi << i ) | ( lo >> ( 32 - i ) ); lo <<= i; /* left 64-bit shift */
-    q = r / y;
-    r -= q * y;   /* remainder */
-
-    i = 32 - i;   /* bits remaining in low register */
-    do
-    {
-      q <<= 1;
-      r   = ( r << 1 ) | ( lo >> 31 ); lo <<= 1;
-
-      if ( r >= y )
-      {
-        r -= y;
-        q |= 1;
-      }
-    } while ( --i );
-
-    return q;
-  }
-
-
-  static void
-  FT_Add64( FT_Int64*  x,
-            FT_Int64*  y,
-            FT_Int64  *z )
-  {
-    FT_UInt32  lo, hi;
-
-
-    lo = x->lo + y->lo;
-    hi = x->hi + y->hi + ( lo < x->lo );
-
-    z->lo = lo;
-    z->hi = hi;
-  }
-
-
-  /*  The FT_MulDiv function has been optimized thanks to ideas from     */
-  /*  Graham Asher and Alexei Podtelezhnikov.  The trick is to optimize  */
-  /*  a rather common case when everything fits within 32-bits.          */
-  /*                                                                     */
-  /*  We compute 'a*b+c/2', then divide it by 'c' (all positive values). */
-  /*                                                                     */
-  /*  The product of two positive numbers never exceeds the square of    */
-  /*  its mean values.  Therefore, we always avoid the overflow by       */
-  /*  imposing                                                           */
-  /*                                                                     */
-  /*    (a + b) / 2 <= sqrt(X - c/2)    ,                                */
-  /*                                                                     */
-  /*  where X = 2^32 - 1, the maximum unsigned 32-bit value, and using   */
-  /*  unsigned arithmetic.  Now we replace `sqrt' with a linear function */
-  /*  that is smaller or equal for all values of c in the interval       */
-  /*  [0;X/2]; it should be equal to sqrt(X) and sqrt(3X/4) at the       */
-  /*  endpoints.  Substituting the linear solution and explicit numbers  */
-  /*  we get                                                             */
-  /*                                                                     */
-  /*    a + b <= 131071.99 - c / 122291.84    .                          */
-  /*                                                                     */
-  /*  In practice, we should use a faster and even stronger inequality   */
-  /*                                                                     */
-  /*    a + b <= 131071 - (c >> 16)                                      */
-  /*                                                                     */
-  /*  or, alternatively,                                                 */
-  /*                                                                     */
-  /*    a + b <= 129894 - (c >> 17)    .                                 */
-  /*                                                                     */
-  /*  FT_MulFix, on the other hand, is optimized for a small value of    */
-  /*  the first argument, when the second argument can be much larger.   */
-  /*  This can be achieved by scaling the second argument and the limit  */
-  /*  in the above inequalities.  For example,                           */
-  /*                                                                     */
-  /*    a + (b >> 8) <= (131071 >> 4)                                    */
-  /*                                                                     */
-  /*  covers the practical range of use. The actual test below is a bit  */
-  /*  tighter to avoid the border case overflows.                        */
-  /*                                                                     */
-  /*  In the case of FT_DivFix, the exact overflow check                 */
-  /*                                                                     */
-  /*    a << 16 <= X - c/2                                               */
-  /*                                                                     */
-  /*  is scaled down by 2^16 and we use                                  */
-  /*                                                                     */
-  /*    a <= 65535 - (c >> 17)    .                                      */
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_MulDiv( FT_Long  a_,
-             FT_Long  b_,
-             FT_Long  c_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt32  a, b, c;
-
-
-    /* XXX: this function does not allow 64-bit arguments */
-
-    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_;
-
-    if ( c == 0 )
-      a = 0x7FFFFFFFUL;
-
-    else if ( a + b <= 129894UL - ( c >> 17 ) )
-      a = ( a * b + ( c >> 1 ) ) / c;
-
-    else
-    {
-      FT_Int64  temp, temp2;
-
-
-      ft_multo64( a, b, &temp );
-
-      temp2.hi = 0;
-      temp2.lo = c >> 1;
-
-      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_ = (FT_Long)a;
-
-    return s < 0 ? -a_ : a_;
-  }
-
-
-  FT_BASE_DEF( FT_Long )
-  FT_MulDiv_No_Round( FT_Long  a_,
-                      FT_Long  b_,
-                      FT_Long  c_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt32  a, b, c;
-
-
-    /* XXX: this function does not allow 64-bit arguments */
-
-    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_;
-
-    if ( c == 0 )
-      a = 0x7FFFFFFFUL;
-
-    else if ( a + b <= 131071UL )
-      a = a * b / c;
-
-    else
-    {
-      FT_Int64  temp;
-
-
-      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_ = (FT_Long)a;
-
-    return s < 0 ? -a_ : a_;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_MulFix( FT_Long  a_,
-             FT_Long  b_ )
-  {
-#ifdef FT_MULFIX_ASSEMBLER
-
-    return FT_MULFIX_ASSEMBLER( a_, b_ );
-
-#elif 0
-
-    /*
-     *  This code is nonportable.  See comment below.
-     *
-     *  However, on a platform where right-shift of a signed quantity fills
-     *  the leftmost bits by copying the sign bit, it might be faster.
-     */
-
-    FT_Long    sa, sb;
-    FT_UInt32  a, b;
-
-
-    /*
-     *  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
-     *  stored in `sa'; 0 means `a' was positive or zero, and -1 means `a'
-     *  was negative.  (Similarly for `b' and `sb').
-     *
-     *  Unfortunately, it doesn't work (at least not portably).
-     *
-     *  It makes the assumption that right-shift on a negative signed value
-     *  fills the leftmost bits by copying the sign bit.  This is wrong.
-     *  According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206,
-     *  the result of right-shift of a negative signed value is
-     *  implementation-defined.  At least one implementation fills the
-     *  leftmost bits with 0s (i.e., it is exactly the same as an unsigned
-     *  right shift).  This means that when `a' is negative, `sa' ends up
-     *  with the value 1 rather than -1.  After that, everything else goes
-     *  wrong.
-     */
-    sa = ( a_ >> ( sizeof ( a_ ) * 8 - 1 ) );
-    a  = ( a_ ^ sa ) - sa;
-    sb = ( b_ >> ( sizeof ( b_ ) * 8 - 1 ) );
-    b  = ( b_ ^ sb ) - sb;
-
-    a = (FT_UInt32)a_;
-    b = (FT_UInt32)b_;
-
-    if ( a + ( b >> 8 ) <= 8190UL )
-      a = ( a * b + 0x8000U ) >> 16;
-    else
-    {
-      FT_UInt32  al = a & 0xFFFFUL;
-
-
-      a = ( a >> 16 ) * b + al * ( b >> 16 ) +
-          ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 );
-    }
-
-    sa ^= sb;
-    a   = ( a ^ sa ) - sa;
-
-    return (FT_Long)a;
-
-#else /* 0 */
-
-    FT_Int     s = 1;
-    FT_UInt32  a, b;
-
-
-    /* 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_;
-
-    if ( a + ( b >> 8 ) <= 8190UL )
-      a = ( a * b + 0x8000UL ) >> 16;
-    else
-    {
-      FT_UInt32  al = a & 0xFFFFUL;
-
-
-      a = ( a >> 16 ) * b + al * ( b >> 16 ) +
-          ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 );
-    }
-
-    a_ = (FT_Long)a;
-
-    return s < 0 ? -a_ : a_;
-
-#endif /* 0 */
-
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_DivFix( FT_Long  a_,
-             FT_Long  b_ )
-  {
-    FT_Int     s = 1;
-    FT_UInt32  a, b, q;
-    FT_Long    q_;
-
-
-    /* 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_;
-
-    if ( b == 0 )
-    {
-      /* check for division by 0 */
-      q = 0x7FFFFFFFUL;
-    }
-    else if ( a <= 65535UL - ( b >> 17 ) )
-    {
-      /* compute result directly */
-      q = ( ( a << 16 ) + ( b >> 1 ) ) / b;
-    }
-    else
-    {
-      /* we need more bits; we have to do it by hand */
-      FT_Int64  temp, temp2;
-
-
-      temp.hi  = a >> 16;
-      temp.lo  = a << 16;
-      temp2.hi = 0;
-      temp2.lo = b >> 1;
-
-      FT_Add64( &temp, &temp2, &temp );
-      q = ft_div64by32( temp.hi, temp.lo, b );
-    }
-
-    q_ = (FT_Long)q;
-
-    return s < 0 ? -q_ : q_;
-  }
-
-
-#endif /* !FT_LONG64 */
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Matrix_Multiply( const FT_Matrix*  a,
-                      FT_Matrix        *b )
-  {
-    FT_Fixed  xx, xy, yx, yy;
-
-
-    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 );
-
-    b->xx = xx;  b->xy = xy;
-    b->yx = yx;  b->yy = yy;
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Matrix_Invert( FT_Matrix*  matrix )
-  {
-    FT_Pos  delta, xx, yy;
-
-
-    if ( !matrix )
-      return FT_THROW( Invalid_Argument );
-
-    /* compute discriminant */
-    delta = FT_MulFix( matrix->xx, matrix->yy ) -
-            FT_MulFix( matrix->xy, matrix->yx );
-
-    if ( !delta )
-      return FT_THROW( Invalid_Argument );  /* matrix can't be inverted */
-
-    matrix->xy = - FT_DivFix( matrix->xy, delta );
-    matrix->yx = - FT_DivFix( matrix->yx, delta );
-
-    xx = matrix->xx;
-    yy = matrix->yy;
-
-    matrix->xx = FT_DivFix( yy, delta );
-    matrix->yy = FT_DivFix( xx, delta );
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( void )
-  FT_Matrix_Multiply_Scaled( const FT_Matrix*  a,
-                             FT_Matrix        *b,
-                             FT_Long           scaling )
-  {
-    FT_Fixed  xx, xy, yx, yy;
-
-    FT_Long   val = 0x10000L * scaling;
-
-
-    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 );
-
-    b->xx = xx;  b->xy = xy;
-    b->yx = yx;  b->yy = yy;
-  }
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( void )
-  FT_Vector_Transform_Scaled( FT_Vector*        vector,
-                              const FT_Matrix*  matrix,
-                              FT_Long           scaling )
-  {
-    FT_Pos   xz, yz;
-
-    FT_Long  val = 0x10000L * scaling;
-
-
-    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 );
-
-    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;
-
-
-    FT_MOVE_SIGN( x_, sx );
-    FT_MOVE_SIGN( y_, sy );
-
-    x = (FT_UInt32)x_;
-    y = (FT_UInt32)y_;
-
-    /* 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 */
-
-  FT_BASE_DEF( FT_Int32 )
-  FT_SqrtFixed( FT_Int32  x )
-  {
-    FT_UInt32  root, rem_hi, rem_lo, test_div;
-    FT_Int     count;
-
-
-    root = 0;
-
-    if ( x > 0 )
-    {
-      rem_hi = 0;
-      rem_lo = (FT_UInt32)x;
-      count  = 24;
-      do
-      {
-        rem_hi   = ( rem_hi << 2 ) | ( rem_lo >> 30 );
-        rem_lo <<= 2;
-        root   <<= 1;
-        test_div = ( root << 1 ) + 1;
-
-        if ( rem_hi >= test_div )
-        {
-          rem_hi -= test_div;
-          root   += 1;
-        }
-      } while ( --count );
-    }
-
-    return (FT_Int32)root;
-  }
-
-#endif /* 0 */
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( FT_Int )
-  ft_corner_orientation( FT_Pos  in_x,
-                         FT_Pos  in_y,
-                         FT_Pos  out_x,
-                         FT_Pos  out_y )
-  {
-#ifdef FT_LONG64
-
-    FT_Int64  delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x;
-
-
-    return ( delta > 0 ) - ( delta < 0 );
-
-#else
-
-    FT_Int  result;
-
-
-    if ( (FT_ULong)FT_ABS( in_x ) + (FT_ULong)FT_ABS( out_y ) <= 131071UL &&
-         (FT_ULong)FT_ABS( in_y ) + (FT_ULong)FT_ABS( out_x ) <= 131071UL )
-    {
-      FT_Long  z1 = in_x * out_y;
-      FT_Long  z2 = 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;
-
-
-      /* XXX: this function does not allow 64-bit arguments */
-      ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 );
-      ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 );
-
-      if ( z1.hi > z2.hi )
-        result = +1;
-      else if ( z1.hi < z2.hi )
-        result = -1;
-      else if ( z1.lo > z2.lo )
-        result = +1;
-      else if ( z1.lo < z2.lo )
-        result = -1;
-      else
-        result = 0;
-    }
-
-    /* XXX: only the sign of return value, +1/0/-1 must be used */
-    return result;
-
-#endif
-  }
-
-
-  /* documentation is in ftcalc.h */
-
-  FT_BASE_DEF( FT_Int )
-  ft_corner_is_flat( FT_Pos  in_x,
-                     FT_Pos  in_y,
-                     FT_Pos  out_x,
-                     FT_Pos  out_y )
-  {
-    FT_Pos  ax = in_x + out_x;
-    FT_Pos  ay = in_y + out_y;
-
-    FT_Pos  d_in, d_out, d_hypot;
-
-
-    /* The idea of this function is to compare the length of the */
-    /* hypotenuse with the `in' and `out' length.  The `corner'  */
-    /* represented by `in' and `out' is flat if the hypotenuse's */
-    /* length isn't too large.                                   */
-    /*                                                           */
-    /* This approach has the advantage that the angle between    */
-    /* `in' and `out' is not checked.  In case one of the two    */
-    /* vectors is `dominant', this is, much larger than the      */
-    /* other vector, we thus always have a flat corner.          */
-    /*                                                           */
-    /*                hypotenuse                                 */
-    /*       x---------------------------x                       */
-    /*        \                      /                           */
-    /*         \                /                                */
-    /*      in  \          /  out                                */
-    /*           \    /                                          */
-    /*            o                                              */
-    /*              Point                                        */
-
-    d_in    = FT_HYPOT(  in_x,  in_y );
-    d_out   = FT_HYPOT( out_x, out_y );
-    d_hypot = FT_HYPOT(    ax,    ay );
-
-    /* now do a simple length comparison: */
-    /*                                    */
-    /*   d_in + d_out < 17/16 d_hypot     */
-
-    return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftdbgmem.c b/third_party/freetype/src/base/ftdbgmem.c
deleted file mode 100644
index 242246b..0000000
--- a/third_party/freetype/src/base/ftdbgmem.c
+++ /dev/null
@@ -1,999 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftdbgmem.c                                                             */
-/*                                                                         */
-/*    Memory debugger (body).                                              */
-/*                                                                         */
-/*  Copyright 2001-2017 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_CONFIG_CONFIG_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_MEMORY_H
-#include FT_SYSTEM_H
-#include FT_ERRORS_H
-#include FT_TYPES_H
-
-
-#ifdef FT_DEBUG_MEMORY
-
-#define  KEEPALIVE /* `Keep alive' means that freed blocks aren't released
-                    * to the heap.  This is useful to detect double-frees
-                    * or weird heap corruption, but it uses large amounts of
-                    * memory, however.
-                    */
-
-#include FT_CONFIG_STANDARD_LIBRARY_H
-
-  FT_BASE_DEF( const char* )  _ft_debug_file   = NULL;
-  FT_BASE_DEF( long )         _ft_debug_lineno = 0;
-
-  extern void
-  FT_DumpMemory( FT_Memory  memory );
-
-
-  typedef struct FT_MemSourceRec_*  FT_MemSource;
-  typedef struct FT_MemNodeRec_*    FT_MemNode;
-  typedef struct FT_MemTableRec_*   FT_MemTable;
-
-
-#define FT_MEM_VAL( addr )  ( (FT_PtrDist)(FT_Pointer)( addr ) )
-
-  /*
-   *  This structure holds statistics for a single allocation/release
-   *  site.  This is useful to know where memory operations happen the
-   *  most.
-   */
-  typedef struct  FT_MemSourceRec_
-  {
-    const char*   file_name;
-    long          line_no;
-
-    FT_Long       cur_blocks;   /* current number of allocated blocks */
-    FT_Long       max_blocks;   /* max. number of allocated blocks    */
-    FT_Long       all_blocks;   /* total number of blocks allocated   */
-
-    FT_Long       cur_size;     /* current cumulative allocated size */
-    FT_Long       max_size;     /* maximum cumulative allocated size */
-    FT_Long       all_size;     /* total cumulative allocated size   */
-
-    FT_Long       cur_max;      /* current maximum allocated size */
-
-    FT_UInt32     hash;
-    FT_MemSource  link;
-
-  } FT_MemSourceRec;
-
-
-  /*
-   *  We don't need a resizable array for the memory sources because
-   *  their number is pretty limited within FreeType.
-   */
-#define FT_MEM_SOURCE_BUCKETS  128
-
-  /*
-   *  This structure holds information related to a single allocated
-   *  memory block.  If KEEPALIVE is defined, blocks that are freed by
-   *  FreeType are never released to the system.  Instead, their `size'
-   *  field is set to `-size'.  This is mainly useful to detect double
-   *  frees, at the price of a large memory footprint during execution.
-   */
-  typedef struct  FT_MemNodeRec_
-  {
-    FT_Byte*      address;
-    FT_Long       size;     /* < 0 if the block was freed */
-
-    FT_MemSource  source;
-
-#ifdef KEEPALIVE
-    const char*   free_file_name;
-    FT_Long       free_line_no;
-#endif
-
-    FT_MemNode    link;
-
-  } FT_MemNodeRec;
-
-
-  /*
-   *  The global structure, containing compound statistics and all hash
-   *  tables.
-   */
-  typedef struct  FT_MemTableRec_
-  {
-    FT_Long          size;
-    FT_Long          nodes;
-    FT_MemNode*      buckets;
-
-    FT_Long          alloc_total;
-    FT_Long          alloc_current;
-    FT_Long          alloc_max;
-    FT_Long          alloc_count;
-
-    FT_Bool          bound_total;
-    FT_Long          alloc_total_max;
-
-    FT_Bool          bound_count;
-    FT_Long          alloc_count_max;
-
-    FT_MemSource     sources[FT_MEM_SOURCE_BUCKETS];
-
-    FT_Bool          keep_alive;
-
-    FT_Memory        memory;
-    FT_Pointer       memory_user;
-    FT_Alloc_Func    alloc;
-    FT_Free_Func     free;
-    FT_Realloc_Func  realloc;
-
-  } FT_MemTableRec;
-
-
-#define FT_MEM_SIZE_MIN  7
-#define FT_MEM_SIZE_MAX  13845163
-
-#define FT_FILENAME( x )  ( (x) ? (x) : "unknown file" )
-
-
-  /*
-   *  Prime numbers are ugly to handle.  It would be better to implement
-   *  L-Hashing, which is 10% faster and doesn't require divisions.
-   */
-  static const FT_Int  ft_mem_primes[] =
-  {
-    7,
-    11,
-    19,
-    37,
-    73,
-    109,
-    163,
-    251,
-    367,
-    557,
-    823,
-    1237,
-    1861,
-    2777,
-    4177,
-    6247,
-    9371,
-    14057,
-    21089,
-    31627,
-    47431,
-    71143,
-    106721,
-    160073,
-    240101,
-    360163,
-    540217,
-    810343,
-    1215497,
-    1823231,
-    2734867,
-    4102283,
-    6153409,
-    9230113,
-    13845163,
-  };
-
-
-  static FT_Long
-  ft_mem_closest_prime( FT_Long  num )
-  {
-    size_t  i;
-
-
-    for ( i = 0;
-          i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ )
-      if ( ft_mem_primes[i] > num )
-        return ft_mem_primes[i];
-
-    return FT_MEM_SIZE_MAX;
-  }
-
-
-  static void
-  ft_mem_debug_panic( const char*  fmt,
-                      ... )
-  {
-    va_list  ap;
-
-
-    printf( "FreeType.Debug: " );
-
-    va_start( ap, fmt );
-    vprintf( fmt, ap );
-    va_end( ap );
-
-    printf( "\n" );
-    exit( EXIT_FAILURE );
-  }
-
-
-  static FT_Pointer
-  ft_mem_table_alloc( FT_MemTable  table,
-                      FT_Long      size )
-  {
-    FT_Memory   memory = table->memory;
-    FT_Pointer  block;
-
-
-    memory->user = table->memory_user;
-    block = table->alloc( memory, size );
-    memory->user = table;
-
-    return block;
-  }
-
-
-  static void
-  ft_mem_table_free( FT_MemTable  table,
-                     FT_Pointer   block )
-  {
-    FT_Memory  memory = table->memory;
-
-
-    memory->user = table->memory_user;
-    table->free( memory, block );
-    memory->user = table;
-  }
-
-
-  static void
-  ft_mem_table_resize( FT_MemTable  table )
-  {
-    FT_Long  new_size;
-
-
-    new_size = ft_mem_closest_prime( table->nodes );
-    if ( new_size != table->size )
-    {
-      FT_MemNode*  new_buckets;
-      FT_Long      i;
-
-
-      new_buckets = (FT_MemNode *)
-                      ft_mem_table_alloc(
-                        table,
-                        new_size * (FT_Long)sizeof ( FT_MemNode ) );
-      if ( !new_buckets )
-        return;
-
-      FT_ARRAY_ZERO( new_buckets, new_size );
-
-      for ( i = 0; i < table->size; i++ )
-      {
-        FT_MemNode  node, next, *pnode;
-        FT_PtrDist  hash;
-
-
-        node = table->buckets[i];
-        while ( node )
-        {
-          next  = node->link;
-          hash  = FT_MEM_VAL( node->address ) % (FT_PtrDist)new_size;
-          pnode = new_buckets + hash;
-
-          node->link = pnode[0];
-          pnode[0]   = node;
-
-          node = next;
-        }
-      }
-
-      if ( table->buckets )
-        ft_mem_table_free( table, table->buckets );
-
-      table->buckets = new_buckets;
-      table->size    = new_size;
-    }
-  }
-
-
-  static FT_MemTable
-  ft_mem_table_new( FT_Memory  memory )
-  {
-    FT_MemTable  table;
-
-
-    table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) );
-    if ( !table )
-      goto Exit;
-
-    FT_ZERO( table );
-
-    table->size  = FT_MEM_SIZE_MIN;
-    table->nodes = 0;
-
-    table->memory = memory;
-
-    table->memory_user = memory->user;
-
-    table->alloc   = memory->alloc;
-    table->realloc = memory->realloc;
-    table->free    = memory->free;
-
-    table->buckets = (FT_MemNode *)
-                       memory->alloc(
-                         memory,
-                         table->size * (FT_Long)sizeof ( FT_MemNode ) );
-    if ( table->buckets )
-      FT_ARRAY_ZERO( table->buckets, table->size );
-    else
-    {
-      memory->free( memory, table );
-      table = NULL;
-    }
-
-  Exit:
-    return table;
-  }
-
-
-  static void
-  ft_mem_table_destroy( FT_MemTable  table )
-  {
-    FT_Long  i;
-    FT_Long  leak_count = 0;
-    FT_Long  leaks      = 0;
-
-
-    FT_DumpMemory( table->memory );
-
-    /* remove all blocks from the table, revealing leaked ones */
-    for ( i = 0; i < table->size; i++ )
-    {
-      FT_MemNode  *pnode = table->buckets + i, next, node = *pnode;
-
-
-      while ( node )
-      {
-        next       = node->link;
-        node->link = NULL;
-
-        if ( node->size > 0 )
-        {
-          printf(
-            "leaked memory block at address %p, size %8ld in (%s:%ld)\n",
-            (void*)node->address,
-            node->size,
-            FT_FILENAME( node->source->file_name ),
-            node->source->line_no );
-
-          leak_count++;
-          leaks += node->size;
-
-          ft_mem_table_free( table, node->address );
-        }
-
-        node->address = NULL;
-        node->size    = 0;
-
-        ft_mem_table_free( table, node );
-        node = next;
-      }
-      table->buckets[i] = NULL;
-    }
-
-    ft_mem_table_free( table, table->buckets );
-    table->buckets = NULL;
-
-    table->size  = 0;
-    table->nodes = 0;
-
-    /* remove all sources */
-    for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ )
-    {
-      FT_MemSource  source, next;
-
-
-      for ( source = table->sources[i]; source != NULL; source = next )
-      {
-        next = source->link;
-        ft_mem_table_free( table, source );
-      }
-
-      table->sources[i] = NULL;
-    }
-
-    printf( "FreeType: total memory allocations = %ld\n",
-            table->alloc_total );
-    printf( "FreeType: maximum memory footprint = %ld\n",
-            table->alloc_max );
-
-    ft_mem_table_free( table, table );
-
-    if ( leak_count > 0 )
-      ft_mem_debug_panic(
-        "FreeType: %ld bytes of memory leaked in %ld blocks\n",
-        leaks, leak_count );
-
-    printf( "FreeType: no memory leaks detected\n" );
-  }
-
-
-  static FT_MemNode*
-  ft_mem_table_get_nodep( FT_MemTable  table,
-                          FT_Byte*     address )
-  {
-    FT_PtrDist   hash;
-    FT_MemNode  *pnode, node;
-
-
-    hash  = FT_MEM_VAL( address );
-    pnode = table->buckets + ( hash % (FT_PtrDist)table->size );
-
-    for (;;)
-    {
-      node = pnode[0];
-      if ( !node )
-        break;
-
-      if ( node->address == address )
-        break;
-
-      pnode = &node->link;
-    }
-    return pnode;
-  }
-
-
-  static FT_MemSource
-  ft_mem_table_get_source( FT_MemTable  table )
-  {
-    FT_UInt32     hash;
-    FT_MemSource  node, *pnode;
-
-
-    /* cast to FT_PtrDist first since void* can be larger */
-    /* than FT_UInt32 and GCC 4.1.1 emits a warning       */
-    hash  = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file +
-              (FT_UInt32)( 5 * _ft_debug_lineno );
-    pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS];
-
-    for (;;)
-    {
-      node = *pnode;
-      if ( !node )
-        break;
-
-      if ( node->file_name == _ft_debug_file   &&
-           node->line_no   == _ft_debug_lineno )
-        goto Exit;
-
-      pnode = &node->link;
-    }
-
-    node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) );
-    if ( !node )
-      ft_mem_debug_panic(
-        "not enough memory to perform memory debugging\n" );
-
-    node->file_name = _ft_debug_file;
-    node->line_no   = _ft_debug_lineno;
-
-    node->cur_blocks = 0;
-    node->max_blocks = 0;
-    node->all_blocks = 0;
-
-    node->cur_size = 0;
-    node->max_size = 0;
-    node->all_size = 0;
-
-    node->cur_max = 0;
-
-    node->link = NULL;
-    node->hash = hash;
-    *pnode     = node;
-
-  Exit:
-    return node;
-  }
-
-
-  static void
-  ft_mem_table_set( FT_MemTable  table,
-                    FT_Byte*     address,
-                    FT_Long      size,
-                    FT_Long      delta )
-  {
-    FT_MemNode  *pnode, node;
-
-
-    if ( table )
-    {
-      FT_MemSource  source;
-
-
-      pnode = ft_mem_table_get_nodep( table, address );
-      node  = *pnode;
-      if ( node )
-      {
-        if ( node->size < 0 )
-        {
-          /* This block was already freed.  Our memory is now completely */
-          /* corrupted!                                                  */
-          /* This can only happen in keep-alive mode.                    */
-          ft_mem_debug_panic(
-            "memory heap corrupted (allocating freed block)" );
-        }
-        else
-        {
-          /* This block was already allocated.  This means that our memory */
-          /* is also corrupted!                                            */
-          ft_mem_debug_panic(
-            "memory heap corrupted (re-allocating allocated block at"
-            " %p, of size %ld)\n"
-            "org=%s:%d new=%s:%d\n",
-            node->address, node->size,
-            FT_FILENAME( node->source->file_name ), node->source->line_no,
-            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
-        }
-      }
-
-      /* we need to create a new node in this table */
-      node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) );
-      if ( !node )
-        ft_mem_debug_panic( "not enough memory to run memory tests" );
-
-      node->address = address;
-      node->size    = size;
-      node->source  = source = ft_mem_table_get_source( table );
-
-      if ( delta == 0 )
-      {
-        /* this is an allocation */
-        source->all_blocks++;
-        source->cur_blocks++;
-        if ( source->cur_blocks > source->max_blocks )
-          source->max_blocks = source->cur_blocks;
-      }
-
-      if ( size > source->cur_max )
-        source->cur_max = size;
-
-      if ( delta != 0 )
-      {
-        /* we are growing or shrinking a reallocated block */
-        source->cur_size     += delta;
-        table->alloc_current += delta;
-      }
-      else
-      {
-        /* we are allocating a new block */
-        source->cur_size     += size;
-        table->alloc_current += size;
-      }
-
-      source->all_size += size;
-
-      if ( source->cur_size > source->max_size )
-        source->max_size = source->cur_size;
-
-      node->free_file_name = NULL;
-      node->free_line_no   = 0;
-
-      node->link = pnode[0];
-
-      pnode[0] = node;
-      table->nodes++;
-
-      table->alloc_total += size;
-
-      if ( table->alloc_current > table->alloc_max )
-        table->alloc_max = table->alloc_current;
-
-      if ( table->nodes * 3 < table->size  ||
-           table->size  * 3 < table->nodes )
-        ft_mem_table_resize( table );
-    }
-  }
-
-
-  static void
-  ft_mem_table_remove( FT_MemTable  table,
-                       FT_Byte*     address,
-                       FT_Long      delta )
-  {
-    if ( table )
-    {
-      FT_MemNode  *pnode, node;
-
-
-      pnode = ft_mem_table_get_nodep( table, address );
-      node  = *pnode;
-      if ( node )
-      {
-        FT_MemSource  source;
-
-
-        if ( node->size < 0 )
-          ft_mem_debug_panic(
-            "freeing memory block at %p more than once at (%s:%ld)\n"
-            "block allocated at (%s:%ld) and released at (%s:%ld)",
-            address,
-            FT_FILENAME( _ft_debug_file ), _ft_debug_lineno,
-            FT_FILENAME( node->source->file_name ), node->source->line_no,
-            FT_FILENAME( node->free_file_name ), node->free_line_no );
-
-        /* scramble the node's content for additional safety */
-        FT_MEM_SET( address, 0xF3, node->size );
-
-        if ( delta == 0 )
-        {
-          source = node->source;
-
-          source->cur_blocks--;
-          source->cur_size -= node->size;
-
-          table->alloc_current -= node->size;
-        }
-
-        if ( table->keep_alive )
-        {
-          /* we simply invert the node's size to indicate that the node */
-          /* was freed.                                                 */
-          node->size           = -node->size;
-          node->free_file_name = _ft_debug_file;
-          node->free_line_no   = _ft_debug_lineno;
-        }
-        else
-        {
-          table->nodes--;
-
-          *pnode = node->link;
-
-          node->size   = 0;
-          node->source = NULL;
-
-          ft_mem_table_free( table, node );
-
-          if ( table->nodes * 3 < table->size  ||
-               table->size  * 3 < table->nodes )
-            ft_mem_table_resize( table );
-        }
-      }
-      else
-        ft_mem_debug_panic(
-          "trying to free unknown block at %p in (%s:%ld)\n",
-          address,
-          FT_FILENAME( _ft_debug_file ), _ft_debug_lineno );
-    }
-  }
-
-
-  static FT_Pointer
-  ft_mem_debug_alloc( FT_Memory  memory,
-                      FT_Long    size )
-  {
-    FT_MemTable  table = (FT_MemTable)memory->user;
-    FT_Byte*     block;
-
-
-    if ( size <= 0 )
-      ft_mem_debug_panic( "negative block size allocation (%ld)", size );
-
-    /* return NULL if the maximum number of allocations was reached */
-    if ( table->bound_count                           &&
-         table->alloc_count >= table->alloc_count_max )
-      return NULL;
-
-    /* return NULL if this allocation would overflow the maximum heap size */
-    if ( table->bound_total                                   &&
-         table->alloc_total_max - table->alloc_current > size )
-      return NULL;
-
-    block = (FT_Byte *)ft_mem_table_alloc( table, size );
-    if ( block )
-    {
-      ft_mem_table_set( table, block, size, 0 );
-
-      table->alloc_count++;
-    }
-
-    _ft_debug_file   = "<unknown>";
-    _ft_debug_lineno = 0;
-
-    return (FT_Pointer)block;
-  }
-
-
-  static void
-  ft_mem_debug_free( FT_Memory   memory,
-                     FT_Pointer  block )
-  {
-    FT_MemTable  table = (FT_MemTable)memory->user;
-
-
-    if ( !block )
-      ft_mem_debug_panic( "trying to free NULL in (%s:%ld)",
-                          FT_FILENAME( _ft_debug_file ),
-                          _ft_debug_lineno );
-
-    ft_mem_table_remove( table, (FT_Byte*)block, 0 );
-
-    if ( !table->keep_alive )
-      ft_mem_table_free( table, block );
-
-    table->alloc_count--;
-
-    _ft_debug_file   = "<unknown>";
-    _ft_debug_lineno = 0;
-  }
-
-
-  static FT_Pointer
-  ft_mem_debug_realloc( FT_Memory   memory,
-                        FT_Long     cur_size,
-                        FT_Long     new_size,
-                        FT_Pointer  block )
-  {
-    FT_MemTable  table = (FT_MemTable)memory->user;
-    FT_MemNode   node, *pnode;
-    FT_Pointer   new_block;
-    FT_Long      delta;
-
-    const char*  file_name = FT_FILENAME( _ft_debug_file );
-    FT_Long      line_no   = _ft_debug_lineno;
-
-
-    /* unlikely, but possible */
-    if ( new_size == cur_size )
-      return block;
-
-    /* the following is valid according to ANSI C */
-#if 0
-    if ( !block || !cur_size )
-      ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)",
-                          file_name, line_no );
-#endif
-
-    /* while the following is allowed in ANSI C also, we abort since */
-    /* such case should be handled by FreeType.                      */
-    if ( new_size <= 0 )
-      ft_mem_debug_panic(
-        "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)",
-        block, cur_size, file_name, line_no );
-
-    /* check `cur_size' value */
-    pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block );
-    node  = *pnode;
-    if ( !node )
-      ft_mem_debug_panic(
-        "trying to reallocate unknown block at %p in (%s:%ld)",
-        block, file_name, line_no );
-
-    if ( node->size <= 0 )
-      ft_mem_debug_panic(
-        "trying to reallocate freed block at %p in (%s:%ld)",
-        block, file_name, line_no );
-
-    if ( node->size != cur_size )
-      ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is "
-                          "%ld instead of %ld in (%s:%ld)",
-                          block, cur_size, node->size, file_name, line_no );
-
-    /* return NULL if the maximum number of allocations was reached */
-    if ( table->bound_count                           &&
-         table->alloc_count >= table->alloc_count_max )
-      return NULL;
-
-    delta = new_size - cur_size;
-
-    /* return NULL if this allocation would overflow the maximum heap size */
-    if ( delta > 0                                             &&
-         table->bound_total                                    &&
-         table->alloc_current + delta > table->alloc_total_max )
-      return NULL;
-
-    new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size );
-    if ( !new_block )
-      return NULL;
-
-    ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta );
-
-    ft_memcpy( new_block, block, cur_size < new_size ? (size_t)cur_size
-                                                     : (size_t)new_size );
-
-    ft_mem_table_remove( table, (FT_Byte*)block, delta );
-
-    _ft_debug_file   = "<unknown>";
-    _ft_debug_lineno = 0;
-
-    if ( !table->keep_alive )
-      ft_mem_table_free( table, block );
-
-    return new_block;
-  }
-
-
-  extern FT_Int
-  ft_mem_debug_init( FT_Memory  memory )
-  {
-    FT_MemTable  table;
-    FT_Int       result = 0;
-
-
-    if ( getenv( "FT2_DEBUG_MEMORY" ) )
-    {
-      table = ft_mem_table_new( memory );
-      if ( table )
-      {
-        const char*  p;
-
-
-        memory->user    = table;
-        memory->alloc   = ft_mem_debug_alloc;
-        memory->realloc = ft_mem_debug_realloc;
-        memory->free    = ft_mem_debug_free;
-
-        p = getenv( "FT2_ALLOC_TOTAL_MAX" );
-        if ( p )
-        {
-          FT_Long  total_max = ft_strtol( p, NULL, 10 );
-
-
-          if ( total_max > 0 )
-          {
-            table->bound_total     = 1;
-            table->alloc_total_max = total_max;
-          }
-        }
-
-        p = getenv( "FT2_ALLOC_COUNT_MAX" );
-        if ( p )
-        {
-          FT_Long  total_count = ft_strtol( p, NULL, 10 );
-
-
-          if ( total_count > 0 )
-          {
-            table->bound_count     = 1;
-            table->alloc_count_max = total_count;
-          }
-        }
-
-        p = getenv( "FT2_KEEP_ALIVE" );
-        if ( p )
-        {
-          FT_Long  keep_alive = ft_strtol( p, NULL, 10 );
-
-
-          if ( keep_alive > 0 )
-            table->keep_alive = 1;
-        }
-
-        result = 1;
-      }
-    }
-    return result;
-  }
-
-
-  extern void
-  ft_mem_debug_done( FT_Memory  memory )
-  {
-    FT_MemTable  table = (FT_MemTable)memory->user;
-
-
-    if ( table )
-    {
-      memory->free    = table->free;
-      memory->realloc = table->realloc;
-      memory->alloc   = table->alloc;
-
-      ft_mem_table_destroy( table );
-      memory->user = NULL;
-    }
-  }
-
-
-  static int
-  ft_mem_source_compare( const void*  p1,
-                         const void*  p2 )
-  {
-    FT_MemSource  s1 = *(FT_MemSource*)p1;
-    FT_MemSource  s2 = *(FT_MemSource*)p2;
-
-
-    if ( s2->max_size > s1->max_size )
-      return 1;
-    else if ( s2->max_size < s1->max_size )
-      return -1;
-    else
-      return 0;
-  }
-
-
-  extern void
-  FT_DumpMemory( FT_Memory  memory )
-  {
-    FT_MemTable  table = (FT_MemTable)memory->user;
-
-
-    if ( table )
-    {
-      FT_MemSource*  bucket = table->sources;
-      FT_MemSource*  limit  = bucket + FT_MEM_SOURCE_BUCKETS;
-      FT_MemSource*  sources;
-      FT_Int         nn, count;
-      const char*    fmt;
-
-
-      count = 0;
-      for ( ; bucket < limit; bucket++ )
-      {
-        FT_MemSource  source = *bucket;
-
-
-        for ( ; source; source = source->link )
-          count++;
-      }
-
-      sources = (FT_MemSource*)
-                  ft_mem_table_alloc(
-                    table, count * (FT_Long)sizeof ( *sources ) );
-
-      count = 0;
-      for ( bucket = table->sources; bucket < limit; bucket++ )
-      {
-        FT_MemSource  source = *bucket;
-
-
-        for ( ; source; source = source->link )
-          sources[count++] = source;
-      }
-
-      ft_qsort( sources,
-                (size_t)count,
-                sizeof ( *sources ),
-                ft_mem_source_compare );
-
-      printf( "FreeType Memory Dump: "
-              "current=%ld max=%ld total=%ld count=%ld\n",
-              table->alloc_current, table->alloc_max,
-              table->alloc_total, table->alloc_count );
-      printf( " block  block    sizes    sizes    sizes   source\n" );
-      printf( " count   high      sum  highsum      max   location\n" );
-      printf( "-------------------------------------------------\n" );
-
-      fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n";
-
-      for ( nn = 0; nn < count; nn++ )
-      {
-        FT_MemSource  source = sources[nn];
-
-
-        printf( fmt,
-                source->cur_blocks, source->max_blocks,
-                source->cur_size, source->max_size, source->cur_max,
-                FT_FILENAME( source->file_name ),
-                source->line_no );
-      }
-      printf( "------------------------------------------------\n" );
-
-      ft_mem_table_free( table, sources );
-    }
-  }
-
-#else  /* !FT_DEBUG_MEMORY */
-
-  /* ANSI C doesn't like empty source files */
-  typedef int  _debug_mem_dummy;
-
-#endif /* !FT_DEBUG_MEMORY */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftfntfmt.c b/third_party/freetype/src/base/ftfntfmt.c
deleted file mode 100644
index dcbeba0..0000000
--- a/third_party/freetype/src/base/ftfntfmt.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftfntfmt.c                                                             */
-/*                                                                         */
-/*    FreeType utility file for font formats (body).                       */
-/*                                                                         */
-/*  Copyright 2002-2017 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_FONT_FORMATS_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_FONT_FORMAT_H
-
-
-  /* documentation is in ftfntfmt.h */
-
-  FT_EXPORT_DEF( const char* )
-  FT_Get_Font_Format( FT_Face  face )
-  {
-    const char*  result = NULL;
-
-
-    if ( face )
-      FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT );
-
-    return result;
-  }
-
-
-  /* deprecated function name; retained for ABI compatibility */
-
-  FT_EXPORT_DEF( const char* )
-  FT_Get_X11_Font_Format( FT_Face  face )
-  {
-    const char*  result = NULL;
-
-
-    if ( face )
-      FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT );
-
-    return result;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftfstype.c b/third_party/freetype/src/base/ftfstype.c
deleted file mode 100644
index cec4fb3..0000000
--- a/third_party/freetype/src/base/ftfstype.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftfstype.c                                                             */
-/*                                                                         */
-/*    FreeType utility file to access FSType data (body).                  */
-/*                                                                         */
-/*  Copyright 2008-2017 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_TYPE1_TABLES_H
-#include FT_TRUETYPE_TABLES_H
-#include FT_INTERNAL_SERVICE_H
-#include FT_SERVICE_POSTSCRIPT_INFO_H
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UShort )
-  FT_Get_FSType_Flags( FT_Face  face )
-  {
-    TT_OS2*  os2;
-
-
-    /* first, try to get the fs_type directly from the font */
-    if ( face )
-    {
-      FT_Service_PsInfo  service = NULL;
-
-
-      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
-
-      if ( service && service->ps_get_font_extra )
-      {
-        PS_FontExtraRec  extra;
-
-
-        if ( !service->ps_get_font_extra( face, &extra ) &&
-             extra.fs_type != 0                          )
-          return extra.fs_type;
-      }
-    }
-
-    /* look at FSType before fsType for Type42 */
-
-    if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, FT_SFNT_OS2 ) ) != NULL &&
-         os2->version != 0xFFFFU                                           )
-      return os2->fsType;
-
-    return 0;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftgloadr.c b/third_party/freetype/src/base/ftgloadr.c
deleted file mode 100644
index 8134003..0000000
--- a/third_party/freetype/src/base/ftgloadr.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgloadr.c                                                             */
-/*                                                                         */
-/*    The FreeType glyph loader (body).                                    */
-/*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg                       */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_GLYPH_LOADER_H
-#include FT_INTERNAL_MEMORY_H
-#include FT_INTERNAL_OBJECTS_H
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_gloader
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*****                    G L Y P H   L O A D E R                    *****/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The glyph loader is a simple object which is used to load a set of    */
-  /* glyphs easily.  It is critical for the correct loading of composites. */
-  /*                                                                       */
-  /* Ideally, one can see it as a stack of abstract `glyph' objects.       */
-  /*                                                                       */
-  /*   loader.base     Is really the bottom of the stack.  It describes a  */
-  /*                   single glyph image made of the juxtaposition of     */
-  /*                   several glyphs (those `in the stack').              */
-  /*                                                                       */
-  /*   loader.current  Describes the top of the stack, on which a new      */
-  /*                   glyph can be loaded.                                */
-  /*                                                                       */
-  /*   Rewind          Clears the stack.                                   */
-  /*   Prepare         Set up `loader.current' for addition of a new glyph */
-  /*                   image.                                              */
-  /*   Add             Add the `current' glyph image to the `base' one,    */
-  /*                   and prepare for another one.                        */
-  /*                                                                       */
-  /* The glyph loader is now a base object.  Each driver used to           */
-  /* re-implement it in one way or the other, which wasted code and        */
-  /* energy.                                                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* create a new glyph loader */
-  FT_BASE_DEF( FT_Error )
-  FT_GlyphLoader_New( FT_Memory        memory,
-                      FT_GlyphLoader  *aloader )
-  {
-    FT_GlyphLoader  loader = NULL;
-    FT_Error        error;
-
-
-    if ( !FT_NEW( loader ) )
-    {
-      loader->memory = memory;
-      *aloader       = loader;
-    }
-    return error;
-  }
-
-
-  /* rewind the glyph loader - reset counters to 0 */
-  FT_BASE_DEF( void )
-  FT_GlyphLoader_Rewind( FT_GlyphLoader  loader )
-  {
-    FT_GlyphLoad  base    = &loader->base;
-    FT_GlyphLoad  current = &loader->current;
-
-
-    base->outline.n_points   = 0;
-    base->outline.n_contours = 0;
-    base->num_subglyphs      = 0;
-
-    *current = *base;
-  }
-
-
-  /* reset the glyph loader, frees all allocated tables */
-  /* and starts from zero                               */
-  FT_BASE_DEF( void )
-  FT_GlyphLoader_Reset( FT_GlyphLoader  loader )
-  {
-    FT_Memory memory = loader->memory;
-
-
-    FT_FREE( loader->base.outline.points );
-    FT_FREE( loader->base.outline.tags );
-    FT_FREE( loader->base.outline.contours );
-    FT_FREE( loader->base.extra_points );
-    FT_FREE( loader->base.subglyphs );
-
-    loader->base.extra_points2 = NULL;
-
-    loader->max_points    = 0;
-    loader->max_contours  = 0;
-    loader->max_subglyphs = 0;
-
-    FT_GlyphLoader_Rewind( loader );
-  }
-
-
-  /* delete a glyph loader */
-  FT_BASE_DEF( void )
-  FT_GlyphLoader_Done( FT_GlyphLoader  loader )
-  {
-    if ( loader )
-    {
-      FT_Memory memory = loader->memory;
-
-
-      FT_GlyphLoader_Reset( loader );
-      FT_FREE( loader );
-    }
-  }
-
-
-  /* re-adjust the `current' outline fields */
-  static void
-  FT_GlyphLoader_Adjust_Points( FT_GlyphLoader  loader )
-  {
-    FT_Outline*  base    = &loader->base.outline;
-    FT_Outline*  current = &loader->current.outline;
-
-
-    current->points   = base->points   + base->n_points;
-    current->tags     = base->tags     + base->n_points;
-    current->contours = base->contours + base->n_contours;
-
-    /* handle extra points table - if any */
-    if ( loader->use_extra )
-    {
-      loader->current.extra_points  = loader->base.extra_points +
-                                      base->n_points;
-
-      loader->current.extra_points2 = loader->base.extra_points2 +
-                                      base->n_points;
-    }
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_GlyphLoader_CreateExtra( FT_GlyphLoader  loader )
-  {
-    FT_Error   error;
-    FT_Memory  memory = loader->memory;
-
-
-    if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) )
-    {
-      loader->use_extra          = 1;
-      loader->base.extra_points2 = loader->base.extra_points +
-                                   loader->max_points;
-
-      FT_GlyphLoader_Adjust_Points( loader );
-    }
-    return error;
-  }
-
-
-  /* re-adjust the `current' subglyphs field */
-  static void
-  FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader  loader )
-  {
-    FT_GlyphLoad  base    = &loader->base;
-    FT_GlyphLoad  current = &loader->current;
-
-
-    current->subglyphs = base->subglyphs + base->num_subglyphs;
-  }
-
-
-  /* Ensure that we can add `n_points' and `n_contours' to our glyph.      */
-  /* This function reallocates its outline tables if necessary.  Note that */
-  /* it DOESN'T change the number of points within the loader!             */
-  /*                                                                       */
-  FT_BASE_DEF( FT_Error )
-  FT_GlyphLoader_CheckPoints( FT_GlyphLoader  loader,
-                              FT_UInt         n_points,
-                              FT_UInt         n_contours )
-  {
-    FT_Memory    memory  = loader->memory;
-    FT_Error     error   = FT_Err_Ok;
-    FT_Outline*  base    = &loader->base.outline;
-    FT_Outline*  current = &loader->current.outline;
-    FT_Bool      adjust  = 0;
-
-    FT_UInt      new_max, old_max;
-
-
-    /* check points & tags */
-    new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points +
-              n_points;
-    old_max = loader->max_points;
-
-    if ( new_max > old_max )
-    {
-      new_max = FT_PAD_CEIL( new_max, 8 );
-
-      if ( new_max > FT_OUTLINE_POINTS_MAX )
-        return FT_THROW( Array_Too_Large );
-
-      if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) ||
-           FT_RENEW_ARRAY( base->tags,   old_max, new_max ) )
-        goto Exit;
-
-      if ( loader->use_extra )
-      {
-        if ( FT_RENEW_ARRAY( loader->base.extra_points,
-                             old_max * 2, new_max * 2 ) )
-          goto Exit;
-
-        FT_ARRAY_MOVE( loader->base.extra_points + new_max,
-                       loader->base.extra_points + old_max,
-                       old_max );
-
-        loader->base.extra_points2 = loader->base.extra_points + new_max;
-      }
-
-      adjust = 1;
-      loader->max_points = new_max;
-    }
-
-    /* check contours */
-    old_max = loader->max_contours;
-    new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours +
-              n_contours;
-    if ( new_max > old_max )
-    {
-      new_max = FT_PAD_CEIL( new_max, 4 );
-
-      if ( new_max > FT_OUTLINE_CONTOURS_MAX )
-        return FT_THROW( Array_Too_Large );
-
-      if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) )
-        goto Exit;
-
-      adjust = 1;
-      loader->max_contours = new_max;
-    }
-
-    if ( adjust )
-      FT_GlyphLoader_Adjust_Points( loader );
-
-  Exit:
-    if ( error )
-      FT_GlyphLoader_Reset( loader );
-
-    return error;
-  }
-
-
-  /* Ensure that we can add `n_subglyphs' to our glyph. this function */
-  /* reallocates its subglyphs table if necessary.  Note that it DOES */
-  /* NOT change the number of subglyphs within the loader!            */
-  /*                                                                  */
-  FT_BASE_DEF( FT_Error )
-  FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader  loader,
-                                 FT_UInt         n_subs )
-  {
-    FT_Memory     memory = loader->memory;
-    FT_Error      error  = FT_Err_Ok;
-    FT_UInt       new_max, old_max;
-
-    FT_GlyphLoad  base    = &loader->base;
-    FT_GlyphLoad  current = &loader->current;
-
-
-    new_max = base->num_subglyphs + current->num_subglyphs + n_subs;
-    old_max = loader->max_subglyphs;
-    if ( new_max > old_max )
-    {
-      new_max = FT_PAD_CEIL( new_max, 2 );
-      if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) )
-        goto Exit;
-
-      loader->max_subglyphs = new_max;
-
-      FT_GlyphLoader_Adjust_Subglyphs( loader );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* prepare loader for the addition of a new glyph on top of the base one */
-  FT_BASE_DEF( void )
-  FT_GlyphLoader_Prepare( FT_GlyphLoader  loader )
-  {
-    FT_GlyphLoad  current = &loader->current;
-
-
-    current->outline.n_points   = 0;
-    current->outline.n_contours = 0;
-    current->num_subglyphs      = 0;
-
-    FT_GlyphLoader_Adjust_Points   ( loader );
-    FT_GlyphLoader_Adjust_Subglyphs( loader );
-  }
-
-
-  /* add current glyph to the base image -- and prepare for another */
-  FT_BASE_DEF( void )
-  FT_GlyphLoader_Add( FT_GlyphLoader  loader )
-  {
-    FT_GlyphLoad  base;
-    FT_GlyphLoad  current;
-
-    FT_Int        n_curr_contours;
-    FT_Int        n_base_points;
-    FT_Int        n;
-
-
-    if ( !loader )
-      return;
-
-    base    = &loader->base;
-    current = &loader->current;
-
-    n_curr_contours = current->outline.n_contours;
-    n_base_points   = base->outline.n_points;
-
-    base->outline.n_points =
-      (short)( base->outline.n_points + current->outline.n_points );
-    base->outline.n_contours =
-      (short)( base->outline.n_contours + current->outline.n_contours );
-
-    base->num_subglyphs += current->num_subglyphs;
-
-    /* adjust contours count in newest outline */
-    for ( n = 0; n < n_curr_contours; n++ )
-      current->outline.contours[n] =
-        (short)( current->outline.contours[n] + n_base_points );
-
-    /* prepare for another new glyph image */
-    FT_GlyphLoader_Prepare( loader );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_GlyphLoader_CopyPoints( FT_GlyphLoader  target,
-                             FT_GlyphLoader  source )
-  {
-    FT_Error  error;
-    FT_UInt   num_points   = (FT_UInt)source->base.outline.n_points;
-    FT_UInt   num_contours = (FT_UInt)source->base.outline.n_contours;
-
-
-    error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours );
-    if ( !error )
-    {
-      FT_Outline*  out = &target->base.outline;
-      FT_Outline*  in  = &source->base.outline;
-
-
-      FT_ARRAY_COPY( out->points, in->points,
-                     num_points );
-      FT_ARRAY_COPY( out->tags, in->tags,
-                     num_points );
-      FT_ARRAY_COPY( out->contours, in->contours,
-                     num_contours );
-
-      /* do we need to copy the extra points? */
-      if ( target->use_extra && source->use_extra )
-      {
-        FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points,
-                       num_points );
-        FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2,
-                       num_points );
-      }
-
-      out->n_points   = (short)num_points;
-      out->n_contours = (short)num_contours;
-
-      FT_GlyphLoader_Adjust_Points( target );
-    }
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftglyph.c b/third_party/freetype/src/base/ftglyph.c
deleted file mode 100644
index 9bfb330..0000000
--- a/third_party/freetype/src/base/ftglyph.c
+++ /dev/null
@@ -1,633 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftglyph.c                                                              */
-/*                                                                         */
-/*    FreeType convenience functions to handle glyphs (body).              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 contains the definition of several convenience functions   */
-  /*  that can be used by client applications to easily retrieve glyph     */
-  /*  bitmaps and outlines from a given face.                              */
-  /*                                                                       */
-  /*  These functions should be optional if you are writing a font server  */
-  /*  or text layout engine on top of FreeType.  However, they are pretty  */
-  /*  handy for many other simple uses of the library.                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_GLYPH_H
-#include FT_OUTLINE_H
-#include FT_BITMAP_H
-#include FT_INTERNAL_OBJECTS_H
-
-#include "basepic.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_glyph
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****   FT_BitmapGlyph support                                        ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_CALLBACK_DEF( FT_Error )
-  ft_bitmap_glyph_init( FT_Glyph      bitmap_glyph,
-                        FT_GlyphSlot  slot )
-  {
-    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
-    FT_Error        error   = FT_Err_Ok;
-    FT_Library      library = FT_GLYPH( glyph )->library;
-
-
-    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
-    {
-      error = FT_THROW( Invalid_Glyph_Format );
-      goto Exit;
-    }
-
-    glyph->left = slot->bitmap_left;
-    glyph->top  = slot->bitmap_top;
-
-    /* do lazy copying whenever possible */
-    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
-    {
-      glyph->bitmap = slot->bitmap;
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-    else
-    {
-      FT_Bitmap_Init( &glyph->bitmap );
-      error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  ft_bitmap_glyph_copy( FT_Glyph  bitmap_source,
-                        FT_Glyph  bitmap_target )
-  {
-    FT_Library      library = bitmap_source->library;
-    FT_BitmapGlyph  source  = (FT_BitmapGlyph)bitmap_source;
-    FT_BitmapGlyph  target  = (FT_BitmapGlyph)bitmap_target;
-
-
-    target->left = source->left;
-    target->top  = source->top;
-
-    return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  ft_bitmap_glyph_done( FT_Glyph  bitmap_glyph )
-  {
-    FT_BitmapGlyph  glyph   = (FT_BitmapGlyph)bitmap_glyph;
-    FT_Library      library = FT_GLYPH( glyph )->library;
-
-
-    FT_Bitmap_Done( library, &glyph->bitmap );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  ft_bitmap_glyph_bbox( FT_Glyph  bitmap_glyph,
-                        FT_BBox*  cbox )
-  {
-    FT_BitmapGlyph  glyph = (FT_BitmapGlyph)bitmap_glyph;
-
-
-    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,
-
-    sizeof ( FT_BitmapGlyphRec ),
-    FT_GLYPH_FORMAT_BITMAP,
-
-    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   */
-  )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****   FT_OutlineGlyph support                                       ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  ft_outline_glyph_init( FT_Glyph      outline_glyph,
-                         FT_GlyphSlot  slot )
-  {
-    FT_OutlineGlyph  glyph   = (FT_OutlineGlyph)outline_glyph;
-    FT_Error         error   = FT_Err_Ok;
-    FT_Library       library = FT_GLYPH( glyph )->library;
-    FT_Outline*      source  = &slot->outline;
-    FT_Outline*      target  = &glyph->outline;
-
-
-    /* check format in glyph slot */
-    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
-    {
-      error = FT_THROW( Invalid_Glyph_Format );
-      goto Exit;
-    }
-
-    /* allocate new outline */
-    error = FT_Outline_New( library,
-                            (FT_UInt)source->n_points,
-                            source->n_contours,
-                            &glyph->outline );
-    if ( error )
-      goto Exit;
-
-    FT_Outline_Copy( source, target );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  ft_outline_glyph_done( FT_Glyph  outline_glyph )
-  {
-    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
-
-
-    FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline );
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  ft_outline_glyph_copy( FT_Glyph  outline_source,
-                         FT_Glyph  outline_target )
-  {
-    FT_OutlineGlyph  source  = (FT_OutlineGlyph)outline_source;
-    FT_OutlineGlyph  target  = (FT_OutlineGlyph)outline_target;
-    FT_Error         error;
-    FT_Library       library = FT_GLYPH( source )->library;
-
-
-    error = FT_Outline_New( library,
-                            (FT_UInt)source->outline.n_points,
-                            source->outline.n_contours,
-                            &target->outline );
-    if ( !error )
-      FT_Outline_Copy( &source->outline, &target->outline );
-
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  ft_outline_glyph_transform( FT_Glyph          outline_glyph,
-                              const FT_Matrix*  matrix,
-                              const FT_Vector*  delta )
-  {
-    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
-
-
-    if ( matrix )
-      FT_Outline_Transform( &glyph->outline, matrix );
-
-    if ( delta )
-      FT_Outline_Translate( &glyph->outline, delta->x, delta->y );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  ft_outline_glyph_bbox( FT_Glyph  outline_glyph,
-                         FT_BBox*  bbox )
-  {
-    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
-
-
-    FT_Outline_Get_CBox( &glyph->outline, bbox );
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  ft_outline_glyph_prepare( FT_Glyph      outline_glyph,
-                            FT_GlyphSlot  slot )
-  {
-    FT_OutlineGlyph  glyph = (FT_OutlineGlyph)outline_glyph;
-
-
-    slot->format         = FT_GLYPH_FORMAT_OUTLINE;
-    slot->outline        = glyph->outline;
-    slot->outline.flags &= ~FT_OUTLINE_OWNER;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_GLYPH(
-    ft_outline_glyph_class,
-
-    sizeof ( FT_OutlineGlyphRec ),
-    FT_GLYPH_FORMAT_OUTLINE,
-
-    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   */
-  )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****   FT_Glyph class and API                                        ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-   static FT_Error
-   ft_new_glyph( FT_Library             library,
-                 const FT_Glyph_Class*  clazz,
-                 FT_Glyph*              aglyph )
-   {
-     FT_Memory  memory = library->memory;
-     FT_Error   error;
-     FT_Glyph   glyph  = NULL;
-
-
-     *aglyph = NULL;
-
-     if ( !FT_ALLOC( glyph, clazz->glyph_size ) )
-     {
-       glyph->library = library;
-       glyph->clazz   = clazz;
-       glyph->format  = clazz->glyph_format;
-
-       *aglyph = glyph;
-     }
-
-     return error;
-   }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Glyph_Copy( FT_Glyph   source,
-                 FT_Glyph  *target )
-  {
-    FT_Glyph               copy;
-    FT_Error               error;
-    const FT_Glyph_Class*  clazz;
-
-
-    /* check arguments */
-    if ( !target || !source || !source->clazz )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    *target = NULL;
-
-    if ( !source || !source->clazz )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    clazz = source->clazz;
-    error = ft_new_glyph( source->library, clazz, &copy );
-    if ( error )
-      goto Exit;
-
-    copy->advance = source->advance;
-    copy->format  = source->format;
-
-    if ( clazz->glyph_copy )
-      error = clazz->glyph_copy( source, copy );
-
-    if ( error )
-      FT_Done_Glyph( copy );
-    else
-      *target = copy;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Glyph( FT_GlyphSlot  slot,
-                FT_Glyph     *aglyph )
-  {
-    FT_Library  library;
-    FT_Error    error;
-    FT_Glyph    glyph;
-
-    const FT_Glyph_Class*  clazz = NULL;
-
-
-    if ( !slot )
-      return FT_THROW( Invalid_Slot_Handle );
-
-    library = slot->library;
-
-    if ( !aglyph )
-      return FT_THROW( Invalid_Argument );
-
-    /* if it is a bitmap, that's easy :-) */
-    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
-      clazz = FT_BITMAP_GLYPH_CLASS_GET;
-
-    /* if it is an outline */
-    else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-      clazz = FT_OUTLINE_GLYPH_CLASS_GET;
-
-    else
-    {
-      /* try to find a renderer that supports the glyph image format */
-      FT_Renderer  render = FT_Lookup_Renderer( library, slot->format, 0 );
-
-
-      if ( render )
-        clazz = &render->glyph_class;
-    }
-
-    if ( !clazz )
-    {
-      error = FT_THROW( Invalid_Glyph_Format );
-      goto Exit;
-    }
-
-    /* create FT_Glyph object */
-    error = ft_new_glyph( library, clazz, &glyph );
-    if ( error )
-      goto Exit;
-
-    /* copy advance while converting 26.6 to 16.16 format */
-    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 );
-
-    /* if an error occurred, destroy the glyph */
-    if ( error )
-      FT_Done_Glyph( glyph );
-    else
-      *aglyph = glyph;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Glyph_Transform( FT_Glyph    glyph,
-                      FT_Matrix*  matrix,
-                      FT_Vector*  delta )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( !glyph || !glyph->clazz )
-      error = FT_THROW( Invalid_Argument );
-    else
-    {
-      const FT_Glyph_Class*  clazz = glyph->clazz;
-
-
-      if ( clazz->glyph_transform )
-      {
-        /* transform glyph image */
-        clazz->glyph_transform( glyph, matrix, delta );
-
-        /* transform advance vector */
-        if ( matrix )
-          FT_Vector_Transform( &glyph->advance, matrix );
-      }
-      else
-        error = FT_THROW( Invalid_Glyph_Format );
-    }
-    return error;
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Glyph_Get_CBox( FT_Glyph  glyph,
-                     FT_UInt   bbox_mode,
-                     FT_BBox  *acbox )
-  {
-    const FT_Glyph_Class*  clazz;
-
-
-    if ( !acbox )
-      return;
-
-    acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0;
-
-    if ( !glyph || !glyph->clazz )
-      return;
-
-    clazz = glyph->clazz;
-    if ( !clazz->glyph_bbox )
-      return;
-
-    /* retrieve bbox in 26.6 coordinates */
-    clazz->glyph_bbox( glyph, acbox );
-
-    /* perform grid fitting if needed */
-    if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT ||
-         bbox_mode == FT_GLYPH_BBOX_PIXELS  )
-    {
-      acbox->xMin = FT_PIX_FLOOR( acbox->xMin );
-      acbox->yMin = FT_PIX_FLOOR( acbox->yMin );
-      acbox->xMax = FT_PIX_CEIL( acbox->xMax );
-      acbox->yMax = FT_PIX_CEIL( acbox->yMax );
-    }
-
-    /* convert to integer pixels if needed */
-    if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE ||
-         bbox_mode == FT_GLYPH_BBOX_PIXELS   )
-    {
-      acbox->xMin >>= 6;
-      acbox->yMin >>= 6;
-      acbox->xMax >>= 6;
-      acbox->yMax >>= 6;
-    }
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Glyph_To_Bitmap( FT_Glyph*       the_glyph,
-                      FT_Render_Mode  render_mode,
-                      FT_Vector*      origin,
-                      FT_Bool         destroy )
-  {
-    FT_GlyphSlotRec           dummy;
-    FT_GlyphSlot_InternalRec  dummy_internal;
-    FT_Error                  error = FT_Err_Ok;
-    FT_Glyph                  b, glyph;
-    FT_BitmapGlyph            bitmap = NULL;
-    const FT_Glyph_Class*     clazz;
-
-    /* FT_BITMAP_GLYPH_CLASS_GET dereferences `library' in PIC mode */
-    FT_Library                library;
-
-
-    /* check argument */
-    if ( !the_glyph )
-      goto Bad;
-    glyph = *the_glyph;
-    if ( !glyph )
-      goto Bad;
-
-    clazz   = glyph->clazz;
-    library = glyph->library;
-    if ( !library || !clazz )
-      goto Bad;
-
-    /* when called with a bitmap glyph, do nothing and return successfully */
-    if ( clazz == FT_BITMAP_GLYPH_CLASS_GET )
-      goto Exit;
-
-    if ( !clazz->glyph_prepare )
-      goto Bad;
-
-    /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */
-    /* then calling FT_Render_Glyph_Internal()                            */
-
-    FT_ZERO( &dummy );
-    FT_ZERO( &dummy_internal );
-    dummy.internal = &dummy_internal;
-    dummy.library  = library;
-    dummy.format   = clazz->glyph_format;
-
-    /* create result bitmap glyph */
-    error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b );
-    if ( error )
-      goto Exit;
-    bitmap = (FT_BitmapGlyph)b;
-
-#if 1
-    /* if `origin' is set, translate the glyph image */
-    if ( origin )
-      FT_Glyph_Transform( glyph, 0, origin );
-#else
-    FT_UNUSED( origin );
-#endif
-
-    /* prepare dummy slot for rendering */
-    error = clazz->glyph_prepare( glyph, &dummy );
-    if ( !error )
-      error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode );
-
-#if 1
-    if ( !destroy && origin )
-    {
-      FT_Vector  v;
-
-
-      v.x = -origin->x;
-      v.y = -origin->y;
-      FT_Glyph_Transform( glyph, 0, &v );
-    }
-#endif
-
-    if ( error )
-      goto Exit;
-
-    /* in case of success, copy the bitmap to the glyph bitmap */
-    error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy );
-    if ( error )
-      goto Exit;
-
-    /* copy advance */
-    bitmap->root.advance = glyph->advance;
-
-    if ( destroy )
-      FT_Done_Glyph( glyph );
-
-    *the_glyph = FT_GLYPH( bitmap );
-
-  Exit:
-    if ( error && bitmap )
-      FT_Done_Glyph( FT_GLYPH( bitmap ) );
-
-    return error;
-
-  Bad:
-    error = FT_THROW( Invalid_Argument );
-    goto Exit;
-  }
-
-
-  /* documentation is in ftglyph.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Done_Glyph( FT_Glyph  glyph )
-  {
-    if ( glyph )
-    {
-      FT_Memory              memory = glyph->library->memory;
-      const FT_Glyph_Class*  clazz  = glyph->clazz;
-
-
-      if ( clazz->glyph_done )
-        clazz->glyph_done( glyph );
-
-      FT_FREE( glyph );
-    }
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/fthash.c b/third_party/freetype/src/base/fthash.c
deleted file mode 100644
index 21bc8dd..0000000
--- a/third_party/freetype/src/base/fthash.c
+++ /dev/null
@@ -1,339 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  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/third_party/freetype/src/base/ftinit.c b/third_party/freetype/src/base/ftinit.c
deleted file mode 100644
index 1c4b76f..0000000
--- a/third_party/freetype/src/base/ftinit.c
+++ /dev/null
@@ -1,397 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftinit.c                                                               */
-/*                                                                         */
-/*    FreeType initialization layer (body).                                */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  The purpose of this file is to implement the following two           */
-  /*  functions:                                                           */
-  /*                                                                       */
-  /*  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  */
-  /*     `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,   */
-  /*     builds a library out of it, then calls FT_Default_Drivers().      */
-  /*                                                                       */
-  /*  Note that even if FT_Init_FreeType() uses the implementation of the  */
-  /*  system object defined at build time, client applications are still   */
-  /*  able to provide their own `ftsystem.c'.                              */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_MODULE_H
-#include "basepic.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_init
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-
-#undef  FT_USE_MODULE
-#ifdef __cplusplus
-#define FT_USE_MODULE( type, x )  extern "C" const type  x;
-#else
-#define FT_USE_MODULE( type, x )  extern const type  x;
-#endif
-
-#include FT_CONFIG_MODULES_H
-
-#undef  FT_USE_MODULE
-#define FT_USE_MODULE( type, x )  (const FT_Module_Class*)&(x),
-
-  static
-  const FT_Module_Class*  const ft_default_modules[] =
-  {
-#include FT_CONFIG_MODULES_H
-    0
-  };
-
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-
-#ifdef __cplusplus
-#define FT_EXTERNC  extern "C"
-#else
-#define FT_EXTERNC  extern
-#endif
-
-  /* declare the module's class creation/destruction functions */
-#undef  FT_USE_MODULE
-#define FT_USE_MODULE( type, x )                            \
-  FT_EXTERNC FT_Error                                       \
-  FT_Create_Class_ ## x( FT_Library         library,        \
-                         FT_Module_Class*  *output_class ); \
-  FT_EXTERNC void                                           \
-  FT_Destroy_Class_ ## x( FT_Library        library,        \
-                          FT_Module_Class*  clazz );
-
-#include FT_CONFIG_MODULES_H
-
-  /* count all module classes */
-#undef  FT_USE_MODULE
-#define FT_USE_MODULE( type, x )  MODULE_CLASS_ ## x,
-
-  enum
-  {
-#include FT_CONFIG_MODULES_H
-    FT_NUM_MODULE_CLASSES
-  };
-
-  /* destroy all module classes */
-#undef  FT_USE_MODULE
-#define FT_USE_MODULE( type, x )                   \
-  if ( classes[i] )                                \
-  {                                                \
-    FT_Destroy_Class_ ## x( library, classes[i] ); \
-  }                                                \
-  i++;
-
-
-  FT_BASE_DEF( void )
-  ft_destroy_default_module_classes( FT_Library  library )
-  {
-    FT_Module_Class*  *classes;
-    FT_Memory          memory;
-    FT_UInt            i;
-    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
-
-
-    if ( !pic_container->default_module_classes )
-      return;
-
-    memory  = library->memory;
-    classes = pic_container->default_module_classes;
-    i       = 0;
-
-#include FT_CONFIG_MODULES_H
-
-    FT_FREE( classes );
-    pic_container->default_module_classes = NULL;
-  }
-
-
-  /* initialize all module classes and the pointer table */
-#undef  FT_USE_MODULE
-#define FT_USE_MODULE( type, x )                     \
-  error = FT_Create_Class_ ## x( library, &clazz );  \
-  if ( error )                                       \
-    goto Exit;                                       \
-  classes[i++] = clazz;
-
-
-  FT_BASE_DEF( FT_Error )
-  ft_create_default_module_classes( FT_Library  library )
-  {
-    FT_Error           error;
-    FT_Memory          memory;
-    FT_Module_Class*  *classes = NULL;
-    FT_Module_Class*   clazz;
-    FT_UInt            i;
-    BasePIC*           pic_container = (BasePIC*)library->pic_container.base;
-
-
-    memory = library->memory;
-
-    pic_container->default_module_classes = NULL;
-
-    if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) *
-                              ( FT_NUM_MODULE_CLASSES + 1 ) ) )
-      return error;
-
-    /* initialize all pointers to 0, especially the last one */
-    for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ )
-      classes[i] = NULL;
-    classes[FT_NUM_MODULE_CLASSES] = NULL;
-
-    i = 0;
-
-#include FT_CONFIG_MODULES_H
-
-  Exit:
-    if ( error )
-      ft_destroy_default_module_classes( library );
-    else
-      pic_container->default_module_classes = classes;
-
-    return error;
-  }
-
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Add_Default_Modules( FT_Library  library )
-  {
-    FT_Error                       error;
-    const FT_Module_Class* const*  cur;
-
-
-    /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */
-#ifdef FT_CONFIG_OPTION_PIC
-    if ( !library )
-      return;
-#endif
-
-    /* GCC 4.6 warns the type difference:
-     *   FT_Module_Class** != const FT_Module_Class* const*
-     */
-    cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET;
-
-    /* test for valid `library' delayed to FT_Add_Module() */
-    while ( *cur )
-    {
-      error = FT_Add_Module( library, *cur );
-      /* notify errors, but don't stop */
-      if ( error )
-        FT_TRACE0(( "FT_Add_Default_Module:"
-                    " Cannot install `%s', error = 0x%x\n",
-                    (*cur)->module_name, error ));
-      cur++;
-    }
-  }
-
-
-#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES
-
-#define MAX_LENGTH  128
-
-  /*
-   * Set default properties derived from the `FREETYPE_PROPERTIES'
-   * environment variable.
-   *
-   * `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
-   *
-   */
-
-  static 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
-
-  static void
-  ft_set_default_properties( FT_Library  library )
-  {
-    FT_UNUSED( library );
-  }
-
-#endif
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Init_FreeType( FT_Library  *alibrary )
-  {
-    FT_Error   error;
-    FT_Memory  memory;
-
-
-    /* check of `alibrary' delayed to `FT_New_Library' */
-
-    /* First of all, allocate a new system object -- this function is part */
-    /* of the system-specific component, i.e. `ftsystem.c'.                */
-
-    memory = FT_New_Memory();
-    if ( !memory )
-    {
-      FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" ));
-      return FT_THROW( Unimplemented_Feature );
-    }
-
-    /* build a library out of it, then fill it with the set of */
-    /* default drivers.                                        */
-
-    error = FT_New_Library( memory, alibrary );
-    if ( error )
-      FT_Done_Memory( memory );
-    else
-      FT_Add_Default_Modules( *alibrary );
-
-    ft_set_default_properties( *alibrary );
-
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Done_FreeType( FT_Library  library )
-  {
-    FT_Memory  memory;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    memory = library->memory;
-
-    /* Discard the library object */
-    FT_Done_Library( library );
-
-    /* discard memory manager */
-    FT_Done_Memory( memory );
-
-    return FT_Err_Ok;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftlcdfil.c b/third_party/freetype/src/base/ftlcdfil.c
deleted file mode 100644
index f8e1709..0000000
--- a/third_party/freetype/src/base/ftlcdfil.c
+++ /dev/null
@@ -1,383 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlcdfil.c                                                             */
-/*                                                                         */
-/*    FreeType API for color filtering of subpixel bitmap glyphs (body).   */
-/*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_LCD_FILTER_H
-#include FT_IMAGE_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-/* 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;
-
-
-    /* horizontal in-place FIR filter */
-    if ( mode == FT_RENDER_MODE_LCD && width >= 4 )
-    {
-      FT_Byte*  line = bitmap->buffer;
-
-
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
-      /* `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 )
-      {
-        FT_UInt  fir[4];        /* below, `pix' is used as the 5th element */
-        FT_UInt  val1, xx;
-
-
-        val1   = line[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
-
-        val1    = line[1];
-        fir[0] += weights[1] * val1;
-        fir[1] += weights[2] * val1;
-        fir[2] += weights[3] * val1;
-        fir[3] += weights[4] * val1;
-
-        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;
-
-          pix        >>= 8;
-          pix         |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          line[xx - 2] = (FT_Byte)pix;
-        }
-
-        {
-          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;
-        }
-      }
-    }
-
-    /* vertical in-place FIR filter */
-    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 4 )
-    {
-      FT_Byte*  column = bitmap->buffer;
-      FT_Int    pitch  = bitmap->pitch;
-
-
-      /* 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;
-
-
-        val1   = col[0];
-        fir[0] = weights[2] * val1;
-        fir[1] = weights[3] * val1;
-        fir[2] = weights[4] * val1;
-        fir[3] = 0;
-        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;
-
-        for ( yy = 2; yy < height; yy++ )
-        {
-          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;
-
-          pix           >>= 8;
-          pix            |= (FT_UInt)-(FT_Int)( pix >> 8 );
-          col[-2 * pitch] = (FT_Byte)pix;
-          col            += pitch;
-        }
-
-        {
-          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;
-        }
-      }
-    }
-  }
-
-
-#ifdef USE_LEGACY
-
-  /* intra-pixel filter used by the legacy filter */
-  static void
-  _ft_lcd_filter_legacy( FT_Bitmap*      bitmap,
-                         FT_Render_Mode  mode,
-                         FT_Library      library )
-  {
-    FT_UInt  width  = (FT_UInt)bitmap->width;
-    FT_UInt  height = (FT_UInt)bitmap->rows;
-    FT_Int   pitch  = bitmap->pitch;
-
-    static const unsigned int  filters[3][3] =
-    {
-      { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 },
-      { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 },
-      { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 }
-    };
-
-    FT_UNUSED( library );
-
-
-    /* horizontal in-place intra-pixel filter */
-    if ( mode == FT_RENDER_MODE_LCD && width >= 3 )
-    {
-      FT_Byte*  line = bitmap->buffer;
-
-
-      /* take care of bitmap flow */
-      if ( bitmap->pitch < 0 )
-        line -= bitmap->pitch * (FT_Int)( bitmap->rows - 1 );
-
-      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  p;
-
-
-          p  = line[xx];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
-
-          p  = line[xx + 1];
-          r += filters[1][0] * p;
-          g += filters[1][1] * p;
-          b += filters[1][2] * p;
-
-          p  = line[xx + 2];
-          r += filters[2][0] * p;
-          g += filters[2][1] * p;
-          b += filters[2][2] * p;
-
-          line[xx]     = (FT_Byte)( r / 65536 );
-          line[xx + 1] = (FT_Byte)( g / 65536 );
-          line[xx + 2] = (FT_Byte)( b / 65536 );
-        }
-      }
-    }
-    else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 )
-    {
-      FT_Byte*  column = bitmap->buffer;
-
-
-      /* 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;
-
-
-        for ( ; col < col_end; col += 3 * pitch )
-        {
-          FT_UInt  r = 0;
-          FT_UInt  g = 0;
-          FT_UInt  b = 0;
-          FT_UInt  p;
-
-
-          p  = col[0];
-          r += filters[0][0] * p;
-          g += filters[0][1] * p;
-          b += filters[0][2] * p;
-
-          p  = col[pitch];
-          r += filters[1][0] * p;
-          g += filters[1][1] * p;
-          b += filters[1][2] * p;
-
-          p  = col[pitch * 2];
-          r += filters[2][0] * p;
-          g += filters[2][1] * p;
-          b += filters[2][2] * p;
-
-          col[0]         = (FT_Byte)( r / 65536 );
-          col[pitch]     = (FT_Byte)( g / 65536 );
-          col[2 * pitch] = (FT_Byte)( b / 65536 );
-        }
-      }
-    }
-  }
-
-#endif /* USE_LEGACY */
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Library_SetLcdFilterWeights( FT_Library      library,
-                                  unsigned char  *weights )
-  {
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !weights )
-      return FT_THROW( Invalid_Argument );
-
-    ft_memcpy( library->lcd_weights, weights, 5 );
-    library->lcd_filter_func = _ft_lcd_filter_fir;
-    library->lcd_extra       = 2;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Library_SetLcdFilter( FT_Library    library,
-                           FT_LcdFilter  filter )
-  {
-    static const FT_Byte  default_filter[5] =
-                            { 0x08, 0x4d, 0x56, 0x4d, 0x08 };
-    static const FT_Byte  light_filter[5] =
-                            { 0x00, 0x55, 0x56, 0x55, 0x00 };
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    switch ( filter )
-    {
-    case FT_LCD_FILTER_NONE:
-      library->lcd_filter_func = NULL;
-      library->lcd_extra       = 0;
-      break;
-
-    case FT_LCD_FILTER_DEFAULT:
-      ft_memcpy( library->lcd_weights, default_filter, 5 );
-      library->lcd_filter_func = _ft_lcd_filter_fir;
-      library->lcd_extra       = 2;
-      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;
-      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
-
-    default:
-      return FT_THROW( Invalid_Argument );
-    }
-
-    library->lcd_filter = filter;
-
-    return FT_Err_Ok;
-  }
-
-#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Library_SetLcdFilterWeights( FT_Library      library,
-                                  unsigned char  *weights )
-  {
-    FT_UNUSED( library );
-    FT_UNUSED( weights );
-
-    return FT_THROW( Unimplemented_Feature );
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Library_SetLcdFilter( FT_Library    library,
-                           FT_LcdFilter  filter )
-  {
-    FT_UNUSED( library );
-    FT_UNUSED( filter );
-
-    return FT_THROW( Unimplemented_Feature );
-  }
-
-#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftmm.c b/third_party/freetype/src/base/ftmm.c
deleted file mode 100644
index b8db3c5..0000000
--- a/third_party/freetype/src/base/ftmm.c
+++ /dev/null
@@ -1,402 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmm.c                                                                 */
-/*                                                                         */
-/*    Multiple Master font support (body).                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_MULTIPLE_MASTERS_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_MULTIPLE_MASTERS_H
-#include FT_SERVICE_METRICS_VARIATIONS_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_mm
-
-
-  static FT_Error
-  ft_face_get_mm_service( FT_Face                   face,
-                          FT_Service_MultiMasters  *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,
-                              MULTI_MASTERS );
-
-      if ( *aservice )
-        error = FT_Err_Ok;
-    }
-
-    return error;
-  }
-
-
-  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 )
-  FT_Get_Multi_Master( FT_Face           face,
-                       FT_Multi_Master  *amaster )
-  {
-    FT_Error                 error;
-    FT_Service_MultiMasters  service;
-
-
-    /* check of `face' delayed to `ft_face_get_mm_service' */
-
-    if ( !amaster )
-      return FT_THROW( Invalid_Argument );
-
-    error = ft_face_get_mm_service( face, &service );
-    if ( !error )
-    {
-      error = FT_ERR( Invalid_Argument );
-      if ( service->get_mm )
-        error = service->get_mm( face, amaster );
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftmm.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_MM_Var( FT_Face      face,
-                 FT_MM_Var*  *amaster )
-  {
-    FT_Error                 error;
-    FT_Service_MultiMasters  service;
-
-
-    /* check of `face' delayed to `ft_face_get_mm_service' */
-
-    if ( !amaster )
-      return FT_THROW( Invalid_Argument );
-
-    error = ft_face_get_mm_service( face, &service );
-    if ( !error )
-    {
-      error = FT_ERR( Invalid_Argument );
-      if ( service->get_mm_var )
-        error = service->get_mm_var( face, amaster );
-    }
-
-    return error;
-  }
-
-
-  /* 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 )
-  {
-    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->set_mm_design )
-        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;
-  }
-
-
-  /* documentation is in ftmm.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Var_Design_Coordinates( FT_Face    face,
-                                 FT_UInt    num_coords,
-                                 FT_Fixed*  coords )
-  {
-    FT_Error                      error;
-    FT_Service_MultiMasters       service_mm;
-    FT_Service_MetricsVariations  service_mvar;
-
-
-    /* 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_mm );
-    if ( !error )
-    {
-      error = FT_ERR( Invalid_Argument );
-      if ( service_mm->set_var_design )
-        error = service_mm->set_var_design( face, num_coords, coords );
-    }
-
-    error = ft_face_get_mvar_service( face, &service_mvar );
-    if ( !error )
-    {
-      if ( 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;
-
-
-    /* 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_var_design )
-        error = service->get_var_design( face, num_coords, coords );
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftmm.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_MM_Blend_Coordinates( FT_Face    face,
-                               FT_UInt    num_coords,
-                               FT_Fixed*  coords )
-  {
-    FT_Error                      error;
-    FT_Service_MultiMasters       service_mm;
-    FT_Service_MetricsVariations  service_mvar;
-
-
-    /* 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_mm );
-    if ( !error )
-    {
-      error = FT_ERR( Invalid_Argument );
-      if ( service_mm->set_mm_blend )
-        error = service_mm->set_mm_blend( face, num_coords, coords );
-    }
-
-    error = ft_face_get_mvar_service( face, &service_mvar );
-    if ( !error )
-    {
-      if ( 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 */
-
-  /* This is exactly the same as the previous function.  It exists for */
-  /* orthogonality.                                                    */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Var_Blend_Coordinates( FT_Face    face,
-                                FT_UInt    num_coords,
-                                FT_Fixed*  coords )
-  {
-    FT_Error                      error;
-    FT_Service_MultiMasters       service_mm;
-    FT_Service_MetricsVariations  service_mvar;
-
-
-    /* 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_mm );
-    if ( !error )
-    {
-      error = FT_ERR( Invalid_Argument );
-      if ( service_mm->set_mm_blend )
-        error = service_mm->set_mm_blend( face, num_coords, coords );
-    }
-
-    error = ft_face_get_mvar_service( face, &service_mvar );
-    if ( !error )
-    {
-      if ( 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;
-
-
-    /* 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 */
-
-  /* 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;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftobjs.c b/third_party/freetype/src/base/ftobjs.c
deleted file mode 100644
index 59d65e2..0000000
--- a/third_party/freetype/src/base/ftobjs.c
+++ /dev/null
@@ -1,5112 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftobjs.c                                                               */
-/*                                                                         */
-/*    The FreeType private base classes (body).                            */
-/*                                                                         */
-/*  Copyright 1996-2017 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_LIST_H
-#include FT_OUTLINE_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_TRUETYPE_TABLES_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_TRUETYPE_IDS_H
-
-#include FT_SERVICE_PROPERTIES_H
-#include FT_SERVICE_SFNT_H
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_GLYPH_DICT_H
-#include FT_SERVICE_TT_CMAP_H
-#include FT_SERVICE_KERNING_H
-#include FT_SERVICE_TRUETYPE_ENGINE_H
-
-#ifdef FT_CONFIG_OPTION_MAC_FONTS
-#include "ftbase.h"
-#endif
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-#include FT_BITMAP_H
-
-#if defined( _MSC_VER )      /* Visual C++ (and Intel C++)   */
-  /* We disable the warning `conversion from XXX to YYY,     */
-  /* possible loss of data' in order to compile cleanly with */
-  /* the maximum level of warnings: `md5.c' is non-FreeType  */
-  /* code, and it gets used during development builds only.  */
-#pragma warning( push )
-#pragma warning( disable : 4244 )
-#endif /* _MSC_VER */
-
-  /* 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 )
-#pragma warning( pop )
-#endif
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-#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 )
-  {
-    FT_Pointer      result = NULL;
-    FT_ServiceDesc  desc   = service_descriptors;
-
-
-    if ( desc && service_id )
-    {
-      for ( ; desc->serv_id != NULL; desc++ )
-      {
-        if ( ft_strcmp( desc->serv_id, service_id ) == 0 )
-        {
-          result = (FT_Pointer)desc->serv_data;
-          break;
-        }
-      }
-    }
-
-    return result;
-  }
-
-
-  FT_BASE_DEF( void )
-  ft_validator_init( FT_Validator        valid,
-                     const FT_Byte*      base,
-                     const FT_Byte*      limit,
-                     FT_ValidationLevel  level )
-  {
-    valid->base  = base;
-    valid->limit = limit;
-    valid->level = level;
-    valid->error = FT_Err_Ok;
-  }
-
-
-  FT_BASE_DEF( FT_Int )
-  ft_validator_run( FT_Validator  valid )
-  {
-    /* This function doesn't work!  None should call it. */
-    FT_UNUSED( valid );
-
-    return -1;
-  }
-
-
-  FT_BASE_DEF( void )
-  ft_validator_error( FT_Validator  valid,
-                      FT_Error      error )
-  {
-    /* since the cast below also disables the compiler's */
-    /* type check, we introduce a dummy variable, which  */
-    /* will be optimized away                            */
-    volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer;
-
-
-    valid->error = error;
-
-    /* throw away volatileness; use `jump_buffer' or the  */
-    /* compiler may warn about an unused local variable   */
-    ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                           S T R E A M                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* create a new input stream from an FT_Open_Args structure */
-  /*                                                          */
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_New( FT_Library           library,
-                 const FT_Open_Args*  args,
-                 FT_Stream           *astream )
-  {
-    FT_Error   error;
-    FT_Memory  memory;
-    FT_Stream  stream = NULL;
-
-
-    *astream = NULL;
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !args )
-      return FT_THROW( Invalid_Argument );
-
-    memory = library->memory;
-
-    if ( FT_NEW( stream ) )
-      goto Exit;
-
-    stream->memory = memory;
-
-    if ( args->flags & FT_OPEN_MEMORY )
-    {
-      /* create a memory-based stream */
-      FT_Stream_OpenMemory( stream,
-                            (const FT_Byte*)args->memory_base,
-                            (FT_ULong)args->memory_size );
-    }
-
-#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
-
-    else if ( args->flags & FT_OPEN_PATHNAME )
-    {
-      /* create a normal system stream */
-      error = FT_Stream_Open( stream, args->pathname );
-      stream->pathname.pointer = args->pathname;
-    }
-    else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream )
-    {
-      /* use an existing, user-provided stream */
-
-      /* in this case, we do not need to allocate a new stream object */
-      /* since the caller is responsible for closing it himself       */
-      FT_FREE( stream );
-      stream = args->stream;
-    }
-
-#endif
-
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    if ( error )
-      FT_FREE( stream );
-    else
-      stream->memory = memory;  /* just to be certain */
-
-    *astream = stream;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Stream_Free( FT_Stream  stream,
-                  FT_Int     external )
-  {
-    if ( stream )
-    {
-      FT_Memory  memory = stream->memory;
-
-
-      FT_Stream_Close( stream );
-
-      if ( !external )
-        FT_FREE( stream );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_objs
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****               FACE, SIZE & GLYPH SLOT OBJECTS                   ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  static FT_Error
-  ft_glyphslot_init( FT_GlyphSlot  slot )
-  {
-    FT_Driver         driver   = slot->face->driver;
-    FT_Driver_Class   clazz    = driver->clazz;
-    FT_Memory         memory   = driver->root.memory;
-    FT_Error          error    = FT_Err_Ok;
-    FT_Slot_Internal  internal = NULL;
-
-
-    slot->library = driver->root.library;
-
-    if ( FT_NEW( internal ) )
-      goto Exit;
-
-    slot->internal = internal;
-
-    if ( FT_DRIVER_USES_OUTLINES( driver ) )
-      error = FT_GlyphLoader_New( memory, &internal->loader );
-
-    if ( !error && clazz->init_slot )
-      error = clazz->init_slot( slot );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_BASE_DEF( void )
-  ft_glyphslot_free_bitmap( FT_GlyphSlot  slot )
-  {
-    if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) )
-    {
-      FT_Memory  memory = FT_FACE_MEMORY( slot->face );
-
-
-      FT_FREE( slot->bitmap.buffer );
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-    else
-    {
-      /* assume that the bitmap buffer was stolen or not */
-      /* allocated from the heap                         */
-      slot->bitmap.buffer = NULL;
-    }
-  }
-
-
-  FT_BASE_DEF( void )
-  ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
-                           FT_Byte*      buffer )
-  {
-    ft_glyphslot_free_bitmap( slot );
-
-    slot->bitmap.buffer = buffer;
-
-    FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  ft_glyphslot_alloc_bitmap( FT_GlyphSlot  slot,
-                             FT_ULong      size )
-  {
-    FT_Memory  memory = FT_FACE_MEMORY( slot->face );
-    FT_Error   error;
-
-
-    if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP )
-      FT_FREE( slot->bitmap.buffer );
-    else
-      slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
-
-    (void)FT_ALLOC( slot->bitmap.buffer, size );
-    return error;
-  }
-
-
-  static void
-  ft_glyphslot_clear( FT_GlyphSlot  slot )
-  {
-    /* free bitmap if needed */
-    ft_glyphslot_free_bitmap( slot );
-
-    /* clear all public fields in the glyph slot */
-    FT_ZERO( &slot->metrics );
-    FT_ZERO( &slot->outline );
-
-    slot->bitmap.width      = 0;
-    slot->bitmap.rows       = 0;
-    slot->bitmap.pitch      = 0;
-    slot->bitmap.pixel_mode = 0;
-    /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */
-
-    slot->bitmap_left   = 0;
-    slot->bitmap_top    = 0;
-    slot->num_subglyphs = 0;
-    slot->subglyphs     = NULL;
-    slot->control_data  = NULL;
-    slot->control_len   = 0;
-    slot->other         = NULL;
-    slot->format        = FT_GLYPH_FORMAT_NONE;
-
-    slot->linearHoriAdvance = 0;
-    slot->linearVertAdvance = 0;
-    slot->lsb_delta         = 0;
-    slot->rsb_delta         = 0;
-  }
-
-
-  static void
-  ft_glyphslot_done( FT_GlyphSlot  slot )
-  {
-    FT_Driver        driver = slot->face->driver;
-    FT_Driver_Class  clazz  = driver->clazz;
-    FT_Memory        memory = driver->root.memory;
-
-
-    if ( clazz->done_slot )
-      clazz->done_slot( slot );
-
-    /* free bitmap buffer if needed */
-    ft_glyphslot_free_bitmap( slot );
-
-    /* slot->internal might be NULL in out-of-memory situations */
-    if ( slot->internal )
-    {
-      /* free glyph loader */
-      if ( FT_DRIVER_USES_OUTLINES( driver ) )
-      {
-        FT_GlyphLoader_Done( slot->internal->loader );
-        slot->internal->loader = NULL;
-      }
-
-      FT_FREE( slot->internal );
-    }
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( FT_Error )
-  FT_New_GlyphSlot( FT_Face        face,
-                    FT_GlyphSlot  *aslot )
-  {
-    FT_Error         error;
-    FT_Driver        driver;
-    FT_Driver_Class  clazz;
-    FT_Memory        memory;
-    FT_GlyphSlot     slot = NULL;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !face->driver )
-      return FT_THROW( Invalid_Argument );
-
-    driver = face->driver;
-    clazz  = driver->clazz;
-    memory = driver->root.memory;
-
-    FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" ));
-    if ( !FT_ALLOC( slot, clazz->slot_object_size ) )
-    {
-      slot->face = face;
-
-      error = ft_glyphslot_init( slot );
-      if ( error )
-      {
-        ft_glyphslot_done( slot );
-        FT_FREE( slot );
-        goto Exit;
-      }
-
-      slot->next  = face->glyph;
-      face->glyph = slot;
-
-      if ( aslot )
-        *aslot = slot;
-    }
-    else if ( aslot )
-      *aslot = NULL;
-
-
-  Exit:
-    FT_TRACE4(( "FT_New_GlyphSlot: Return 0x%x\n", error ));
-
-    return error;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( void )
-  FT_Done_GlyphSlot( FT_GlyphSlot  slot )
-  {
-    if ( slot )
-    {
-      FT_Driver     driver = slot->face->driver;
-      FT_Memory     memory = driver->root.memory;
-      FT_GlyphSlot  prev;
-      FT_GlyphSlot  cur;
-
-
-      /* Remove slot from its parent face's list */
-      prev = NULL;
-      cur  = slot->face->glyph;
-
-      while ( cur )
-      {
-        if ( cur == slot )
-        {
-          if ( !prev )
-            slot->face->glyph = cur->next;
-          else
-            prev->next = cur->next;
-
-          /* finalize client-specific data */
-          if ( slot->generic.finalizer )
-            slot->generic.finalizer( slot );
-
-          ft_glyphslot_done( slot );
-          FT_FREE( slot );
-          break;
-        }
-        prev = cur;
-        cur  = cur->next;
-      }
-    }
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Set_Transform( FT_Face     face,
-                    FT_Matrix*  matrix,
-                    FT_Vector*  delta )
-  {
-    FT_Face_Internal  internal;
-
-
-    if ( !face )
-      return;
-
-    internal = face->internal;
-
-    internal->transform_flags = 0;
-
-    if ( !matrix )
-    {
-      internal->transform_matrix.xx = 0x10000L;
-      internal->transform_matrix.xy = 0;
-      internal->transform_matrix.yx = 0;
-      internal->transform_matrix.yy = 0x10000L;
-
-      matrix = &internal->transform_matrix;
-    }
-    else
-      internal->transform_matrix = *matrix;
-
-    /* set transform_flags bit flag 0 if `matrix' isn't the identity */
-    if ( ( matrix->xy | matrix->yx ) ||
-         matrix->xx != 0x10000L      ||
-         matrix->yy != 0x10000L      )
-      internal->transform_flags |= 1;
-
-    if ( !delta )
-    {
-      internal->transform_delta.x = 0;
-      internal->transform_delta.y = 0;
-
-      delta = &internal->transform_delta;
-    }
-    else
-      internal->transform_delta = *delta;
-
-    /* set transform_flags bit flag 1 if `delta' isn't the null vector */
-    if ( delta->x | delta->y )
-      internal->transform_flags |= 2;
-  }
-
-
-  static FT_Renderer
-  ft_lookup_glyph_renderer( FT_GlyphSlot  slot );
-
-
-#ifdef GRID_FIT_METRICS
-  static void
-  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot,
-                                 FT_Bool       vertical )
-  {
-    FT_Glyph_Metrics*  metrics = &slot->metrics;
-    FT_Pos             right, bottom;
-
-
-    if ( vertical )
-    {
-      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
-
-      right  = FT_PIX_CEIL( metrics->vertBearingX + metrics->width );
-      bottom = FT_PIX_CEIL( 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;
-    }
-    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 );
-
-      metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX );
-      metrics->horiBearingY = FT_PIX_CEIL ( metrics->horiBearingY );
-
-      metrics->width  = right - metrics->horiBearingX;
-      metrics->height = metrics->horiBearingY - bottom;
-    }
-
-    metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
-    metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
-  }
-#endif /* GRID_FIT_METRICS */
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Load_Glyph( FT_Face   face,
-                 FT_UInt   glyph_index,
-                 FT_Int32  load_flags )
-  {
-    FT_Error      error;
-    FT_Driver     driver;
-    FT_GlyphSlot  slot;
-    FT_Library    library;
-    FT_Bool       autohint = FALSE;
-    FT_Module     hinter;
-    TT_Face       ttface = (TT_Face)face;
-
-
-    if ( !face || !face->size || !face->glyph )
-      return FT_THROW( Invalid_Face_Handle );
-
-    /* The validity test for `glyph_index' is performed by the */
-    /* font drivers.                                           */
-
-    slot = face->glyph;
-    ft_glyphslot_clear( slot );
-
-    driver  = face->driver;
-    library = driver->root.library;
-    hinter  = library->auto_hinter;
-
-    /* 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;
-    }
-
-    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.
-     *
-     * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't
-     *   have a native font hinter.
-     *
-     * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't
-     *   any hinting bytecode in the TrueType/OpenType font.
-     *
-     * - Exception: The font is `tricky' and requires the native hinter to
-     *   load properly.
-     */
-
-    if ( hinter                                           &&
-         !( load_flags & FT_LOAD_NO_HINTING )             &&
-         !( load_flags & FT_LOAD_NO_AUTOHINT )            &&
-         FT_DRIVER_IS_SCALABLE( driver )                  &&
-         FT_DRIVER_USES_OUTLINES( driver )                &&
-         !FT_IS_TRICKY( face )                            &&
-         ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM )    ||
-           ( face->internal->transform_matrix.yx == 0 &&
-             face->internal->transform_matrix.xx != 0 ) ||
-           ( face->internal->transform_matrix.xx == 0 &&
-             face->internal->transform_matrix.yx != 0 ) ) )
-    {
-      if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) ||
-           !FT_DRIVER_HAS_HINTER( driver )         )
-        autohint = TRUE;
-      else
-      {
-        FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
-
-
-        /* the check for `num_locations' assures that we actually    */
-        /* test for instructions in a TTF and not in a CFF-based OTF */
-        /*                                                           */
-        /* since `maxSizeOfInstructions' might be unreliable, we     */
-        /* 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                   &&
-               !FT_DRIVER_HINTS_LIGHTLY( driver ) )             ||
-             ( FT_IS_SFNT( face )                             &&
-               ttface->num_locations                          &&
-               ttface->max_profile.maxSizeOfInstructions == 0 &&
-               ttface->font_program_size == 0                 &&
-               ttface->cvt_program_size == 0                  ) )
-          autohint = TRUE;
-      }
-    }
-
-    if ( autohint )
-    {
-      FT_AutoHinter_Interface  hinting;
-
-
-      /* try to load embedded bitmaps first if available            */
-      /*                                                            */
-      /* 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 )
-      {
-        error = driver->clazz->load_glyph( slot, face->size,
-                                           glyph_index,
-                                           load_flags | FT_LOAD_SBITS_ONLY );
-
-        if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP )
-          goto Load_Ok;
-      }
-
-      {
-        FT_Face_Internal  internal        = face->internal;
-        FT_Int            transform_flags = internal->transform_flags;
-
-
-        /* since the auto-hinter calls FT_Load_Glyph by itself, */
-        /* make sure that glyphs aren't transformed             */
-        internal->transform_flags = 0;
-
-        /* load auto-hinted outline */
-        hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface;
-
-        error   = hinting->load_glyph( (FT_AutoHinter)hinter,
-                                       slot, face->size,
-                                       glyph_index, load_flags );
-
-        internal->transform_flags = transform_flags;
-      }
-    }
-    else
-    {
-      error = driver->clazz->load_glyph( slot,
-                                         face->size,
-                                         glyph_index,
-                                         load_flags );
-      if ( error )
-        goto Exit;
-
-      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-      {
-        /* check that the loaded outline is correct */
-        error = FT_Outline_Check( &slot->outline );
-        if ( error )
-          goto Exit;
-
-#ifdef GRID_FIT_METRICS
-        if ( !( load_flags & FT_LOAD_NO_HINTING ) )
-          ft_glyphslot_grid_fit_metrics( slot,
-              FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) );
-#endif
-      }
-    }
-
-  Load_Ok:
-    /* compute the advance */
-    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-    {
-      slot->advance.x = 0;
-      slot->advance.y = slot->metrics.vertAdvance;
-    }
-    else
-    {
-      slot->advance.x = slot->metrics.horiAdvance;
-      slot->advance.y = 0;
-    }
-
-    /* compute the linear advance in 16.16 pixels */
-    if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 &&
-         ( FT_IS_SCALABLE( face ) )                  )
-    {
-      FT_Size_Metrics*  metrics = &face->size->metrics;
-
-
-      /* it's tricky! */
-      slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance,
-                                           metrics->x_scale, 64 );
-
-      slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance,
-                                           metrics->y_scale, 64 );
-    }
-
-    if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 )
-    {
-      FT_Face_Internal  internal = face->internal;
-
-
-      /* now, transform the glyph image if needed */
-      if ( internal->transform_flags )
-      {
-        /* get renderer */
-        FT_Renderer  renderer = ft_lookup_glyph_renderer( slot );
-
-
-        if ( renderer )
-          error = renderer->clazz->transform_glyph(
-                                     renderer, slot,
-                                     &internal->transform_matrix,
-                                     &internal->transform_delta );
-        else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-        {
-          /* apply `standard' transformation if no renderer is available */
-          if ( internal->transform_flags & 1 )
-            FT_Outline_Transform( &slot->outline,
-                                  &internal->transform_matrix );
-
-          if ( internal->transform_flags & 2 )
-            FT_Outline_Translate( &slot->outline,
-                                  internal->transform_delta.x,
-                                  internal->transform_delta.y );
-        }
-
-        /* transform advance */
-        FT_Vector_Transform( &slot->advance, &internal->transform_matrix );
-      }
-    }
-
-    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? */
-    if ( !error                                    &&
-         slot->format != FT_GLYPH_FORMAT_BITMAP    &&
-         slot->format != FT_GLYPH_FORMAT_COMPOSITE &&
-         load_flags & FT_LOAD_RENDER )
-    {
-      FT_Render_Mode  mode = FT_LOAD_TARGET_MODE( load_flags );
-
-
-      if ( mode == FT_RENDER_MODE_NORMAL      &&
-           (load_flags & FT_LOAD_MONOCHROME ) )
-        mode = FT_RENDER_MODE_MONO;
-
-      error = FT_Render_Glyph( slot, mode );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Load_Char( FT_Face   face,
-                FT_ULong  char_code,
-                FT_Int32  load_flags )
-  {
-    FT_UInt  glyph_index;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    glyph_index = (FT_UInt)char_code;
-    if ( face->charmap )
-      glyph_index = FT_Get_Char_Index( face, char_code );
-
-    return FT_Load_Glyph( face, glyph_index, load_flags );
-  }
-
-
-  /* destructor for sizes list */
-  static void
-  destroy_size( FT_Memory  memory,
-                FT_Size    size,
-                FT_Driver  driver )
-  {
-    /* finalize client-specific data */
-    if ( size->generic.finalizer )
-      size->generic.finalizer( size );
-
-    /* finalize format-specific stuff */
-    if ( driver->clazz->done_size )
-      driver->clazz->done_size( size );
-
-    FT_FREE( size->internal );
-    FT_FREE( size );
-  }
-
-
-  static void
-  ft_cmap_done_internal( FT_CMap  cmap );
-
-
-  static void
-  destroy_charmaps( FT_Face    face,
-                    FT_Memory  memory )
-  {
-    FT_Int  n;
-
-
-    if ( !face )
-      return;
-
-    for ( n = 0; n < face->num_charmaps; n++ )
-    {
-      FT_CMap  cmap = FT_CMAP( face->charmaps[n] );
-
-
-      ft_cmap_done_internal( cmap );
-
-      face->charmaps[n] = NULL;
-    }
-
-    FT_FREE( face->charmaps );
-    face->num_charmaps = 0;
-  }
-
-
-  /* destructor for faces list */
-  static void
-  destroy_face( FT_Memory  memory,
-                FT_Face    face,
-                FT_Driver  driver )
-  {
-    FT_Driver_Class  clazz = driver->clazz;
-
-
-    /* discard auto-hinting data */
-    if ( face->autohint.finalizer )
-      face->autohint.finalizer( face->autohint.data );
-
-    /* Discard glyph slots for this face.                           */
-    /* Beware!  FT_Done_GlyphSlot() changes the field `face->glyph' */
-    while ( face->glyph )
-      FT_Done_GlyphSlot( face->glyph );
-
-    /* discard all sizes for this face */
-    FT_List_Finalize( &face->sizes_list,
-                      (FT_List_Destructor)destroy_size,
-                      memory,
-                      driver );
-    face->size = NULL;
-
-    /* now discard client data */
-    if ( face->generic.finalizer )
-      face->generic.finalizer( face );
-
-    /* discard charmaps */
-    destroy_charmaps( face, memory );
-
-    /* finalize format-specific stuff */
-    if ( clazz->done_face )
-      clazz->done_face( face );
-
-    /* close the stream for this face if needed */
-    FT_Stream_Free(
-      face->stream,
-      ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
-
-    face->stream = NULL;
-
-    /* get rid of it */
-    if ( face->internal )
-    {
-      FT_FREE( face->internal );
-    }
-    FT_FREE( face );
-  }
-
-
-  static void
-  Destroy_Driver( FT_Driver  driver )
-  {
-    FT_List_Finalize( &driver->faces_list,
-                      (FT_List_Destructor)destroy_face,
-                      driver->root.memory,
-                      driver );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    find_unicode_charmap                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function finds a Unicode charmap, if there is one.            */
-  /*    And if there is more than one, it tries to favour the more         */
-  /*    extensive one, i.e., one that supports UCS-4 against those which   */
-  /*    are limited to the BMP (said UCS-2 encoding.)                      */
-  /*                                                                       */
-  /*    This function is called from open_face() (just below), and also    */
-  /*    from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ).                */
-  /*                                                                       */
-  static FT_Error
-  find_unicode_charmap( FT_Face  face )
-  {
-    FT_CharMap*  first;
-    FT_CharMap*  cur;
-
-
-    /* caller should have already checked that `face' is valid */
-    FT_ASSERT( face );
-
-    first = face->charmaps;
-
-    if ( !first )
-      return FT_THROW( Invalid_CharMap_Handle );
-
-    /*
-     *  The original TrueType specification(s) only specified charmap
-     *  formats that are capable of mapping 8 or 16 bit character codes to
-     *  glyph indices.
-     *
-     *  However, recent updates to the Apple and OpenType specifications
-     *  introduced new formats that are capable of mapping 32-bit character
-     *  codes as well.  And these are already used on some fonts, mainly to
-     *  map non-BMP Asian ideographs as defined in Unicode.
-     *
-     *  For compatibility purposes, these fonts generally come with
-     *  *several* Unicode charmaps:
-     *
-     *   - One of them in the "old" 16-bit format, that cannot access
-     *     all glyphs in the font.
-     *
-     *   - Another one in the "new" 32-bit format, that can access all
-     *     the glyphs.
-     *
-     *  This function has been written to always favor a 32-bit charmap
-     *  when found.  Otherwise, a 16-bit one is returned when found.
-     */
-
-    /* Since the `interesting' table, with IDs (3,10), is normally the */
-    /* last one, we loop backwards.  This loses with type1 fonts with  */
-    /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP  */
-    /* chars (.01% ?), and this is the same about 99.99% of the time!  */
-
-    cur = first + face->num_charmaps;  /* points after the last one */
-
-    for ( ; --cur >= first; )
-    {
-      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
-      {
-        /* XXX If some new encodings to represent UCS-4 are added, */
-        /*     they should be added here.                          */
-        if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT &&
-               cur[0]->encoding_id == TT_MS_ID_UCS_4        )     ||
-             ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE &&
-               cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32    ) )
-        {
-          face->charmap = cur[0];
-          return FT_Err_Ok;
-        }
-      }
-    }
-
-    /* We do not have any UCS-4 charmap.                */
-    /* Do the loop again and search for UCS-2 charmaps. */
-    cur = first + face->num_charmaps;
-
-    for ( ; --cur >= first; )
-    {
-      if ( cur[0]->encoding == FT_ENCODING_UNICODE )
-      {
-        face->charmap = cur[0];
-        return FT_Err_Ok;
-      }
-    }
-
-    return FT_THROW( Invalid_CharMap_Handle );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    find_variant_selector_charmap                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function finds the variant selector charmap, if there is one. */
-  /*    There can only be one (platform=0, specific=5, format=14).         */
-  /*                                                                       */
-  static FT_CharMap
-  find_variant_selector_charmap( FT_Face  face )
-  {
-    FT_CharMap*  first;
-    FT_CharMap*  end;
-    FT_CharMap*  cur;
-
-
-    /* caller should have already checked that `face' is valid */
-    FT_ASSERT( face );
-
-    first = face->charmaps;
-
-    if ( !first )
-      return NULL;
-
-    end = first + face->num_charmaps;  /* points after the last one */
-
-    for ( cur = first; cur < end; cur++ )
-    {
-      if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE    &&
-           cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR &&
-           FT_Get_CMap_Format( cur[0] ) == 14                  )
-        return cur[0];
-    }
-
-    return NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    open_face                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function does some work for FT_Open_Face().                   */
-  /*                                                                       */
-  static FT_Error
-  open_face( FT_Driver      driver,
-             FT_Stream      *astream,
-             FT_Bool        external_stream,
-             FT_Long        face_index,
-             FT_Int         num_params,
-             FT_Parameter*  params,
-             FT_Face       *aface )
-  {
-    FT_Memory         memory;
-    FT_Driver_Class   clazz;
-    FT_Face           face     = NULL;
-    FT_Face_Internal  internal = NULL;
-
-    FT_Error          error, error2;
-
-
-    clazz  = driver->clazz;
-    memory = driver->root.memory;
-
-    /* allocate the face object and perform basic initialization */
-    if ( FT_ALLOC( face, clazz->face_object_size ) )
-      goto Fail;
-
-    face->driver = driver;
-    face->memory = memory;
-    face->stream = *astream;
-
-    /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */
-    if ( external_stream )
-      face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM;
-
-    if ( FT_NEW( internal ) )
-      goto Fail;
-
-    face->internal = internal;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    {
-      int  i;
-
-
-      face->internal->incremental_interface = NULL;
-      for ( i = 0; i < num_params && !face->internal->incremental_interface;
-            i++ )
-        if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL )
-          face->internal->incremental_interface =
-            (FT_Incremental_Interface)params[i].data;
-    }
-#endif
-
-    if ( clazz->init_face )
-      error = clazz->init_face( *astream,
-                                face,
-                                (FT_Int)face_index,
-                                num_params,
-                                params );
-    *astream = face->stream; /* Stream may have been changed. */
-    if ( error )
-      goto Fail;
-
-    /* select Unicode charmap by default */
-    error2 = find_unicode_charmap( face );
-
-    /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */
-    /* is returned.                                                      */
-
-    /* no error should happen, but we want to play safe */
-    if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) )
-    {
-      error = error2;
-      goto Fail;
-    }
-
-    *aface = face;
-
-  Fail:
-    if ( error )
-    {
-      destroy_charmaps( face, memory );
-      if ( clazz->done_face )
-        clazz->done_face( face );
-      FT_FREE( internal );
-      FT_FREE( face );
-      *aface = NULL;
-    }
-
-    return error;
-  }
-
-
-  /* there's a Mac-specific extended implementation of FT_New_Face() */
-  /* in src/base/ftmac.c                                             */
-
-#ifndef FT_MACINTOSH
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Face( FT_Library   library,
-               const char*  pathname,
-               FT_Long      face_index,
-               FT_Face     *aface )
-  {
-    FT_Open_Args  args;
-
-
-    /* test for valid `library' and `aface' delayed to `FT_Open_Face' */
-    if ( !pathname )
-      return FT_THROW( Invalid_Argument );
-
-    args.flags    = FT_OPEN_PATHNAME;
-    args.pathname = (char*)pathname;
-    args.stream   = NULL;
-
-    return ft_open_face_internal( library, &args, face_index, aface, 1 );
-  }
-
-#endif
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Memory_Face( FT_Library      library,
-                      const FT_Byte*  file_base,
-                      FT_Long         file_size,
-                      FT_Long         face_index,
-                      FT_Face        *aface )
-  {
-    FT_Open_Args  args;
-
-
-    /* test for valid `library' and `face' delayed to `FT_Open_Face' */
-    if ( !file_base )
-      return FT_THROW( Invalid_Argument );
-
-    args.flags       = FT_OPEN_MEMORY;
-    args.memory_base = file_base;
-    args.memory_size = file_size;
-    args.stream      = NULL;
-
-    return ft_open_face_internal( library, &args, face_index, aface, 1 );
-  }
-
-
-#ifdef FT_CONFIG_OPTION_MAC_FONTS
-
-  /* The behavior here is very similar to that in base/ftmac.c, but it     */
-  /* is designed to work on non-mac systems, so no mac specific calls.     */
-  /*                                                                       */
-  /* We look at the file and determine if it is a mac dfont file or a mac  */
-  /* resource file, or a macbinary file containing a mac resource file.    */
-  /*                                                                       */
-  /* Unlike ftmac I'm not going to look at a `FOND'.  I don't really see   */
-  /* the point, especially since there may be multiple `FOND' resources.   */
-  /* Instead I'll just look for `sfnt' and `POST' resources, ordered as    */
-  /* they occur in the file.                                               */
-  /*                                                                       */
-  /* Note that multiple `POST' resources do not mean multiple postscript   */
-  /* fonts; they all get jammed together to make what is essentially a     */
-  /* pfb file.                                                             */
-  /*                                                                       */
-  /* We aren't interested in `NFNT' or `FONT' bitmap resources.            */
-  /*                                                                       */
-  /* As soon as we get an `sfnt' load it into memory and pass it off to    */
-  /* FT_Open_Face.                                                         */
-  /*                                                                       */
-  /* If we have a (set of) `POST' resources, massage them into a (memory)  */
-  /* pfb file and pass that to FT_Open_Face.  (As with ftmac.c I'm not     */
-  /* going to try to save the kerning info.  After all that lives in the   */
-  /* `FOND' which isn't in the file containing the `POST' resources so     */
-  /* we don't really have access to it.                                    */
-
-
-  /* Finalizer for a memory stream; gets called by FT_Done_Face(). */
-  /* It frees the memory it uses.                                  */
-  /* From `ftmac.c'.                                               */
-  static void
-  memory_stream_close( FT_Stream  stream )
-  {
-    FT_Memory  memory = stream->memory;
-
-
-    FT_FREE( stream->base );
-
-    stream->size  = 0;
-    stream->base  = NULL;
-    stream->close = NULL;
-  }
-
-
-  /* Create a new memory stream from a buffer and a size. */
-  /* From `ftmac.c'.                                      */
-  static FT_Error
-  new_memory_stream( FT_Library           library,
-                     FT_Byte*             base,
-                     FT_ULong             size,
-                     FT_Stream_CloseFunc  close,
-                     FT_Stream           *astream )
-  {
-    FT_Error   error;
-    FT_Memory  memory;
-    FT_Stream  stream = NULL;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !base )
-      return FT_THROW( Invalid_Argument );
-
-    *astream = NULL;
-    memory   = library->memory;
-    if ( FT_NEW( stream ) )
-      goto Exit;
-
-    FT_Stream_OpenMemory( stream, base, size );
-
-    stream->close = close;
-
-    *astream = stream;
-
-  Exit:
-    return error;
-  }
-
-
-  /* Create a new FT_Face given a buffer and a driver name. */
-  /* From `ftmac.c'.                                        */
-  FT_LOCAL_DEF( FT_Error )
-  open_face_from_buffer( FT_Library   library,
-                         FT_Byte*     base,
-                         FT_ULong     size,
-                         FT_Long      face_index,
-                         const char*  driver_name,
-                         FT_Face     *aface )
-  {
-    FT_Open_Args  args;
-    FT_Error      error;
-    FT_Stream     stream = NULL;
-    FT_Memory     memory = library->memory;
-
-
-    error = new_memory_stream( library,
-                               base,
-                               size,
-                               memory_stream_close,
-                               &stream );
-    if ( error )
-    {
-      FT_FREE( base );
-      return error;
-    }
-
-    args.flags  = FT_OPEN_STREAM;
-    args.stream = stream;
-    if ( driver_name )
-    {
-      args.flags  = args.flags | FT_OPEN_DRIVER;
-      args.driver = FT_Get_Module( library, driver_name );
-    }
-
-#ifdef FT_MACINTOSH
-    /* 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 &= 0x7FFF0000L; /* retain GX data */
-#endif
-
-    error = ft_open_face_internal( library, &args, face_index, aface, 0 );
-
-    if ( !error )
-      (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
-    else
-#ifdef FT_MACINTOSH
-      FT_Stream_Free( stream, 0 );
-#else
-    {
-      FT_Stream_Close( stream );
-      FT_FREE( stream );
-    }
-#endif
-
-    return error;
-  }
-
-
-  /* Look up `TYP1' or `CID ' table from sfnt table directory.       */
-  /* `offset' and `length' must exclude the binary header in tables. */
-
-  /* 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 unconditionally, we must parse the font by     */
-  /* ourselves.  We are only interested in the name of the table and */
-  /* the offset.                                                     */
-
-  static FT_Error
-  ft_lookup_PS_in_sfnt_stream( FT_Stream  stream,
-                               FT_Long    face_index,
-                               FT_ULong*  offset,
-                               FT_ULong*  length,
-                               FT_Bool*   is_sfnt_cid )
-  {
-    FT_Error   error;
-    FT_UShort  numTables;
-    FT_Long    pstable_index;
-    FT_ULong   tag;
-    int        i;
-
-
-    *offset = 0;
-    *length = 0;
-    *is_sfnt_cid = FALSE;
-
-    /* TODO: support for sfnt-wrapped PS/CID in TTC format */
-
-    /* version check for 'typ1' (should be ignored?) */
-    if ( FT_READ_ULONG( tag ) )
-      return error;
-    if ( tag != TTAG_typ1 )
-      return FT_THROW( Unknown_File_Format );
-
-    if ( FT_READ_USHORT( numTables ) )
-      return error;
-    if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */
-      return error;
-
-    pstable_index = -1;
-    *is_sfnt_cid  = FALSE;
-
-    for ( i = 0; i < numTables; i++ )
-    {
-      if ( FT_READ_ULONG( tag )     || FT_STREAM_SKIP( 4 )      ||
-           FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) )
-        return error;
-
-      if ( tag == TTAG_CID )
-      {
-        pstable_index++;
-        *offset += 22;
-        *length -= 22;
-        *is_sfnt_cid = TRUE;
-        if ( face_index < 0 )
-          return FT_Err_Ok;
-      }
-      else if ( tag == TTAG_TYP1 )
-      {
-        pstable_index++;
-        *offset += 24;
-        *length -= 24;
-        *is_sfnt_cid = FALSE;
-        if ( face_index < 0 )
-          return FT_Err_Ok;
-      }
-      if ( face_index >= 0 && pstable_index == face_index )
-        return FT_Err_Ok;
-    }
-
-    return FT_THROW( Table_Missing );
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  open_face_PS_from_sfnt_stream( FT_Library     library,
-                                 FT_Stream      stream,
-                                 FT_Long        face_index,
-                                 FT_Int         num_params,
-                                 FT_Parameter  *params,
-                                 FT_Face       *aface )
-  {
-    FT_Error   error;
-    FT_Memory  memory = library->memory;
-    FT_ULong   offset, length;
-    FT_ULong   pos;
-    FT_Bool    is_sfnt_cid;
-    FT_Byte*   sfnt_ps = NULL;
-
-    FT_UNUSED( num_params );
-    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,
-                                         face_index,
-                                         &offset,
-                                         &length,
-                                         &is_sfnt_cid );
-    if ( error )
-      goto Exit;
-
-    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 ) )
-      goto Exit;
-
-    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,
-                                   length,
-                                   FT_MIN( face_index, 0 ),
-                                   is_sfnt_cid ? "cid" : "type1",
-                                   aface );
-  Exit:
-    {
-      FT_Error  error1;
-
-
-      if ( FT_ERR_EQ( error, Unknown_File_Format ) )
-      {
-        error1 = FT_Stream_Seek( stream, pos );
-        if ( error1 )
-          return error1;
-      }
-
-      return error;
-    }
-  }
-
-
-#ifndef FT_MACINTOSH
-
-  /* The resource header says we've got resource_cnt `POST' (type1) */
-  /* resources in this file.  They all need to be coalesced into    */
-  /* one lump which gets passed on to the type1 driver.             */
-  /* Here can be only one PostScript font in a file so face_index   */
-  /* must be 0 (or -1).                                             */
-  /*                                                                */
-  static FT_Error
-  Mac_Read_POST_Resource( FT_Library  library,
-                          FT_Stream   stream,
-                          FT_Long    *offsets,
-                          FT_Long     resource_cnt,
-                          FT_Long     face_index,
-                          FT_Face    *aface )
-  {
-    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;
-    FT_ULong   pfb_len, pfb_pos, pfb_lenpos;
-    FT_ULong   rlen, temp;
-
-
-    if ( face_index == -1 )
-      face_index = 0;
-    if ( face_index != 0 )
-      return error;
-
-    /* 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++ )
-    {
-      error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] );
-      if ( error )
-        goto Exit;
-      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"
-                  " 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(( "             MacOS resource length cannot exceed"
-                    " 0x%08x\n",
-                    FT_MAC_RFORK_MAX_LEN ));
-
-        error = FT_THROW( Invalid_Offset );
-        goto Exit;
-      }
-
-      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(( "             too long fragment length makes"
-                  " 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;
-
-    pfb_data[0] = 0x80;
-    pfb_data[1] = 1;            /* Ascii section */
-    pfb_data[2] = 0;            /* 4-byte length, fill in later */
-    pfb_data[3] = 0;
-    pfb_data[4] = 0;
-    pfb_data[5] = 0;
-    pfb_pos     = 6;
-    pfb_lenpos  = 2;
-
-    len  = 0;
-    type = 1;
-
-    for ( i = 0; i < resource_cnt; i++ )
-    {
-      error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] );
-      if ( error )
-        goto Exit2;
-      if ( FT_READ_ULONG( rlen ) )
-        goto Exit2;
-
-      /* FT2 allocator takes signed long buffer length,
-       * too large fragment length causing overflow should be checked
-       */
-      if ( 0x7FFFFFFFUL < rlen )
-      {
-        error = FT_THROW( Invalid_Offset );
-        goto Exit2;
-      }
-
-      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 ));
-
-      error = FT_ERR( Array_Too_Large );
-
-      /* 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 ));
-        continue;
-      }
-
-      /* the flags are part of the resource, so rlen >= 2,  */
-      /* but some fonts declare rlen = 0 for empty fragment */
-      if ( rlen > 2 )
-        rlen -= 2;
-      else
-        rlen = 0;
-
-      if ( ( flags >> 8 ) == type )
-        len += rlen;
-      else
-      {
-        FT_TRACE3(( "    Write POST fragment #%d header (4-byte) to buffer"
-                    " %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 );
-        pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
-
-        if ( ( flags >> 8 ) == 5 )      /* End of font mark */
-          break;
-
-        FT_TRACE3(( "    Write POST fragment #%d header (6-byte) to buffer"
-                    " %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;
-
-        pfb_data[pfb_pos++] = (FT_Byte)type;
-        pfb_lenpos          = pfb_pos;
-        pfb_data[pfb_pos++] = 0;        /* 4-byte length, fill in later */
-        pfb_data[pfb_pos++] = 0;
-        pfb_data[pfb_pos++] = 0;
-        pfb_data[pfb_pos++] = 0;
-      }
-
-      if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len )
-        goto Exit2;
-
-      FT_TRACE3(( "    Load POST fragment #%d (%d byte) to buffer"
-                  " %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;
-    pfb_data[pfb_pos++] = 3;
-
-    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 );
-    pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 );
-
-    return open_face_from_buffer( library,
-                                  pfb_data,
-                                  pfb_pos,
-                                  face_index,
-                                  "type1",
-                                  aface );
-
-  Exit2:
-    if ( FT_ERR_EQ( error, Array_Too_Large ) )
-      FT_TRACE2(( "  Abort due to too-short buffer to store"
-                  " all POST fragments\n" ));
-    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 );
-
-  Exit:
-    return error;
-  }
-
-
-  /* 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 to the truetype driver, and return it.           */
-  /*                                                             */
-  static FT_Error
-  Mac_Read_sfnt_Resource( FT_Library  library,
-                          FT_Stream   stream,
-                          FT_Long    *offsets,
-                          FT_Long     resource_cnt,
-                          FT_Long     face_index,
-                          FT_Face    *aface )
-  {
-    FT_Memory  memory = library->memory;
-    FT_Byte*   sfnt_data = NULL;
-    FT_Error   error;
-    FT_ULong   flag_offset;
-    FT_Long    rlen;
-    int        is_cff;
-    FT_Long    face_index_in_resource = 0;
-
-
-    if ( face_index < 0 )
-      face_index = -face_index - 1;
-    if ( face_index >= resource_cnt )
-      return FT_THROW( Cannot_Open_Resource );
-
-    flag_offset = (FT_ULong)offsets[face_index];
-    error = FT_Stream_Seek( stream, flag_offset );
-    if ( error )
-      goto Exit;
-
-    if ( FT_READ_LONG( rlen ) )
-      goto Exit;
-    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,
-                                           face_index,
-                                           0, NULL,
-                                           aface );
-    if ( !error )
-      goto Exit;
-
-    /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */
-    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 ) {
-      FT_FREE( sfnt_data );
-      goto Exit;
-    }
-
-    is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
-    error = open_face_from_buffer( library,
-                                   sfnt_data,
-                                   (FT_ULong)rlen,
-                                   face_index_in_resource,
-                                   is_cff ? "cff" : "truetype",
-                                   aface );
-
-  Exit:
-    return error;
-  }
-
-
-  /* Check for a valid resource fork header, or a valid dfont    */
-  /* header.  In a resource fork the first 16 bytes are repeated */
-  /* at the location specified by bytes 4-7.  In a dfont bytes   */
-  /* 4-7 point to 16 bytes of zeroes instead.                    */
-  /*                                                             */
-  static FT_Error
-  IsMacResource( FT_Library  library,
-                 FT_Stream   stream,
-                 FT_Long     resource_offset,
-                 FT_Long     face_index,
-                 FT_Face    *aface )
-  {
-    FT_Memory  memory = library->memory;
-    FT_Error   error;
-    FT_Long    map_offset, rdata_pos;
-    FT_Long    *data_offsets;
-    FT_Long    count;
-
-
-    error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset,
-                                       &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, rdata_pos,
-                                        TTAG_POST, TRUE,
-                                        &data_offsets, &count );
-    if ( !error )
-    {
-      error = Mac_Read_POST_Resource( library, stream, data_offsets, count,
-                                      face_index, aface );
-      FT_FREE( data_offsets );
-      /* POST exists in an LWFN providing a single face */
-      if ( !error )
-        (*aface)->num_faces = 1;
-      return error;
-    }
-
-    /* sfnt resources should not be sorted to preserve the face order by
-       QuickDraw API */
-    error = FT_Raccess_Get_DataOffsets( library, stream,
-                                        map_offset, rdata_pos,
-                                        TTAG_sfnt, FALSE,
-                                        &data_offsets, &count );
-    if ( !error )
-    {
-      FT_Long  face_index_internal = face_index % count;
-
-
-      error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count,
-                                      face_index_internal, aface );
-      FT_FREE( data_offsets );
-      if ( !error )
-        (*aface)->num_faces = count;
-    }
-
-    return error;
-  }
-
-
-  /* Check for a valid macbinary header, and if we find one   */
-  /* check that the (flattened) resource fork in it is valid. */
-  /*                                                          */
-  static FT_Error
-  IsMacBinary( FT_Library  library,
-               FT_Stream   stream,
-               FT_Long     face_index,
-               FT_Face    *aface )
-  {
-    unsigned char  header[128];
-    FT_Error       error;
-    FT_Long        dlen, offset;
-
-
-    if ( !stream )
-      return FT_THROW( Invalid_Stream_Operation );
-
-    error = FT_Stream_Seek( stream, 0 );
-    if ( error )
-      goto Exit;
-
-    error = FT_Stream_Read( stream, (FT_Byte*)header, 128 );
-    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 ||
-                  header[0x53] > 0x7F )
-      return FT_THROW( Unknown_File_Format );
-
-    dlen = ( header[0x53] << 24 ) |
-           ( header[0x54] << 16 ) |
-           ( header[0x55] <<  8 ) |
-             header[0x56];
-#if 0
-    rlen = ( header[0x57] << 24 ) |
-           ( header[0x58] << 16 ) |
-           ( header[0x59] <<  8 ) |
-             header[0x5A];
-#endif /* 0 */
-    offset = 128 + ( ( dlen + 127 ) & ~127 );
-
-    return IsMacResource( library, stream, offset, face_index, aface );
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  load_face_in_embedded_rfork( FT_Library           library,
-                               FT_Stream            stream,
-                               FT_Long              face_index,
-                               FT_Face             *aface,
-                               const FT_Open_Args  *args )
-  {
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_raccess
-
-    FT_Memory  memory = library->memory;
-    FT_Error   error  = FT_ERR( Unknown_File_Format );
-    FT_UInt    i;
-
-    char *     file_names[FT_RACCESS_N_RULES];
-    FT_Long    offsets[FT_RACCESS_N_RULES];
-    FT_Error   errors[FT_RACCESS_N_RULES];
-    FT_Bool    is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */
-
-    FT_Open_Args  args2;
-    FT_Stream     stream2 = NULL;
-
-
-    FT_Raccess_Guess( library, stream,
-                      args->pathname, file_names, offsets, errors );
-
-    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
-    {
-      is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i );
-      if ( is_darwin_vfs && vfs_rfork_has_no_font )
-      {
-        FT_TRACE3(( "Skip rule %d: darwin vfs resource fork"
-                    " is already checked and"
-                    " no font is found\n",
-                    i ));
-        continue;
-      }
-
-      if ( errors[i] )
-      {
-        FT_TRACE3(( "Error 0x%x has occurred in rule %d\n",
-                    errors[i], i ));
-        continue;
-      }
-
-      args2.flags    = FT_OPEN_PATHNAME;
-      args2.pathname = file_names[i] ? file_names[i] : args->pathname;
-
-      FT_TRACE3(( "Try rule %d: %s (offset=%d) ...",
-                  i, args2.pathname, offsets[i] ));
-
-      error = FT_Stream_New( library, &args2, &stream2 );
-      if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) )
-        vfs_rfork_has_no_font = TRUE;
-
-      if ( error )
-      {
-        FT_TRACE3(( "failed\n" ));
-        continue;
-      }
-
-      error = IsMacResource( library, stream2, offsets[i],
-                             face_index, aface );
-      FT_Stream_Free( stream2, 0 );
-
-      FT_TRACE3(( "%s\n", error ? "failed": "successful" ));
-
-      if ( !error )
-          break;
-      else if ( is_darwin_vfs )
-          vfs_rfork_has_no_font = TRUE;
-    }
-
-    for (i = 0; i < FT_RACCESS_N_RULES; i++)
-    {
-      if ( file_names[i] )
-        FT_FREE( file_names[i] );
-    }
-
-    /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */
-    if ( error )
-      error = FT_ERR( Unknown_File_Format );
-
-    return error;
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_objs
-
-  }
-
-
-  /* Check for some macintosh formats without Carbon framework.    */
-  /* Is this a macbinary file?  If so look at the resource fork.   */
-  /* Is this a mac dfont file?                                     */
-  /* Is this an old style resource fork? (in data)                 */
-  /* Else call load_face_in_embedded_rfork to try extra rules      */
-  /* (defined in `ftrfork.c').                                     */
-  /*                                                               */
-  static FT_Error
-  load_mac_face( FT_Library           library,
-                 FT_Stream            stream,
-                 FT_Long              face_index,
-                 FT_Face             *aface,
-                 const FT_Open_Args  *args )
-  {
-    FT_Error error;
-    FT_UNUSED( args );
-
-
-    error = IsMacBinary( library, stream, face_index, aface );
-    if ( FT_ERR_EQ( error, Unknown_File_Format ) )
-    {
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_raccess
-
-#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 );
-
-      FT_TRACE3(( "%s\n", error ? "failed" : "successful" ));
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_objs
-
-    }
-
-    if ( ( FT_ERR_EQ( error, Unknown_File_Format )      ||
-           FT_ERR_EQ( error, Invalid_Stream_Operation ) ) &&
-         ( args->flags & FT_OPEN_PATHNAME )               )
-      error = load_face_in_embedded_rfork( library, stream,
-                                           face_index, aface, args );
-    return error;
-  }
-#endif
-
-#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Open_Face( FT_Library           library,
-                const FT_Open_Args*  args,
-                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;
-    FT_Stream    stream = NULL;
-    FT_Face      face   = NULL;
-    FT_ListNode  node   = NULL;
-    FT_Bool      external_stream;
-    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' */
-
-    if ( ( !aface && face_index >= 0 ) || !args )
-      return FT_THROW( Invalid_Argument );
-
-    external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) &&
-                               args->stream                     );
-
-    /* create input stream */
-    error = FT_Stream_New( library, args, &stream );
-    if ( error )
-      goto Fail3;
-
-    memory = library->memory;
-
-    /* If the font driver is specified in the `args' structure, use */
-    /* it.  Otherwise, we scan the list of registered drivers.      */
-    if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver )
-    {
-      driver = FT_DRIVER( args->driver );
-
-      /* not all modules are drivers, so check... */
-      if ( FT_MODULE_IS_DRIVER( driver ) )
-      {
-        FT_Int         num_params = 0;
-        FT_Parameter*  params     = NULL;
-
-
-        if ( args->flags & FT_OPEN_PARAMS )
-        {
-          num_params = args->num_params;
-          params     = args->params;
-        }
-
-        error = open_face( driver, &stream, external_stream, face_index,
-                           num_params, params, &face );
-        if ( !error )
-          goto Success;
-      }
-      else
-        error = FT_THROW( Invalid_Handle );
-
-      FT_Stream_Free( stream, external_stream );
-      goto Fail;
-    }
-    else
-    {
-      error = FT_ERR( Missing_Module );
-
-      /* check each font driver for an appropriate format */
-      cur   = library->modules;
-      limit = cur + library->num_modules;
-
-      for ( ; cur < limit; cur++ )
-      {
-        /* not all modules are font drivers, so check... */
-        if ( FT_MODULE_IS_DRIVER( cur[0] ) )
-        {
-          FT_Int         num_params = 0;
-          FT_Parameter*  params     = NULL;
-
-
-          driver = FT_DRIVER( cur[0] );
-
-          if ( args->flags & FT_OPEN_PARAMS )
-          {
-            num_params = args->num_params;
-            params     = args->params;
-          }
-
-          error = open_face( driver, &stream, external_stream, face_index,
-                             num_params, params, &face );
-          if ( !error )
-            goto Success;
-
-#ifdef FT_CONFIG_OPTION_MAC_FONTS
-          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 */
-            error = FT_Stream_Seek( stream, 0 );
-            if ( error )
-              break;
-
-            error = open_face_PS_from_sfnt_stream( library,
-                                                   stream,
-                                                   face_index,
-                                                   num_params,
-                                                   params,
-                                                   aface );
-            if ( !error )
-            {
-              FT_Stream_Free( stream, external_stream );
-              return error;
-            }
-          }
-#endif
-
-          if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
-            goto Fail3;
-        }
-      }
-
-    Fail3:
-      /* If we are on the mac, and we get an                          */
-      /* FT_Err_Invalid_Stream_Operation it may be because we have an */
-      /* empty data fork, so we need to check the resource fork.      */
-      if ( FT_ERR_NEQ( error, Cannot_Open_Stream )       &&
-           FT_ERR_NEQ( error, Unknown_File_Format )      &&
-           FT_ERR_NEQ( error, Invalid_Stream_Operation ) )
-        goto Fail2;
-
-#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS )
-      if ( test_mac_fonts )
-      {
-        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 ) )
-        goto Fail2;
-#endif  /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */
-
-      /* no driver is able to handle this format */
-      error = FT_THROW( Unknown_File_Format );
-
-  Fail2:
-      FT_Stream_Free( stream, external_stream );
-      goto Fail;
-    }
-
-  Success:
-    FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" ));
-
-    /* add the face object to its driver's list */
-    if ( FT_NEW( node ) )
-      goto Fail;
-
-    node->data = face;
-    /* don't assume driver is the same as face->driver, so use */
-    /* face->driver instead.                                   */
-    FT_List_Add( &face->driver->faces_list, node );
-
-    /* now allocate a glyph slot object for the face */
-    FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" ));
-
-    if ( face_index >= 0 )
-    {
-      error = FT_New_GlyphSlot( face, NULL );
-      if ( error )
-        goto Fail;
-
-      /* finally, allocate a size object for the face */
-      {
-        FT_Size  size;
-
-
-        FT_TRACE4(( "FT_Open_Face: Creating size object\n" ));
-
-        error = FT_New_Size( face, &size );
-        if ( error )
-          goto Fail;
-
-        face->size = size;
-      }
-    }
-
-    /* some checks */
-
-    if ( FT_IS_SCALABLE( face ) )
-    {
-      if ( face->height < 0 )
-        face->height = (FT_Short)-face->height;
-
-      if ( !FT_HAS_VERTICAL( face ) )
-        face->max_advance_height = (FT_Short)face->height;
-    }
-
-    if ( FT_HAS_FIXED_SIZES( face ) )
-    {
-      FT_Int  i;
-
-
-      for ( i = 0; i < face->num_fixed_sizes; i++ )
-      {
-        FT_Bitmap_Size*  bsize = face->available_sizes + i;
-
-
-        if ( bsize->height < 0 )
-          bsize->height = -bsize->height;
-        if ( bsize->x_ppem < 0 )
-          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 stroke %d,"
-                      " now disabled\n", i ));
-          bsize->width  = 0;
-          bsize->height = 0;
-          bsize->size   = 0;
-          bsize->x_ppem = 0;
-          bsize->y_ppem = 0;
-        }
-      }
-    }
-
-    /* initialize internal face data */
-    {
-      FT_Face_Internal  internal = face->internal;
-
-
-      internal->transform_matrix.xx = 0x10000L;
-      internal->transform_matrix.xy = 0;
-      internal->transform_matrix.yx = 0;
-      internal->transform_matrix.yy = 0x10000L;
-
-      internal->transform_delta.x = 0;
-      internal->transform_delta.y = 0;
-
-      internal->refcount = 1;
-    }
-
-    if ( aface )
-      *aface = face;
-    else
-      FT_Done_Face( face );
-
-    goto Exit;
-
-  Fail:
-    if ( node )
-      FT_Done_Face( face );    /* face must be in the driver's list */
-    else if ( face )
-      destroy_face( memory, face, driver );
-
-  Exit:
-#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;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Attach_File( FT_Face      face,
-                  const char*  filepathname )
-  {
-    FT_Open_Args  open;
-
-
-    /* test for valid `face' delayed to `FT_Attach_Stream' */
-
-    if ( !filepathname )
-      return FT_THROW( Invalid_Argument );
-
-    open.stream   = NULL;
-    open.flags    = FT_OPEN_PATHNAME;
-    open.pathname = (char*)filepathname;
-
-    return FT_Attach_Stream( face, &open );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Attach_Stream( FT_Face        face,
-                    FT_Open_Args*  parameters )
-  {
-    FT_Stream  stream;
-    FT_Error   error;
-    FT_Driver  driver;
-
-    FT_Driver_Class  clazz;
-
-
-    /* test for valid `parameters' delayed to `FT_Stream_New' */
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    driver = face->driver;
-    if ( !driver )
-      return FT_THROW( Invalid_Driver_Handle );
-
-    error = FT_Stream_New( driver->root.library, parameters, &stream );
-    if ( error )
-      goto Exit;
-
-    /* we implement FT_Attach_Stream in each driver through the */
-    /* `attach_file' interface                                  */
-
-    error = FT_ERR( Unimplemented_Feature );
-    clazz = driver->clazz;
-    if ( clazz->attach_file )
-      error = clazz->attach_file( face, stream );
-
-    /* close the attached stream */
-    FT_Stream_Free( stream,
-                    (FT_Bool)( parameters->stream &&
-                               ( parameters->flags & FT_OPEN_STREAM ) ) );
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Reference_Face( FT_Face  face )
-  {
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    face->internal->refcount++;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Done_Face( FT_Face  face )
-  {
-    FT_Error     error;
-    FT_Driver    driver;
-    FT_Memory    memory;
-    FT_ListNode  node;
-
-
-    error = FT_ERR( Invalid_Face_Handle );
-    if ( face && face->driver )
-    {
-      face->internal->refcount--;
-      if ( face->internal->refcount > 0 )
-        error = FT_Err_Ok;
-      else
-      {
-        driver = face->driver;
-        memory = driver->root.memory;
-
-        /* find face in driver's list */
-        node = FT_List_Find( &driver->faces_list, face );
-        if ( node )
-        {
-          /* remove face object from the driver's list */
-          FT_List_Remove( &driver->faces_list, node );
-          FT_FREE( node );
-
-          /* now destroy the object proper */
-          destroy_face( memory, face, driver );
-          error = FT_Err_Ok;
-        }
-      }
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Size( FT_Face   face,
-               FT_Size  *asize )
-  {
-    FT_Error         error;
-    FT_Memory        memory;
-    FT_Driver        driver;
-    FT_Driver_Class  clazz;
-
-    FT_Size          size = NULL;
-    FT_ListNode      node = NULL;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !asize )
-      return FT_THROW( Invalid_Argument );
-
-    if ( !face->driver )
-      return FT_THROW( Invalid_Driver_Handle );
-
-    *asize = NULL;
-
-    driver = face->driver;
-    clazz  = driver->clazz;
-    memory = face->memory;
-
-    /* Allocate new size object and perform basic initialisation */
-    if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) )
-      goto Exit;
-
-    size->face = face;
-
-    /* for now, do not use any internal fields in size objects */
-    size->internal = NULL;
-
-    if ( clazz->init_size )
-      error = clazz->init_size( size );
-
-    /* in case of success, add to the face's list */
-    if ( !error )
-    {
-      *asize     = size;
-      node->data = size;
-      FT_List_Add( &face->sizes_list, node );
-    }
-
-  Exit:
-    if ( error )
-    {
-      FT_FREE( node );
-      FT_FREE( size );
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Done_Size( FT_Size  size )
-  {
-    FT_Error     error;
-    FT_Driver    driver;
-    FT_Memory    memory;
-    FT_Face      face;
-    FT_ListNode  node;
-
-
-    if ( !size )
-      return FT_THROW( Invalid_Size_Handle );
-
-    face = size->face;
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    driver = face->driver;
-    if ( !driver )
-      return FT_THROW( Invalid_Driver_Handle );
-
-    memory = driver->root.memory;
-
-    error = FT_Err_Ok;
-    node  = FT_List_Find( &face->sizes_list, size );
-    if ( node )
-    {
-      FT_List_Remove( &face->sizes_list, node );
-      FT_FREE( node );
-
-      if ( face->size == size )
-      {
-        face->size = NULL;
-        if ( face->sizes_list.head )
-          face->size = (FT_Size)(face->sizes_list.head->data);
-      }
-
-      destroy_size( memory, size, driver );
-    }
-    else
-      error = FT_THROW( Invalid_Size_Handle );
-
-    return error;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( FT_Error )
-  FT_Match_Size( FT_Face          face,
-                 FT_Size_Request  req,
-                 FT_Bool          ignore_width,
-                 FT_ULong*        size_index )
-  {
-    FT_Int   i;
-    FT_Long  w, h;
-
-
-    if ( !FT_HAS_FIXED_SIZES( face ) )
-      return FT_THROW( Invalid_Face_Handle );
-
-    /* FT_Bitmap_Size doesn't provide enough info... */
-    if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
-      return FT_THROW( Unimplemented_Feature );
-
-    w = FT_REQUEST_WIDTH ( req );
-    h = FT_REQUEST_HEIGHT( req );
-
-    if ( req->width && !req->height )
-      h = w;
-    else if ( !req->width && req->height )
-      w = h;
-
-    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;
-
-
-      if ( h != FT_PIX_ROUND( bsize->y_ppem ) )
-        continue;
-
-      if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width )
-      {
-        FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i ));
-
-        if ( size_index )
-          *size_index = (FT_ULong)i;
-
-        return FT_Err_Ok;
-      }
-    }
-
-    FT_TRACE3(( "FT_Match_Size: no matching bitmap strike\n" ));
-
-    return FT_THROW( Invalid_Pixel_Size );
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( void )
-  ft_synthesize_vertical_metrics( FT_Glyph_Metrics*  metrics,
-                                  FT_Pos             advance )
-  {
-    FT_Pos  height = metrics->height;
-
-
-    /* compensate for glyph with bbox above/below the baseline */
-    if ( metrics->horiBearingY < 0 )
-    {
-      if ( height < metrics->horiBearingY )
-        height = metrics->horiBearingY;
-    }
-    else if ( metrics->horiBearingY > 0 )
-      height -= metrics->horiBearingY;
-
-    /* the factor 1.2 is a heuristical value */
-    if ( !advance )
-      advance = height * 12 / 10;
-
-    metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2;
-    metrics->vertBearingY = ( advance - height ) / 2;
-    metrics->vertAdvance  = advance;
-  }
-
-
-  static void
-  ft_recompute_scaled_metrics( FT_Face           face,
-                               FT_Size_Metrics*  metrics )
-  {
-    /* Compute root ascender, descender, test height, and max_advance */
-
-#ifdef GRID_FIT_METRICS
-    metrics->ascender    = FT_PIX_CEIL( FT_MulFix( face->ascender,
-                                                   metrics->y_scale ) );
-
-    metrics->descender   = FT_PIX_FLOOR( FT_MulFix( face->descender,
-                                                    metrics->y_scale ) );
-
-    metrics->height      = FT_PIX_ROUND( FT_MulFix( face->height,
-                                                    metrics->y_scale ) );
-
-    metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width,
-                                                    metrics->x_scale ) );
-#else /* !GRID_FIT_METRICS */
-    metrics->ascender    = FT_MulFix( face->ascender,
-                                      metrics->y_scale );
-
-    metrics->descender   = FT_MulFix( face->descender,
-                                      metrics->y_scale );
-
-    metrics->height      = FT_MulFix( face->height,
-                                      metrics->y_scale );
-
-    metrics->max_advance = FT_MulFix( face->max_advance_width,
-                                      metrics->x_scale );
-#endif /* !GRID_FIT_METRICS */
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Select_Metrics( FT_Face   face,
-                     FT_ULong  strike_index )
-  {
-    FT_Size_Metrics*  metrics;
-    FT_Bitmap_Size*   bsize;
-
-
-    metrics = &face->size->metrics;
-    bsize   = face->available_sizes + strike_index;
-
-    metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 );
-    metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 );
-
-    if ( FT_IS_SCALABLE( face ) )
-    {
-      metrics->x_scale = FT_DivFix( bsize->x_ppem,
-                                    face->units_per_EM );
-      metrics->y_scale = FT_DivFix( bsize->y_ppem,
-                                    face->units_per_EM );
-
-      ft_recompute_scaled_metrics( face, metrics );
-    }
-    else
-    {
-      metrics->x_scale     = 1L << 16;
-      metrics->y_scale     = 1L << 16;
-      metrics->ascender    = bsize->y_ppem;
-      metrics->descender   = 0;
-      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 ));
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Request_Metrics( FT_Face          face,
-                      FT_Size_Request  req )
-  {
-    FT_Size_Metrics*  metrics;
-
-
-    metrics = &face->size->metrics;
-
-    if ( FT_IS_SCALABLE( face ) )
-    {
-      FT_Long  w = 0, h = 0, scaled_w = 0, scaled_h = 0;
-
-
-      switch ( req->type )
-      {
-      case FT_SIZE_REQUEST_TYPE_NOMINAL:
-        w = h = face->units_per_EM;
-        break;
-
-      case FT_SIZE_REQUEST_TYPE_REAL_DIM:
-        w = h = face->ascender - face->descender;
-        break;
-
-      case FT_SIZE_REQUEST_TYPE_BBOX:
-        w = face->bbox.xMax - face->bbox.xMin;
-        h = face->bbox.yMax - face->bbox.yMin;
-        break;
-
-      case FT_SIZE_REQUEST_TYPE_CELL:
-        w = face->max_advance_width;
-        h = face->ascender - face->descender;
-        break;
-
-      case FT_SIZE_REQUEST_TYPE_SCALES:
-        metrics->x_scale = (FT_Fixed)req->width;
-        metrics->y_scale = (FT_Fixed)req->height;
-        if ( !metrics->x_scale )
-          metrics->x_scale = metrics->y_scale;
-        else if ( !metrics->y_scale )
-          metrics->y_scale = metrics->x_scale;
-        goto Calculate_Ppem;
-
-      case FT_SIZE_REQUEST_TYPE_MAX:
-        break;
-      }
-
-      /* to be on the safe side */
-      if ( w < 0 )
-        w = -w;
-
-      if ( h < 0 )
-        h = -h;
-
-      scaled_w = FT_REQUEST_WIDTH ( req );
-      scaled_h = FT_REQUEST_HEIGHT( req );
-
-      /* determine scales */
-      if ( req->width )
-      {
-        metrics->x_scale = FT_DivFix( scaled_w, w );
-
-        if ( req->height )
-        {
-          metrics->y_scale = FT_DivFix( scaled_h, h );
-
-          if ( req->type == FT_SIZE_REQUEST_TYPE_CELL )
-          {
-            if ( metrics->y_scale > metrics->x_scale )
-              metrics->y_scale = metrics->x_scale;
-            else
-              metrics->x_scale = metrics->y_scale;
-          }
-        }
-        else
-        {
-          metrics->y_scale = metrics->x_scale;
-          scaled_h = FT_MulDiv( scaled_w, h, w );
-        }
-      }
-      else
-      {
-        metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h );
-        scaled_w = FT_MulDiv( scaled_h, w, h );
-      }
-
-  Calculate_Ppem:
-      /* calculate the ppems */
-      if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL )
-      {
-        scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale );
-        scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale );
-      }
-
-      metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 );
-      metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 );
-
-      ft_recompute_scaled_metrics( face, metrics );
-    }
-    else
-    {
-      FT_ZERO( metrics );
-      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 ));
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Select_Size( FT_Face  face,
-                  FT_Int   strike_index )
-  {
-    FT_Driver_Class  clazz;
-
-
-    if ( !face || !FT_HAS_FIXED_SIZES( face ) )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( strike_index < 0 || strike_index >= face->num_fixed_sizes )
-      return FT_THROW( Invalid_Argument );
-
-    clazz = face->driver->clazz;
-
-    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 (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_Select_Metrics( face, (FT_ULong)strike_index );
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Request_Size( FT_Face          face,
-                   FT_Size_Request  req )
-  {
-    FT_Driver_Class  clazz;
-    FT_ULong         strike_index;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !req || req->width < 0 || req->height < 0 ||
-         req->type >= FT_SIZE_REQUEST_TYPE_MAX )
-      return FT_THROW( Invalid_Argument );
-
-    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;
-    }
-
-    /*
-     * 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 ) )
-    {
-      FT_Error  error;
-
-
-      error = FT_Match_Size( face, req, 0, &strike_index );
-      if ( error )
-        return error;
-
-      return FT_Select_Size( face, (FT_Int)strike_index );
-    }
-
-    FT_Request_Metrics( face, req );
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Char_Size( FT_Face     face,
-                    FT_F26Dot6  char_width,
-                    FT_F26Dot6  char_height,
-                    FT_UInt     horz_resolution,
-                    FT_UInt     vert_resolution )
-  {
-    FT_Size_RequestRec  req;
-
-
-    /* check of `face' delayed to `FT_Request_Size' */
-
-    if ( !char_width )
-      char_width = char_height;
-    else if ( !char_height )
-      char_height = char_width;
-
-    if ( !horz_resolution )
-      horz_resolution = vert_resolution;
-    else if ( !vert_resolution )
-      vert_resolution = horz_resolution;
-
-    if ( char_width  < 1 * 64 )
-      char_width  = 1 * 64;
-    if ( char_height < 1 * 64 )
-      char_height = 1 * 64;
-
-    if ( !horz_resolution )
-      horz_resolution = vert_resolution = 72;
-
-    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
-    req.width          = char_width;
-    req.height         = char_height;
-    req.horiResolution = horz_resolution;
-    req.vertResolution = vert_resolution;
-
-    return FT_Request_Size( face, &req );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Pixel_Sizes( FT_Face  face,
-                      FT_UInt  pixel_width,
-                      FT_UInt  pixel_height )
-  {
-    FT_Size_RequestRec  req;
-
-
-    /* check of `face' delayed to `FT_Request_Size' */
-
-    if ( pixel_width == 0 )
-      pixel_width = pixel_height;
-    else if ( pixel_height == 0 )
-      pixel_height = pixel_width;
-
-    if ( pixel_width  < 1 )
-      pixel_width  = 1;
-    if ( pixel_height < 1 )
-      pixel_height = 1;
-
-    /* use `>=' to avoid potential compiler warning on 16bit platforms */
-    if ( pixel_width >= 0xFFFFU )
-      pixel_width = 0xFFFFU;
-    if ( pixel_height >= 0xFFFFU )
-      pixel_height = 0xFFFFU;
-
-    req.type           = FT_SIZE_REQUEST_TYPE_NOMINAL;
-    req.width          = (FT_Long)( pixel_width << 6 );
-    req.height         = (FT_Long)( pixel_height << 6 );
-    req.horiResolution = 0;
-    req.vertResolution = 0;
-
-    return FT_Request_Size( face, &req );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Kerning( FT_Face     face,
-                  FT_UInt     left_glyph,
-                  FT_UInt     right_glyph,
-                  FT_UInt     kern_mode,
-                  FT_Vector  *akerning )
-  {
-    FT_Error   error = FT_Err_Ok;
-    FT_Driver  driver;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !akerning )
-      return FT_THROW( Invalid_Argument );
-
-    driver = face->driver;
-
-    akerning->x = 0;
-    akerning->y = 0;
-
-    if ( driver->clazz->get_kerning )
-    {
-      error = driver->clazz->get_kerning( face,
-                                          left_glyph,
-                                          right_glyph,
-                                          akerning );
-      if ( !error )
-      {
-        if ( kern_mode != FT_KERNING_UNSCALED )
-        {
-          akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale );
-          akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale );
-
-          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( orig_x,
-                                       face->size->metrics.x_ppem, 25 );
-            if ( face->size->metrics.y_ppem < 25 )
-              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
-          }
-        }
-      }
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Track_Kerning( FT_Face    face,
-                        FT_Fixed   point_size,
-                        FT_Int     degree,
-                        FT_Fixed*  akerning )
-  {
-    FT_Service_Kerning  service;
-    FT_Error            error = FT_Err_Ok;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !akerning )
-      return FT_THROW( Invalid_Argument );
-
-    FT_FACE_FIND_SERVICE( face, service, KERNING );
-    if ( !service )
-      return FT_THROW( Unimplemented_Feature );
-
-    error = service->get_track( face,
-                                point_size,
-                                degree,
-                                akerning );
-
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Select_Charmap( FT_Face      face,
-                     FT_Encoding  encoding )
-  {
-    FT_CharMap*  cur;
-    FT_CharMap*  limit;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( encoding == FT_ENCODING_NONE )
-      return FT_THROW( Invalid_Argument );
-
-    /* FT_ENCODING_UNICODE is special.  We try to find the `best' Unicode */
-    /* charmap available, i.e., one with UCS-4 characters, if possible.   */
-    /*                                                                    */
-    /* This is done by find_unicode_charmap() above, to share code.       */
-    if ( encoding == FT_ENCODING_UNICODE )
-      return find_unicode_charmap( face );
-
-    cur = face->charmaps;
-    if ( !cur )
-      return FT_THROW( Invalid_CharMap_Handle );
-
-    limit = cur + face->num_charmaps;
-
-    for ( ; cur < limit; cur++ )
-    {
-      if ( cur[0]->encoding == encoding )
-      {
-        face->charmap = cur[0];
-        return 0;
-      }
-    }
-
-    return FT_THROW( Invalid_Argument );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Charmap( FT_Face     face,
-                  FT_CharMap  charmap )
-  {
-    FT_CharMap*  cur;
-    FT_CharMap*  limit;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    cur = face->charmaps;
-    if ( !cur || !charmap )
-      return FT_THROW( Invalid_CharMap_Handle );
-
-    if ( FT_Get_CMap_Format( charmap ) == 14 )
-      return FT_THROW( Invalid_Argument );
-
-    limit = cur + face->num_charmaps;
-
-    for ( ; cur < limit; cur++ )
-    {
-      if ( cur[0] == charmap )
-      {
-        face->charmap = cur[0];
-        return FT_Err_Ok;
-      }
-    }
-
-    return FT_THROW( Invalid_Argument );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Int )
-  FT_Get_Charmap_Index( FT_CharMap  charmap )
-  {
-    FT_Int  i;
-
-
-    if ( !charmap || !charmap->face )
-      return -1;
-
-    for ( i = 0; i < charmap->face->num_charmaps; i++ )
-      if ( charmap->face->charmaps[i] == charmap )
-        break;
-
-    FT_ASSERT( i < charmap->face->num_charmaps );
-
-    return i;
-  }
-
-
-  static void
-  ft_cmap_done_internal( FT_CMap  cmap )
-  {
-    FT_CMap_Class  clazz  = cmap->clazz;
-    FT_Face        face   = cmap->charmap.face;
-    FT_Memory      memory = FT_FACE_MEMORY( face );
-
-
-    if ( clazz->done )
-      clazz->done( cmap );
-
-    FT_FREE( cmap );
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_CMap_Done( FT_CMap  cmap )
-  {
-    if ( cmap )
-    {
-      FT_Face    face   = cmap->charmap.face;
-      FT_Memory  memory = FT_FACE_MEMORY( face );
-      FT_Error   error;
-      FT_Int     i, j;
-
-
-      for ( i = 0; i < face->num_charmaps; i++ )
-      {
-        if ( (FT_CMap)face->charmaps[i] == cmap )
-        {
-          FT_CharMap  last_charmap = face->charmaps[face->num_charmaps - 1];
-
-
-          if ( FT_RENEW_ARRAY( face->charmaps,
-                               face->num_charmaps,
-                               face->num_charmaps - 1 ) )
-            return;
-
-          /* remove it from our list of charmaps */
-          for ( j = i + 1; j < face->num_charmaps; j++ )
-          {
-            if ( j == face->num_charmaps - 1 )
-              face->charmaps[j - 1] = last_charmap;
-            else
-              face->charmaps[j - 1] = face->charmaps[j];
-          }
-
-          face->num_charmaps--;
-
-          if ( (FT_CMap)face->charmap == cmap )
-            face->charmap = NULL;
-
-          ft_cmap_done_internal( cmap );
-
-          break;
-        }
-      }
-    }
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_CMap_New( FT_CMap_Class  clazz,
-               FT_Pointer     init_data,
-               FT_CharMap     charmap,
-               FT_CMap       *acmap )
-  {
-    FT_Error   error = FT_Err_Ok;
-    FT_Face    face;
-    FT_Memory  memory;
-    FT_CMap    cmap = NULL;
-
-
-    if ( !clazz || !charmap || !charmap->face )
-      return FT_THROW( Invalid_Argument );
-
-    face   = charmap->face;
-    memory = FT_FACE_MEMORY( face );
-
-    if ( !FT_ALLOC( cmap, clazz->size ) )
-    {
-      cmap->charmap = *charmap;
-      cmap->clazz   = clazz;
-
-      if ( clazz->init )
-      {
-        error = clazz->init( cmap, init_data );
-        if ( error )
-          goto Fail;
-      }
-
-      /* add it to our list of charmaps */
-      if ( FT_RENEW_ARRAY( face->charmaps,
-                           face->num_charmaps,
-                           face->num_charmaps + 1 ) )
-        goto Fail;
-
-      face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap;
-    }
-
-  Exit:
-    if ( acmap )
-      *acmap = cmap;
-
-    return error;
-
-  Fail:
-    ft_cmap_done_internal( cmap );
-    cmap = NULL;
-    goto Exit;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt )
-  FT_Get_Char_Index( FT_Face   face,
-                     FT_ULong  charcode )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( face && face->charmap )
-    {
-      FT_CMap  cmap = FT_CMAP( face->charmap );
-
-
-      if ( charcode > 0xFFFFFFFFUL )
-      {
-        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;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_ULong )
-  FT_Get_First_Char( FT_Face   face,
-                     FT_UInt  *agindex )
-  {
-    FT_ULong  result = 0;
-    FT_UInt   gindex = 0;
-
-
-    /* only do something if we have a charmap, and we have glyphs at all */
-    if ( face && face->charmap && face->num_glyphs )
-    {
-      gindex = FT_Get_Char_Index( face, 0 );
-      if ( gindex == 0 )
-        result = FT_Get_Next_Char( face, 0, &gindex );
-    }
-
-    if ( agindex )
-      *agindex = gindex;
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_ULong )
-  FT_Get_Next_Char( FT_Face   face,
-                    FT_ULong  charcode,
-                    FT_UInt  *agindex )
-  {
-    FT_ULong  result = 0;
-    FT_UInt   gindex = 0;
-
-
-    if ( face && face->charmap && face->num_glyphs )
-    {
-      FT_UInt32  code = (FT_UInt32)charcode;
-      FT_CMap    cmap = FT_CMAP( face->charmap );
-
-
-      do
-      {
-        gindex = cmap->clazz->char_next( cmap, &code );
-
-      } while ( gindex >= (FT_UInt)face->num_glyphs );
-
-      result = ( gindex == 0 ) ? 0 : code;
-    }
-
-    if ( agindex )
-      *agindex = gindex;
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt )
-  FT_Face_GetCharVariantIndex( FT_Face   face,
-                               FT_ULong  charcode,
-                               FT_ULong  variantSelector )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( face                                           &&
-         face->charmap                                  &&
-         face->charmap->encoding == FT_ENCODING_UNICODE )
-    {
-      FT_CharMap  charmap = find_variant_selector_charmap( face );
-      FT_CMap     ucmap = FT_CMAP( face->charmap );
-
-
-      if ( charmap )
-      {
-        FT_CMap  vcmap = FT_CMAP( charmap );
-
-
-        if ( charcode > 0xFFFFFFFFUL )
-        {
-          FT_TRACE1(( "FT_Get_Char_Index: 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(( " 0x%x is truncated\n", variantSelector ));
-        }
-
-        result = vcmap->clazz->char_var_index( vcmap, ucmap,
-                                               (FT_UInt32)charcode,
-                                               (FT_UInt32)variantSelector );
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Int )
-  FT_Face_GetCharVariantIsDefault( FT_Face   face,
-                                   FT_ULong  charcode,
-                                   FT_ULong  variantSelector )
-  {
-    FT_Int  result = -1;
-
-
-    if ( face )
-    {
-      FT_CharMap  charmap = find_variant_selector_charmap( face );
-
-
-      if ( charmap )
-      {
-        FT_CMap  vcmap = FT_CMAP( charmap );
-
-
-        if ( charcode > 0xFFFFFFFFUL )
-        {
-          FT_TRACE1(( "FT_Get_Char_Index: 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(( " 0x%x is truncated\n", variantSelector ));
-        }
-
-        result = vcmap->clazz->char_var_default( vcmap,
-                                                 (FT_UInt32)charcode,
-                                                 (FT_UInt32)variantSelector );
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt32* )
-  FT_Face_GetVariantSelectors( FT_Face  face )
-  {
-    FT_UInt32  *result = NULL;
-
-
-    if ( face )
-    {
-      FT_CharMap  charmap = find_variant_selector_charmap( face );
-
-
-      if ( charmap )
-      {
-        FT_CMap    vcmap  = FT_CMAP( charmap );
-        FT_Memory  memory = FT_FACE_MEMORY( face );
-
-
-        result = vcmap->clazz->variant_list( vcmap, memory );
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt32* )
-  FT_Face_GetVariantsOfChar( FT_Face   face,
-                             FT_ULong  charcode )
-  {
-    FT_UInt32  *result = NULL;
-
-
-    if ( face )
-    {
-      FT_CharMap  charmap = find_variant_selector_charmap( face );
-
-
-      if ( charmap )
-      {
-        FT_CMap    vcmap  = FT_CMAP( charmap );
-        FT_Memory  memory = FT_FACE_MEMORY( face );
-
-
-        if ( charcode > 0xFFFFFFFFUL )
-        {
-          FT_TRACE1(( "FT_Get_Char_Index: too large charcode" ));
-          FT_TRACE1(( " 0x%x is truncated\n", charcode ));
-        }
-
-        result = vcmap->clazz->charvariant_list( vcmap, memory,
-                                                 (FT_UInt32)charcode );
-      }
-    }
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt32* )
-  FT_Face_GetCharsOfVariant( FT_Face   face,
-                             FT_ULong  variantSelector )
-  {
-    FT_UInt32  *result = NULL;
-
-
-    if ( face )
-    {
-      FT_CharMap  charmap = find_variant_selector_charmap( face );
-
-
-      if ( charmap )
-      {
-        FT_CMap    vcmap  = FT_CMAP( charmap );
-        FT_Memory  memory = FT_FACE_MEMORY( face );
-
-
-        if ( variantSelector > 0xFFFFFFFFUL )
-        {
-          FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" ));
-          FT_TRACE1(( " 0x%x is truncated\n", variantSelector ));
-        }
-
-        result = vcmap->clazz->variantchar_list( vcmap, memory,
-                                                 (FT_UInt32)variantSelector );
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_UInt )
-  FT_Get_Name_Index( FT_Face     face,
-                     FT_String*  glyph_name )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( face                       &&
-         FT_HAS_GLYPH_NAMES( face ) &&
-         glyph_name                 )
-    {
-      FT_Service_GlyphDict  service;
-
-
-      FT_FACE_LOOKUP_SERVICE( face,
-                              service,
-                              GLYPH_DICT );
-
-      if ( service && service->name_index )
-        result = service->name_index( face, glyph_name );
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Glyph_Name( FT_Face     face,
-                     FT_UInt     glyph_index,
-                     FT_Pointer  buffer,
-                     FT_UInt     buffer_max )
-  {
-    FT_Error              error;
-    FT_Service_GlyphDict  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !buffer || buffer_max == 0 )
-      return FT_THROW( Invalid_Argument );
-
-    /* clean up buffer */
-    ((FT_Byte*)buffer)[0] = '\0';
-
-    if ( (FT_Long)glyph_index >= face->num_glyphs )
-      return FT_THROW( Invalid_Glyph_Index );
-
-    if ( !FT_HAS_GLYPH_NAMES( face ) )
-      return FT_THROW( Invalid_Argument );
-
-    FT_FACE_LOOKUP_SERVICE( face, service, GLYPH_DICT );
-    if ( service && service->get_name )
-      error = service->get_name( face, glyph_index, buffer, buffer_max );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( const char* )
-  FT_Get_Postscript_Name( FT_Face  face )
-  {
-    const char*  result = NULL;
-
-
-    if ( !face )
-      goto Exit;
-
-    if ( !result )
-    {
-      FT_Service_PsFontName  service;
-
-
-      FT_FACE_LOOKUP_SERVICE( face,
-                              service,
-                              POSTSCRIPT_FONT_NAME );
-
-      if ( service && service->get_ps_font_name )
-        result = service->get_ps_font_name( face );
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  /* documentation is in tttables.h */
-
-  FT_EXPORT_DEF( void* )
-  FT_Get_Sfnt_Table( FT_Face      face,
-                     FT_Sfnt_Tag  tag )
-  {
-    void*                  table = NULL;
-    FT_Service_SFNT_Table  service;
-
-
-    if ( face && FT_IS_SFNT( face ) )
-    {
-      FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-      if ( service )
-        table = service->get_table( face, tag );
-    }
-
-    return table;
-  }
-
-
-  /* documentation is in tttables.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Load_Sfnt_Table( FT_Face    face,
-                      FT_ULong   tag,
-                      FT_Long    offset,
-                      FT_Byte*   buffer,
-                      FT_ULong*  length )
-  {
-    FT_Service_SFNT_Table  service;
-
-
-    if ( !face || !FT_IS_SFNT( face ) )
-      return FT_THROW( Invalid_Face_Handle );
-
-    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-    if ( !service )
-      return FT_THROW( Unimplemented_Feature );
-
-    return service->load_table( face, tag, offset, buffer, length );
-  }
-
-
-  /* documentation is in tttables.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Sfnt_Table_Info( FT_Face    face,
-                      FT_UInt    table_index,
-                      FT_ULong  *tag,
-                      FT_ULong  *length )
-  {
-    FT_Service_SFNT_Table  service;
-    FT_ULong               offset;
-
-
-    /* test for valid `length' delayed to `service->table_info' */
-
-    if ( !face || !FT_IS_SFNT( face ) )
-      return FT_THROW( Invalid_Face_Handle );
-
-    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-    if ( !service )
-      return FT_THROW( Unimplemented_Feature );
-
-    return service->table_info( face, table_index, tag, &offset, length );
-  }
-
-
-  /* documentation is in tttables.h */
-
-  FT_EXPORT_DEF( FT_ULong )
-  FT_Get_CMap_Language_ID( FT_CharMap  charmap )
-  {
-    FT_Service_TTCMaps  service;
-    FT_Face             face;
-    TT_CMapInfo         cmap_info;
-
-
-    if ( !charmap || !charmap->face )
-      return 0;
-
-    face = charmap->face;
-    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
-    if ( !service )
-      return 0;
-    if ( service->get_cmap_info( charmap, &cmap_info ))
-      return 0;
-
-    return cmap_info.language;
-  }
-
-
-  /* documentation is in tttables.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_Get_CMap_Format( FT_CharMap  charmap )
-  {
-    FT_Service_TTCMaps  service;
-    FT_Face             face;
-    TT_CMapInfo         cmap_info;
-
-
-    if ( !charmap || !charmap->face )
-      return -1;
-
-    face = charmap->face;
-    FT_FACE_FIND_SERVICE( face, service, TT_CMAP );
-    if ( !service )
-      return -1;
-    if ( service->get_cmap_info( charmap, &cmap_info ))
-      return -1;
-
-    return cmap_info.format;
-  }
-
-
-  /* documentation is in ftsizes.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Activate_Size( FT_Size  size )
-  {
-    FT_Face  face;
-
-
-    if ( !size )
-      return FT_THROW( Invalid_Size_Handle );
-
-    face = size->face;
-    if ( !face || !face->driver )
-      return FT_THROW( Invalid_Face_Handle );
-
-    /* we don't need anything more complex than that; all size objects */
-    /* are already listed by the face                                  */
-    face->size = size;
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                        R E N D E R E R S                        ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* lookup a renderer by glyph format in the library's list */
-  FT_BASE_DEF( FT_Renderer )
-  FT_Lookup_Renderer( FT_Library       library,
-                      FT_Glyph_Format  format,
-                      FT_ListNode*     node )
-  {
-    FT_ListNode  cur;
-    FT_Renderer  result = NULL;
-
-
-    if ( !library )
-      goto Exit;
-
-    cur = library->renderers.head;
-
-    if ( node )
-    {
-      if ( *node )
-        cur = (*node)->next;
-      *node = NULL;
-    }
-
-    while ( cur )
-    {
-      FT_Renderer  renderer = FT_RENDERER( cur->data );
-
-
-      if ( renderer->glyph_format == format )
-      {
-        if ( node )
-          *node = cur;
-
-        result = renderer;
-        break;
-      }
-      cur = cur->next;
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  static FT_Renderer
-  ft_lookup_glyph_renderer( FT_GlyphSlot  slot )
-  {
-    FT_Face      face    = slot->face;
-    FT_Library   library = FT_FACE_LIBRARY( face );
-    FT_Renderer  result  = library->cur_renderer;
-
-
-    if ( !result || result->glyph_format != slot->format )
-      result = FT_Lookup_Renderer( library, slot->format, 0 );
-
-    return result;
-  }
-
-
-  static void
-  ft_set_current_renderer( FT_Library  library )
-  {
-    FT_Renderer  renderer;
-
-
-    renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 );
-    library->cur_renderer = renderer;
-  }
-
-
-  static FT_Error
-  ft_add_renderer( FT_Module  module )
-  {
-    FT_Library   library = module->library;
-    FT_Memory    memory  = library->memory;
-    FT_Error     error;
-    FT_ListNode  node    = NULL;
-
-
-    if ( FT_NEW( node ) )
-      goto Exit;
-
-    {
-      FT_Renderer         render = FT_RENDERER( module );
-      FT_Renderer_Class*  clazz  = (FT_Renderer_Class*)module->clazz;
-
-
-      render->clazz        = clazz;
-      render->glyph_format = clazz->glyph_format;
-
-      /* allocate raster object if needed */
-      if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
-           clazz->raster_class->raster_new                )
-      {
-        error = clazz->raster_class->raster_new( memory, &render->raster );
-        if ( error )
-          goto Fail;
-
-        render->raster_render = clazz->raster_class->raster_render;
-        render->render        = clazz->render_glyph;
-      }
-
-      /* add to list */
-      node->data = module;
-      FT_List_Add( &library->renderers, node );
-
-      ft_set_current_renderer( library );
-    }
-
-  Fail:
-    if ( error )
-      FT_FREE( node );
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  ft_remove_renderer( FT_Module  module )
-  {
-    FT_Library   library;
-    FT_Memory    memory;
-    FT_ListNode  node;
-
-
-    library = module->library;
-    if ( !library )
-      return;
-
-    memory = library->memory;
-
-    node = FT_List_Find( &library->renderers, module );
-    if ( node )
-    {
-      FT_Renderer  render = FT_RENDERER( module );
-
-
-      /* release raster object, if any */
-      if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
-           render->raster                                         )
-        render->clazz->raster_class->raster_done( render->raster );
-
-      /* remove from list */
-      FT_List_Remove( &library->renderers, node );
-      FT_FREE( node );
-
-      ft_set_current_renderer( library );
-    }
-  }
-
-
-  /* documentation is in ftrender.h */
-
-  FT_EXPORT_DEF( FT_Renderer )
-  FT_Get_Renderer( FT_Library       library,
-                   FT_Glyph_Format  format )
-  {
-    /* test for valid `library' delayed to `FT_Lookup_Renderer' */
-
-    return FT_Lookup_Renderer( library, format, 0 );
-  }
-
-
-  /* documentation is in ftrender.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Set_Renderer( FT_Library     library,
-                   FT_Renderer    renderer,
-                   FT_UInt        num_params,
-                   FT_Parameter*  parameters )
-  {
-    FT_ListNode  node;
-    FT_Error     error = FT_Err_Ok;
-
-    FT_Renderer_SetModeFunc  set_mode;
-
-
-    if ( !library )
-    {
-      error = FT_THROW( Invalid_Library_Handle );
-      goto Exit;
-    }
-
-    if ( !renderer )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( num_params > 0 && !parameters )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    node = FT_List_Find( &library->renderers, renderer );
-    if ( !node )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_List_Up( &library->renderers, node );
-
-    if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE )
-      library->cur_renderer = renderer;
-
-    set_mode = renderer->clazz->set_mode;
-
-    for ( ; num_params > 0; num_params-- )
-    {
-      error = set_mode( renderer, parameters->tag, parameters->data );
-      if ( error )
-        break;
-      parameters++;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Render_Glyph_Internal( FT_Library      library,
-                            FT_GlyphSlot    slot,
-                            FT_Render_Mode  render_mode )
-  {
-    FT_Error     error = FT_Err_Ok;
-    FT_Renderer  renderer;
-
-
-    /* if it is already a bitmap, no need to do anything */
-    switch ( slot->format )
-    {
-    case FT_GLYPH_FORMAT_BITMAP:   /* already a bitmap, don't do anything */
-      break;
-
-    default:
-      {
-        FT_ListNode  node = NULL;
-
-
-        /* small shortcut for the very common case */
-        if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-        {
-          renderer = library->cur_renderer;
-          node     = library->renderers.head;
-        }
-        else
-          renderer = FT_Lookup_Renderer( library, slot->format, &node );
-
-        error = FT_ERR( Unimplemented_Feature );
-        while ( renderer )
-        {
-          error = renderer->render( renderer, slot, render_mode, NULL );
-          if ( !error                                   ||
-               FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
-            break;
-
-          /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
-          /* is unsupported by the current renderer for this glyph image */
-          /* format.                                                     */
-
-          /* now, look for another renderer that supports the same */
-          /* format.                                               */
-          renderer = FT_Lookup_Renderer( library, slot->format, &node );
-        }
-      }
-    }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_bitmap
-
-    /*
-     * 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 ( ft_trace_levels[trace_bitmap] >= 3 )
-    {
-      /* we convert to a single bitmap format for computing the checksum */
-      if ( !error && slot->bitmap.buffer )
-      {
-        FT_Bitmap  bitmap;
-        FT_Error   err;
-
-
-        FT_Bitmap_Init( &bitmap );
-
-        /* 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;
-
-
-          MD5_Init( &ctx );
-          if ( bitmap.buffer )
-            MD5_Update( &ctx, bitmap.buffer, rows * pitch );
-          MD5_Final( md5, &ctx );
-
-          FT_TRACE3(( "MD5 checksum for %dx%d bitmap:\n"
-                      "  ",
-                      rows, pitch ));
-          for ( i = 0; i < 16; i++ )
-            FT_TRACE3(( "%02X", md5[i] ));
-          FT_TRACE3(( "\n" ));
-        }
-
-        FT_Bitmap_Done( library, &bitmap );
-      }
-    }
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_objs
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Render_Glyph( FT_GlyphSlot    slot,
-                   FT_Render_Mode  render_mode )
-  {
-    FT_Library  library;
-
-
-    if ( !slot || !slot->face )
-      return FT_THROW( Invalid_Argument );
-
-    library = FT_FACE_LIBRARY( slot->face );
-
-    return FT_Render_Glyph_Internal( library, slot, render_mode );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                         M O D U L E S                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Destroy_Module                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroys a given module object.  For drivers, this also destroys   */
-  /*    all child faces.                                                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    module :: A handle to the target driver object.                    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The driver _must_ be LOCKED!                                       */
-  /*                                                                       */
-  static void
-  Destroy_Module( FT_Module  module )
-  {
-    FT_Memory         memory  = module->memory;
-    FT_Module_Class*  clazz   = module->clazz;
-    FT_Library        library = module->library;
-
-
-    if ( library && library->auto_hinter == module )
-      library->auto_hinter = NULL;
-
-    /* if the module is a renderer */
-    if ( FT_MODULE_IS_RENDERER( module ) )
-      ft_remove_renderer( module );
-
-    /* if the module is a font driver, add some steps */
-    if ( FT_MODULE_IS_DRIVER( module ) )
-      Destroy_Driver( FT_DRIVER( module ) );
-
-    /* finalize the module object */
-    if ( clazz->module_done )
-      clazz->module_done( module );
-
-    /* discard it */
-    FT_FREE( module );
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Add_Module( FT_Library              library,
-                 const FT_Module_Class*  clazz )
-  {
-    FT_Error   error;
-    FT_Memory  memory;
-    FT_Module  module = NULL;
-    FT_UInt    nn;
-
-
-#define FREETYPE_VER_FIXED  ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \
-                                FREETYPE_MINOR                  )
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !clazz )
-      return FT_THROW( Invalid_Argument );
-
-    /* check freetype version */
-    if ( clazz->module_requires > FREETYPE_VER_FIXED )
-      return FT_THROW( Invalid_Version );
-
-    /* look for a module with the same name in the library's table */
-    for ( nn = 0; nn < library->num_modules; nn++ )
-    {
-      module = library->modules[nn];
-      if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 )
-      {
-        /* this installed module has the same name, compare their versions */
-        if ( clazz->module_version <= module->clazz->module_version )
-          return FT_THROW( Lower_Module_Version );
-
-        /* remove the module from our list, then exit the loop to replace */
-        /* it by our new version..                                        */
-        FT_Remove_Module( library, module );
-        break;
-      }
-    }
-
-    memory = library->memory;
-    error  = FT_Err_Ok;
-
-    if ( library->num_modules >= FT_MAX_MODULES )
-    {
-      error = FT_THROW( Too_Many_Drivers );
-      goto Exit;
-    }
-
-    /* allocate module object */
-    if ( FT_ALLOC( module, clazz->module_size ) )
-      goto Exit;
-
-    /* base initialization */
-    module->library = library;
-    module->memory  = memory;
-    module->clazz   = (FT_Module_Class*)clazz;
-
-    /* check whether the module is a renderer - this must be performed */
-    /* before the normal module initialization                         */
-    if ( FT_MODULE_IS_RENDERER( module ) )
-    {
-      /* add to the renderers list */
-      error = ft_add_renderer( module );
-      if ( error )
-        goto Fail;
-    }
-
-    /* is the module a auto-hinter? */
-    if ( FT_MODULE_IS_HINTER( module ) )
-      library->auto_hinter = module;
-
-    /* if the module is a font driver */
-    if ( FT_MODULE_IS_DRIVER( module ) )
-    {
-      FT_Driver  driver = FT_DRIVER( module );
-
-
-      driver->clazz = (FT_Driver_Class)module->clazz;
-    }
-
-    if ( clazz->module_init )
-    {
-      error = clazz->module_init( module );
-      if ( error )
-        goto Fail;
-    }
-
-    /* add module to the library's table */
-    library->modules[library->num_modules++] = module;
-
-  Exit:
-    return error;
-
-  Fail:
-    if ( FT_MODULE_IS_RENDERER( module ) )
-    {
-      FT_Renderer  renderer = FT_RENDERER( module );
-
-
-      if ( renderer->clazz                                          &&
-           renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE &&
-           renderer->raster                                         )
-        renderer->clazz->raster_class->raster_done( renderer->raster );
-    }
-
-    FT_FREE( module );
-    goto Exit;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Module )
-  FT_Get_Module( FT_Library   library,
-                 const char*  module_name )
-  {
-    FT_Module   result = NULL;
-    FT_Module*  cur;
-    FT_Module*  limit;
-
-
-    if ( !library || !module_name )
-      return result;
-
-    cur   = library->modules;
-    limit = cur + library->num_modules;
-
-    for ( ; cur < limit; cur++ )
-      if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 )
-      {
-        result = cur[0];
-        break;
-      }
-
-    return result;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( const void* )
-  FT_Get_Module_Interface( FT_Library   library,
-                           const char*  mod_name )
-  {
-    FT_Module  module;
-
-
-    /* test for valid `library' delayed to FT_Get_Module() */
-
-    module = FT_Get_Module( library, mod_name );
-
-    return module ? module->clazz->module_interface : 0;
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_module_get_service( FT_Module    module,
-                         const char*  service_id,
-                         FT_Bool      global )
-  {
-    FT_Pointer  result = NULL;
-
-
-    if ( module )
-    {
-      FT_ASSERT( module->clazz && module->clazz->get_interface );
-
-      /* first, look for the service in the module */
-      if ( module->clazz->get_interface )
-        result = module->clazz->get_interface( module, service_id );
-
-      if ( global && !result )
-      {
-        /* we didn't find it, look in all other modules then */
-        FT_Library  library = module->library;
-        FT_Module*  cur     = library->modules;
-        FT_Module*  limit   = cur + library->num_modules;
-
-
-        for ( ; cur < limit; cur++ )
-        {
-          if ( cur[0] != module )
-          {
-            FT_ASSERT( cur[0]->clazz );
-
-            if ( cur[0]->clazz->get_interface )
-            {
-              result = cur[0]->clazz->get_interface( cur[0], service_id );
-              if ( result )
-                break;
-            }
-          }
-        }
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Remove_Module( FT_Library  library,
-                    FT_Module   module )
-  {
-    /* try to find the module from the table, then remove it from there */
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( module )
-    {
-      FT_Module*  cur   = library->modules;
-      FT_Module*  limit = cur + library->num_modules;
-
-
-      for ( ; cur < limit; cur++ )
-      {
-        if ( cur[0] == module )
-        {
-          /* remove it from the table */
-          library->num_modules--;
-          limit--;
-          while ( cur < limit )
-          {
-            cur[0] = cur[1];
-            cur++;
-          }
-          limit[0] = NULL;
-
-          /* destroy the module */
-          Destroy_Module( module );
-
-          return FT_Err_Ok;
-        }
-      }
-    }
-    return FT_THROW( Invalid_Driver_Handle );
-  }
-
-
-  static FT_Error
-  ft_property_do( FT_Library        library,
-                  const FT_String*  module_name,
-                  const FT_String*  property_name,
-                  void*             value,
-                  FT_Bool           set,
-                  FT_Bool           value_is_string )
-  {
-    FT_Module*           cur;
-    FT_Module*           limit;
-    FT_Module_Interface  interface;
-
-    FT_Service_Properties  service;
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-    const FT_String*  set_name  = "FT_Property_Set";
-    const FT_String*  get_name  = "FT_Property_Get";
-    const FT_String*  func_name = set ? set_name : get_name;
-#endif
-
-    FT_Bool  missing_func;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !module_name || !property_name || !value )
-      return FT_THROW( Invalid_Argument );
-
-    cur   = library->modules;
-    limit = cur + library->num_modules;
-
-    /* search module */
-    for ( ; cur < limit; cur++ )
-      if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) )
-        break;
-
-    if ( cur == limit )
-    {
-      FT_ERROR(( "%s: can't find module `%s'\n",
-                 func_name, module_name ));
-      return FT_THROW( Missing_Module );
-    }
-
-    /* check whether we have a service interface */
-    if ( !cur[0]->clazz->get_interface )
-    {
-      FT_ERROR(( "%s: module `%s' doesn't support properties\n",
-                 func_name, module_name ));
-      return FT_THROW( Unimplemented_Feature );
-    }
-
-    /* search property service */
-    interface = cur[0]->clazz->get_interface( cur[0],
-                                              FT_SERVICE_ID_PROPERTIES );
-    if ( !interface )
-    {
-      FT_ERROR(( "%s: module `%s' doesn't support properties\n",
-                 func_name, module_name ));
-      return FT_THROW( Unimplemented_Feature );
-    }
-
-    service = (FT_Service_Properties)interface;
-
-    if ( set )
-      missing_func = (FT_Bool)( !service->set_property );
-    else
-      missing_func = (FT_Bool)( !service->get_property );
-
-    if ( missing_func )
-    {
-      FT_ERROR(( "%s: property service of module `%s' is broken\n",
-                 func_name, module_name ));
-      return FT_THROW( Unimplemented_Feature );
-    }
-
-    return set ? service->set_property( cur[0],
-                                        property_name,
-                                        value,
-                                        value_is_string )
-               : service->get_property( cur[0],
-                                        property_name,
-                                        value );
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Property_Set( FT_Library        library,
-                   const FT_String*  module_name,
-                   const FT_String*  property_name,
-                   const void*       value )
-  {
-    return ft_property_do( library,
-                           module_name,
-                           property_name,
-                           (void*)value,
-                           TRUE,
-                           FALSE );
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Property_Get( FT_Library        library,
-                   const FT_String*  module_name,
-                   const FT_String*  property_name,
-                   void*             value )
-  {
-    return ft_property_do( library,
-                           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
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                         L I B R A R Y                           ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Reference_Library( FT_Library  library )
-  {
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    library->refcount++;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Library( FT_Memory    memory,
-                  FT_Library  *alibrary )
-  {
-    FT_Library  library = NULL;
-    FT_Error    error;
-
-
-    if ( !memory || !alibrary )
-      return FT_THROW( Invalid_Argument );
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-    /* init debugging support */
-    ft_debug_init();
-#endif
-
-    /* first of all, allocate the library object */
-    if ( FT_NEW( library ) )
-      return error;
-
-    library->memory = memory;
-
-#ifdef FT_CONFIG_OPTION_PIC
-    /* initialize position independent code containers */
-    error = ft_pic_container_init( library );
-    if ( error )
-      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;
-
-    library->refcount = 1;
-
-    /* That's ok now */
-    *alibrary = library;
-
-    return FT_Err_Ok;
-
-#ifdef FT_CONFIG_OPTION_PIC
-  Fail:
-    ft_pic_container_destroy( library );
-#endif
-    FT_FREE( library );
-    return error;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Library_Version( FT_Library   library,
-                      FT_Int      *amajor,
-                      FT_Int      *aminor,
-                      FT_Int      *apatch )
-  {
-    FT_Int  major = 0;
-    FT_Int  minor = 0;
-    FT_Int  patch = 0;
-
-
-    if ( library )
-    {
-      major = library->version_major;
-      minor = library->version_minor;
-      patch = library->version_patch;
-    }
-
-    if ( amajor )
-      *amajor = major;
-
-    if ( aminor )
-      *aminor = minor;
-
-    if ( apatch )
-      *apatch = patch;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Done_Library( FT_Library  library )
-  {
-    FT_Memory  memory;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    library->refcount--;
-    if ( library->refcount > 0 )
-      goto Exit;
-
-    memory = library->memory;
-
-    /*
-     * Close all faces in the library.  If we don't do this, we can have
-     * some subtle memory leaks.
-     *
-     * Example:
-     *
-     *  - the cff font driver uses the pshinter module in cff_size_done
-     *  - if the pshinter module is destroyed before the cff font driver,
-     *    opened FT_Face objects managed by the driver are not properly
-     *    destroyed, resulting in a memory leak
-     *
-     * Some faces are dependent on other faces, like Type42 faces that
-     * depend on TrueType faces synthesized internally.
-     *
-     * The order of drivers should be specified in driver_name[].
-     */
-    {
-      FT_UInt      m, n;
-      const char*  driver_name[] = { "type42", NULL };
-
-
-      for ( m = 0;
-            m < sizeof ( driver_name ) / sizeof ( driver_name[0] );
-            m++ )
-      {
-        for ( n = 0; n < library->num_modules; n++ )
-        {
-          FT_Module    module      = library->modules[n];
-          const char*  module_name = module->clazz->module_name;
-          FT_List      faces;
-
-
-          if ( driver_name[m]                                &&
-               ft_strcmp( module_name, driver_name[m] ) != 0 )
-            continue;
-
-          if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 )
-            continue;
-
-          FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name ));
-
-          faces = &FT_DRIVER( module )->faces_list;
-          while ( faces->head )
-          {
-            FT_Done_Face( FT_FACE( faces->head->data ) );
-            if ( faces->head )
-              FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" ));
-          }
-        }
-      }
-    }
-
-    /* Close all other modules in the library */
-#if 1
-    /* XXX Modules are removed in the reversed order so that  */
-    /* type42 module is removed before truetype module.  This */
-    /* avoids double free in some occasions.  It is a hack.   */
-    while ( library->num_modules > 0 )
-      FT_Remove_Module( library,
-                        library->modules[library->num_modules - 1] );
-#else
-    {
-      FT_UInt  n;
-
-
-      for ( n = 0; n < library->num_modules; n++ )
-      {
-        FT_Module  module = library->modules[n];
-
-
-        if ( module )
-        {
-          Destroy_Module( module );
-          library->modules[n] = NULL;
-        }
-      }
-    }
-#endif
-
-#ifdef FT_CONFIG_OPTION_PIC
-    /* Destroy pic container contents */
-    ft_pic_container_destroy( library );
-#endif
-
-    FT_FREE( library );
-
-  Exit:
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Set_Debug_Hook( FT_Library         library,
-                     FT_UInt            hook_index,
-                     FT_DebugHook_Func  debug_hook )
-  {
-    if ( library && debug_hook &&
-         hook_index <
-           ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) )
-      library->debug_hooks[hook_index] = debug_hook;
-  }
-
-
-  /* documentation is in ftmodapi.h */
-
-  FT_EXPORT_DEF( FT_TrueTypeEngineType )
-  FT_Get_TrueType_Engine_Type( FT_Library  library )
-  {
-    FT_TrueTypeEngineType  result = FT_TRUETYPE_ENGINE_TYPE_NONE;
-
-
-    if ( library )
-    {
-      FT_Module  module = FT_Get_Module( library, "truetype" );
-
-
-      if ( module )
-      {
-        FT_Service_TrueTypeEngine  service;
-
-
-        service = (FT_Service_TrueTypeEngine)
-                    ft_module_get_service( module,
-                                           FT_SERVICE_ID_TRUETYPE_ENGINE,
-                                           0 );
-        if ( service )
-          result = service->engine_type;
-      }
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_SubGlyph_Info( FT_GlyphSlot  glyph,
-                        FT_UInt       sub_index,
-                        FT_Int       *p_index,
-                        FT_UInt      *p_flags,
-                        FT_Int       *p_arg1,
-                        FT_Int       *p_arg2,
-                        FT_Matrix    *p_transform )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-
-
-    if ( glyph                                      &&
-         glyph->subglyphs                           &&
-         glyph->format == FT_GLYPH_FORMAT_COMPOSITE &&
-         sub_index < glyph->num_subglyphs           )
-    {
-      FT_SubGlyph  subg = glyph->subglyphs + sub_index;
-
-
-      *p_index     = subg->index;
-      *p_flags     = subg->flags;
-      *p_arg1      = subg->arg1;
-      *p_arg2      = subg->arg2;
-      *p_transform = subg->transform;
-
-      error = FT_Err_Ok;
-    }
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftoutln.c b/third_party/freetype/src/base/ftoutln.c
deleted file mode 100644
index 464a066..0000000
--- a/third_party/freetype/src/base/ftoutln.c
+++ /dev/null
@@ -1,1108 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftoutln.c                                                              */
-/*                                                                         */
-/*    FreeType outline management (body).                                  */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* All functions are declared in freetype.h.                             */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_OUTLINE_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_TRIGONOMETRY_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_outline
-
-
-  static
-  const FT_Outline  null_outline = { 0, 0, NULL, NULL, NULL, 0 };
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Decompose( FT_Outline*              outline,
-                        const FT_Outline_Funcs*  func_interface,
-                        void*                    user )
-  {
-#undef  SCALED
-#define SCALED( x )  ( ( (x) < 0 ? -( -(x) << shift )             \
-                                 :  (  (x) << shift ) ) - delta )
-
-    FT_Vector   v_last;
-    FT_Vector   v_control;
-    FT_Vector   v_start;
-
-    FT_Vector*  point;
-    FT_Vector*  limit;
-    char*       tags;
-
-    FT_Error    error;
-
-    FT_Int   n;         /* index of contour in outline     */
-    FT_UInt  first;     /* index of first point in contour */
-    FT_Int   tag;       /* current point's state           */
-
-    FT_Int   shift;
-    FT_Pos   delta;
-
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    if ( !func_interface )
-      return FT_THROW( Invalid_Argument );
-
-    shift = func_interface->shift;
-    delta = func_interface->delta;
-    first = 0;
-
-    for ( n = 0; n < outline->n_contours; n++ )
-    {
-      FT_Int  last;  /* index of last point in contour */
-
-
-      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
-
-      last = outline->contours[n];
-      if ( last < 0 )
-        goto Invalid_Outline;
-      limit = outline->points + last;
-
-      v_start   = outline->points[first];
-      v_start.x = SCALED( v_start.x );
-      v_start.y = SCALED( v_start.y );
-
-      v_last   = outline->points[last];
-      v_last.x = SCALED( v_last.x );
-      v_last.y = SCALED( v_last.y );
-
-      v_control = v_start;
-
-      point = outline->points + first;
-      tags  = outline->tags   + first;
-      tag   = FT_CURVE_TAG( tags[0] );
-
-      /* A contour cannot start with a cubic control point! */
-      if ( tag == FT_CURVE_TAG_CUBIC )
-        goto Invalid_Outline;
-
-      /* check first point to determine origin */
-      if ( tag == FT_CURVE_TAG_CONIC )
-      {
-        /* first point is conic control.  Yes, this happens. */
-        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
-        {
-          /* start at last point if it is on the curve */
-          v_start = v_last;
-          limit--;
-        }
-        else
-        {
-          /* if both first and last points are conic,         */
-          /* start at their middle and record its position    */
-          /* for closure                                      */
-          v_start.x = ( v_start.x + v_last.x ) / 2;
-          v_start.y = ( v_start.y + v_last.y ) / 2;
-
-       /* v_last = v_start; */
-        }
-        point--;
-        tags--;
-      }
-
-      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
-                  v_start.x / 64.0, v_start.y / 64.0 ));
-      error = func_interface->move_to( &v_start, user );
-      if ( error )
-        goto Exit;
-
-      while ( point < limit )
-      {
-        point++;
-        tags++;
-
-        tag = FT_CURVE_TAG( tags[0] );
-        switch ( tag )
-        {
-        case FT_CURVE_TAG_ON:  /* emit a single line_to */
-          {
-            FT_Vector  vec;
-
-
-            vec.x = SCALED( point->x );
-            vec.y = SCALED( point->y );
-
-            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
-                        vec.x / 64.0, vec.y / 64.0 ));
-            error = func_interface->line_to( &vec, user );
-            if ( error )
-              goto Exit;
-            continue;
-          }
-
-        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
-          v_control.x = SCALED( point->x );
-          v_control.y = SCALED( point->y );
-
-        Do_Conic:
-          if ( point < limit )
-          {
-            FT_Vector  vec;
-            FT_Vector  v_middle;
-
-
-            point++;
-            tags++;
-            tag = FT_CURVE_TAG( tags[0] );
-
-            vec.x = SCALED( point->x );
-            vec.y = SCALED( point->y );
-
-            if ( tag == FT_CURVE_TAG_ON )
-            {
-              FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                          " with control (%.2f, %.2f)\n",
-                          vec.x / 64.0, vec.y / 64.0,
-                          v_control.x / 64.0, v_control.y / 64.0 ));
-              error = func_interface->conic_to( &v_control, &vec, user );
-              if ( error )
-                goto Exit;
-              continue;
-            }
-
-            if ( tag != FT_CURVE_TAG_CONIC )
-              goto Invalid_Outline;
-
-            v_middle.x = ( v_control.x + vec.x ) / 2;
-            v_middle.y = ( v_control.y + vec.y ) / 2;
-
-            FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                        " with control (%.2f, %.2f)\n",
-                        v_middle.x / 64.0, v_middle.y / 64.0,
-                        v_control.x / 64.0, v_control.y / 64.0 ));
-            error = func_interface->conic_to( &v_control, &v_middle, user );
-            if ( error )
-              goto Exit;
-
-            v_control = vec;
-            goto Do_Conic;
-          }
-
-          FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                      " with control (%.2f, %.2f)\n",
-                      v_start.x / 64.0, v_start.y / 64.0,
-                      v_control.x / 64.0, v_control.y / 64.0 ));
-          error = func_interface->conic_to( &v_control, &v_start, user );
-          goto Close;
-
-        default:  /* FT_CURVE_TAG_CUBIC */
-          {
-            FT_Vector  vec1, vec2;
-
-
-            if ( point + 1 > limit                             ||
-                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
-              goto Invalid_Outline;
-
-            point += 2;
-            tags  += 2;
-
-            vec1.x = SCALED( point[-2].x );
-            vec1.y = SCALED( point[-2].y );
-
-            vec2.x = SCALED( point[-1].x );
-            vec2.y = SCALED( point[-1].y );
-
-            if ( point <= limit )
-            {
-              FT_Vector  vec;
-
-
-              vec.x = SCALED( point->x );
-              vec.y = SCALED( point->y );
-
-              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
-                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
-                          vec.x / 64.0, vec.y / 64.0,
-                          vec1.x / 64.0, vec1.y / 64.0,
-                          vec2.x / 64.0, vec2.y / 64.0 ));
-              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
-              if ( error )
-                goto Exit;
-              continue;
-            }
-
-            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
-                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
-                        v_start.x / 64.0, v_start.y / 64.0,
-                        vec1.x / 64.0, vec1.y / 64.0,
-                        vec2.x / 64.0, vec2.y / 64.0 ));
-            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
-            goto Close;
-          }
-        }
-      }
-
-      /* close the contour with a line segment */
-      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
-                  v_start.x / 64.0, v_start.y / 64.0 ));
-      error = func_interface->line_to( &v_start, user );
-
-    Close:
-      if ( error )
-        goto Exit;
-
-      first = (FT_UInt)last + 1;
-    }
-
-    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
-    return FT_Err_Ok;
-
-  Exit:
-    FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error ));
-    return error;
-
-  Invalid_Outline:
-    return FT_THROW( Invalid_Outline );
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_New_Internal( FT_Memory    memory,
-                           FT_UInt      numPoints,
-                           FT_Int       numContours,
-                           FT_Outline  *anoutline )
-  {
-    FT_Error  error;
-
-
-    if ( !anoutline || !memory )
-      return FT_THROW( Invalid_Argument );
-
-    *anoutline = null_outline;
-
-    if ( numContours < 0                  ||
-         (FT_UInt)numContours > numPoints )
-      return FT_THROW( Invalid_Argument );
-
-    if ( numPoints > FT_OUTLINE_POINTS_MAX )
-      return FT_THROW( Array_Too_Large );
-
-    if ( FT_NEW_ARRAY( anoutline->points,   numPoints   ) ||
-         FT_NEW_ARRAY( anoutline->tags,     numPoints   ) ||
-         FT_NEW_ARRAY( anoutline->contours, numContours ) )
-      goto Fail;
-
-    anoutline->n_points    = (FT_Short)numPoints;
-    anoutline->n_contours  = (FT_Short)numContours;
-    anoutline->flags      |= FT_OUTLINE_OWNER;
-
-    return FT_Err_Ok;
-
-  Fail:
-    anoutline->flags |= FT_OUTLINE_OWNER;
-    FT_Outline_Done_Internal( memory, anoutline );
-
-    return error;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_New( FT_Library   library,
-                  FT_UInt      numPoints,
-                  FT_Int       numContours,
-                  FT_Outline  *anoutline )
-  {
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    return FT_Outline_New_Internal( library->memory, numPoints,
-                                    numContours, anoutline );
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Check( FT_Outline*  outline )
-  {
-    if ( outline )
-    {
-      FT_Int  n_points   = outline->n_points;
-      FT_Int  n_contours = outline->n_contours;
-      FT_Int  end0, end;
-      FT_Int  n;
-
-
-      /* empty glyph? */
-      if ( n_points == 0 && n_contours == 0 )
-        return FT_Err_Ok;
-
-      /* check point and contour counts */
-      if ( n_points <= 0 || n_contours <= 0 )
-        goto Bad;
-
-      end0 = end = -1;
-      for ( n = 0; n < n_contours; n++ )
-      {
-        end = outline->contours[n];
-
-        /* note that we don't accept empty contours */
-        if ( end <= end0 || end >= n_points )
-          goto Bad;
-
-        end0 = end;
-      }
-
-      if ( end != n_points - 1 )
-        goto Bad;
-
-      /* XXX: check the tags array */
-      return FT_Err_Ok;
-    }
-
-  Bad:
-    return FT_THROW( Invalid_Argument );
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Copy( const FT_Outline*  source,
-                   FT_Outline        *target )
-  {
-    FT_Int  is_owner;
-
-
-    if ( !source || !target )
-      return FT_THROW( Invalid_Outline );
-
-    if ( source->n_points   != target->n_points   ||
-         source->n_contours != target->n_contours )
-      return FT_THROW( Invalid_Argument );
-
-    if ( source == target )
-      return FT_Err_Ok;
-
-    if ( source->n_points )
-    {
-      FT_ARRAY_COPY( target->points, source->points, source->n_points );
-      FT_ARRAY_COPY( target->tags,   source->tags,   source->n_points );
-    }
-
-    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;
-    target->flags = source->flags;
-
-    target->flags &= ~FT_OUTLINE_OWNER;
-    target->flags |= is_owner;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Done_Internal( FT_Memory    memory,
-                            FT_Outline*  outline )
-  {
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    if ( !memory )
-      return FT_THROW( Invalid_Argument );
-
-    if ( outline->flags & FT_OUTLINE_OWNER )
-    {
-      FT_FREE( outline->points   );
-      FT_FREE( outline->tags     );
-      FT_FREE( outline->contours );
-    }
-    *outline = null_outline;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Done( FT_Library   library,
-                   FT_Outline*  outline )
-  {
-    /* check for valid `outline' in FT_Outline_Done_Internal() */
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    return FT_Outline_Done_Internal( library->memory, outline );
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Outline_Get_CBox( const FT_Outline*  outline,
-                       FT_BBox           *acbox )
-  {
-    FT_Pos  xMin, yMin, xMax, yMax;
-
-
-    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++ )
-        {
-          FT_Pos  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;
-    }
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Outline_Translate( const FT_Outline*  outline,
-                        FT_Pos             xOffset,
-                        FT_Pos             yOffset )
-  {
-    FT_UShort   n;
-    FT_Vector*  vec;
-
-
-    if ( !outline )
-      return;
-
-    vec = outline->points;
-
-    for ( n = 0; n < outline->n_points; n++ )
-    {
-      vec->x += xOffset;
-      vec->y += yOffset;
-      vec++;
-    }
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Outline_Reverse( FT_Outline*  outline )
-  {
-    FT_UShort  n;
-    FT_Int     first, last;
-
-
-    if ( !outline )
-      return;
-
-    first = 0;
-
-    for ( n = 0; n < outline->n_contours; n++ )
-    {
-      last  = outline->contours[n];
-
-      /* reverse point table */
-      {
-        FT_Vector*  p = outline->points + first;
-        FT_Vector*  q = outline->points + last;
-        FT_Vector   swap;
-
-
-        while ( p < q )
-        {
-          swap = *p;
-          *p   = *q;
-          *q   = swap;
-          p++;
-          q--;
-        }
-      }
-
-      /* reverse tags table */
-      {
-        char*  p = outline->tags + first;
-        char*  q = outline->tags + last;
-
-
-        while ( p < q )
-        {
-          char  swap;
-
-
-          swap = *p;
-          *p   = *q;
-          *q   = swap;
-          p++;
-          q--;
-        }
-      }
-
-      first = last + 1;
-    }
-
-    outline->flags ^= FT_OUTLINE_REVERSE_FILL;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Render( FT_Library         library,
-                     FT_Outline*        outline,
-                     FT_Raster_Params*  params )
-  {
-    FT_Error     error;
-    FT_Renderer  renderer;
-    FT_ListNode  node;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    if ( !params )
-      return FT_THROW( Invalid_Argument );
-
-    renderer = library->cur_renderer;
-    node     = library->renderers.head;
-
-    params->source = (void*)outline;
-
-    error = FT_ERR( Cannot_Render_Glyph );
-    while ( renderer )
-    {
-      error = renderer->raster_render( renderer->raster, params );
-      if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) )
-        break;
-
-      /* FT_Err_Cannot_Render_Glyph is returned if the render mode   */
-      /* is unsupported by the current renderer for this glyph image */
-      /* format                                                      */
-
-      /* now, look for another renderer that supports the same */
-      /* format                                                */
-      renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE,
-                                     &node );
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Get_Bitmap( FT_Library        library,
-                         FT_Outline*       outline,
-                         const FT_Bitmap  *abitmap )
-  {
-    FT_Raster_Params  params;
-
-
-    if ( !abitmap )
-      return FT_THROW( Invalid_Argument );
-
-    /* other checks are delayed to `FT_Outline_Render' */
-
-    params.target = abitmap;
-    params.flags  = 0;
-
-    if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY  ||
-         abitmap->pixel_mode == FT_PIXEL_MODE_LCD   ||
-         abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V )
-      params.flags |= FT_RASTER_FLAG_AA;
-
-    return FT_Outline_Render( library, outline, &params );
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Vector_Transform( FT_Vector*        vector,
-                       const FT_Matrix*  matrix )
-  {
-    FT_Pos  xz, yz;
-
-
-    if ( !vector || !matrix )
-      return;
-
-    xz = FT_MulFix( vector->x, matrix->xx ) +
-         FT_MulFix( vector->y, matrix->xy );
-
-    yz = FT_MulFix( vector->x, matrix->yx ) +
-         FT_MulFix( vector->y, matrix->yy );
-
-    vector->x = xz;
-    vector->y = yz;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Outline_Transform( const FT_Outline*  outline,
-                        const FT_Matrix*   matrix )
-  {
-    FT_Vector*  vec;
-    FT_Vector*  limit;
-
-
-    if ( !outline || !matrix )
-      return;
-
-    vec   = outline->points;
-    limit = vec + outline->n_points;
-
-    for ( ; vec < limit; vec++ )
-      FT_Vector_Transform( vec, matrix );
-  }
-
-
-#if 0
-
-#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last )  \
-  do                                                       \
-  {                                                        \
-    (first) = ( c > 0 ) ? (outline)->points +              \
-                            (outline)->contours[c - 1] + 1 \
-                        : (outline)->points;               \
-    (last) = (outline)->points + (outline)->contours[c];   \
-  } while ( 0 )
-
-
-  /* Is a point in some contour?                     */
-  /*                                                 */
-  /* We treat every point of the contour as if it    */
-  /* it were ON.  That is, we allow false positives, */
-  /* but disallow false negatives.  (XXX really?)    */
-  static FT_Bool
-  ft_contour_has( FT_Outline*  outline,
-                  FT_Short     c,
-                  FT_Vector*   point )
-  {
-    FT_Vector*  first;
-    FT_Vector*  last;
-    FT_Vector*  a;
-    FT_Vector*  b;
-    FT_UInt     n = 0;
-
-
-    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
-
-    for ( a = first; a <= last; a++ )
-    {
-      FT_Pos  x;
-      FT_Int  intersect;
-
-
-      b = ( a == last ) ? first : a + 1;
-
-      intersect = ( a->y - point->y ) ^ ( b->y - point->y );
-
-      /* a and b are on the same side */
-      if ( intersect >= 0 )
-      {
-        if ( intersect == 0 && a->y == point->y )
-        {
-          if ( ( a->x <= point->x && b->x >= point->x ) ||
-               ( a->x >= point->x && b->x <= point->x ) )
-            return 1;
-        }
-
-        continue;
-      }
-
-      x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y );
-
-      if ( x < point->x )
-        n++;
-      else if ( x == point->x )
-        return 1;
-    }
-
-    return n & 1;
-  }
-
-
-  static FT_Bool
-  ft_contour_enclosed( FT_Outline*  outline,
-                       FT_UShort    c )
-  {
-    FT_Vector*  first;
-    FT_Vector*  last;
-    FT_Short    i;
-
-
-    FT_OUTLINE_GET_CONTOUR( outline, c, first, last );
-
-    for ( i = 0; i < outline->n_contours; i++ )
-    {
-      if ( i != c && ft_contour_has( outline, i, first ) )
-      {
-        FT_Vector*  pt;
-
-
-        for ( pt = first + 1; pt <= last; pt++ )
-          if ( !ft_contour_has( outline, i, pt ) )
-            return 0;
-
-        return 1;
-      }
-    }
-
-    return 0;
-  }
-
-
-  /* This version differs from the public one in that each */
-  /* part (contour not enclosed in another contour) of the */
-  /* outline is checked for orientation.  This is          */
-  /* necessary for some buggy CJK fonts.                   */
-  static FT_Orientation
-  ft_outline_get_orientation( FT_Outline*  outline )
-  {
-    FT_Short        i;
-    FT_Vector*      first;
-    FT_Vector*      last;
-    FT_Orientation  orient = FT_ORIENTATION_NONE;
-
-
-    first = outline->points;
-    for ( i = 0; i < outline->n_contours; i++, first = last + 1 )
-    {
-      FT_Vector*  point;
-      FT_Vector*  xmin_point;
-      FT_Pos      xmin;
-
-
-      last = outline->points + outline->contours[i];
-
-      /* skip degenerate contours */
-      if ( last < first + 2 )
-        continue;
-
-      if ( ft_contour_enclosed( outline, i ) )
-        continue;
-
-      xmin       = first->x;
-      xmin_point = first;
-
-      for ( point = first + 1; point <= last; point++ )
-      {
-        if ( point->x < xmin )
-        {
-          xmin       = point->x;
-          xmin_point = point;
-        }
-      }
-
-      /* check the orientation of the contour */
-      {
-        FT_Vector*      prev;
-        FT_Vector*      next;
-        FT_Orientation  o;
-
-
-        prev = ( xmin_point == first ) ? last : xmin_point - 1;
-        next = ( xmin_point == last ) ? first : xmin_point + 1;
-
-        if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) >
-             FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) )
-          o = FT_ORIENTATION_POSTSCRIPT;
-        else
-          o = FT_ORIENTATION_TRUETYPE;
-
-        if ( orient == FT_ORIENTATION_NONE )
-          orient = o;
-        else if ( orient != o )
-          return FT_ORIENTATION_NONE;
-      }
-    }
-
-    return orient;
-  }
-
-#endif /* 0 */
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Embolden( FT_Outline*  outline,
-                       FT_Pos       strength )
-  {
-    return FT_Outline_EmboldenXY( outline, strength, strength );
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_EmboldenXY( FT_Outline*  outline,
-                         FT_Pos       xstrength,
-                         FT_Pos       ystrength )
-  {
-    FT_Vector*  points;
-    FT_Int      c, first, last;
-    FT_Int      orientation;
-
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    xstrength /= 2;
-    ystrength /= 2;
-    if ( xstrength == 0 && ystrength == 0 )
-      return FT_Err_Ok;
-
-    orientation = FT_Outline_Get_Orientation( outline );
-    if ( orientation == FT_ORIENTATION_NONE )
-    {
-      if ( outline->n_contours )
-        return FT_THROW( Invalid_Argument );
-      else
-        return FT_Err_Ok;
-    }
-
-    points = outline->points;
-
-    first = 0;
-    for ( c = 0; c < outline->n_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;
-
-
-      l_in = 0;
-      last = outline->contours[c];
-
-      /* 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 )
-      {
-        if ( j != k )
-        {
-          out.x = points[j].x - points[i].x;
-          out.y = points[j].y - points[i].y;
-          l_out = (FT_Fixed)FT_Vector_NormLen( &out );
-
-          if ( l_out == 0 )
-            continue;
-        }
-        else
-        {
-          out   = anchor;
-          l_out = l_anchor;
-        }
-
-        if ( l_in != 0 )
-        {
-          if ( k < 0 )
-          {
-            k        = i;
-            anchor   = in;
-            l_anchor = l_in;
-          }
-
-          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;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* documentation is in ftoutln.h */
-
-  FT_EXPORT_DEF( FT_Orientation )
-  FT_Outline_Get_Orientation( FT_Outline*  outline )
-  {
-    FT_BBox     cbox;
-    FT_Int      xshift, yshift;
-    FT_Vector*  points;
-    FT_Vector   v_prev, v_cur;
-    FT_Int      c, n, first;
-    FT_Pos      area = 0;
-
-
-    if ( !outline || outline->n_points <= 0 )
-      return FT_ORIENTATION_TRUETYPE;
-
-    /* We use the nonzero winding rule to find the orientation.       */
-    /* Since glyph outlines behave much more `regular' than arbitrary */
-    /* cubic or quadratic curves, this test deals with the polygon    */
-    /* only that is spanned up by the control points.                 */
-
-    FT_Outline_Get_CBox( outline, &cbox );
-
-    /* Handle collapsed outlines to avoid undefined FT_MSB. */
-    if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax )
-      return FT_ORIENTATION_NONE;
-
-    xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) |
-                                  FT_ABS( cbox.xMin ) ) ) - 14;
-    xshift = FT_MAX( xshift, 0 );
-
-    yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14;
-    yshift = FT_MAX( yshift, 0 );
-
-    points = outline->points;
-
-    first = 0;
-    for ( c = 0; c < outline->n_contours; c++ )
-    {
-      FT_Int  last = outline->contours[c];
-
-
-      v_prev.x = points[last].x >> xshift;
-      v_prev.y = points[last].y >> yshift;
-
-      for ( n = first; n <= last; n++ )
-      {
-        v_cur.x = points[n].x >> xshift;
-        v_cur.y = points[n].y >> yshift;
-
-        area += ( v_cur.y - v_prev.y ) * ( v_cur.x + v_prev.x );
-
-        v_prev = v_cur;
-      }
-
-      first = last + 1;
-    }
-
-    if ( area > 0 )
-      return FT_ORIENTATION_POSTSCRIPT;
-    else if ( area < 0 )
-      return FT_ORIENTATION_TRUETYPE;
-    else
-      return FT_ORIENTATION_NONE;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftpic.c b/third_party/freetype/src/base/ftpic.c
deleted file mode 100644
index 0f84fdd..0000000
--- a/third_party/freetype/src/base/ftpic.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpic.c                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services (body).              */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "basepic.h"
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* documentation is in ftpic.h */
-
-  FT_BASE_DEF( FT_Error )
-  ft_pic_container_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error;
-
-
-    FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) );
-
-    error = ft_base_pic_init( library );
-    if ( error )
-      return error;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* Destroy the contents of the container. */
-  FT_BASE_DEF( void )
-  ft_pic_container_destroy( FT_Library  library )
-  {
-    ft_base_pic_free( library );
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftrfork.c b/third_party/freetype/src/base/ftrfork.c
deleted file mode 100644
index f7b8137..0000000
--- a/third_party/freetype/src/base/ftrfork.c
+++ /dev/null
@@ -1,937 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftrfork.c                                                              */
-/*                                                                         */
-/*    Embedded resource forks accessor (body).                             */
-/*                                                                         */
-/*  Copyright 2004-2017 by                                                 */
-/*  Masatake YAMATO and Redhat K.K.                                        */
-/*                                                                         */
-/*  FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are     */
-/*  derived from ftobjs.c.                                                 */
-/*                                                                         */
-/*  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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/* Development of the code in this file is support of                      */
-/* Information-technology Promotion Agency, Japan.                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_RFORK_H
-#include "basepic.h"
-#include "ftbase.h"
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_raccess
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****               Resource fork directory access                    ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_BASE_DEF( FT_Error )
-  FT_Raccess_Get_HeaderInfo( FT_Library  library,
-                             FT_Stream   stream,
-                             FT_Long     rfork_offset,
-                             FT_Long    *map_offset,
-                             FT_Long    *rdata_pos )
-  {
-    FT_Error       error;
-    unsigned char  head[16], head2[16];
-    FT_Long        map_pos, map_len, rdata_len;
-    int            allzeros, allmatch, i;
-    FT_Long        type_list;
-
-    FT_UNUSED( library );
-
-
-    error = FT_Stream_Seek( stream, (FT_ULong)rfork_offset );
-    if ( error )
-      return error;
-
-    error = FT_Stream_Read( stream, (FT_Byte*)head, 16 );
-    if ( error )
-      return error;
-
-    /* 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;
-
-    head2[15] = (FT_Byte)( head[15] + 1 );       /* make it be different */
-
-    error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 );
-    if ( error )
-      return error;
-
-    allzeros = 1;
-    allmatch = 1;
-    for ( i = 0; i < 16; i++ )
-    {
-      if ( head2[i] != 0 )
-        allzeros = 0;
-      if ( head2[i] != head[i] )
-        allmatch = 0;
-    }
-    if ( !allzeros && !allmatch )
-      return FT_THROW( Unknown_File_Format );
-
-    /* If we have reached this point then it is probably a mac resource */
-    /* file.  Now, does it contain any interesting resources?           */
-
-    (void)FT_STREAM_SKIP( 4        /* skip handle to next resource map */
-                          + 2      /* skip file resource number */
-                          + 2 );   /* skip attributes */
-
-    if ( FT_READ_SHORT( type_list ) )
-      return error;
-    if ( type_list < 0 )
-      return FT_THROW( Unknown_File_Format );
-
-    error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) );
-    if ( error )
-      return error;
-
-    *map_offset = map_pos + type_list;
-    return FT_Err_Ok;
-  }
-
-
-  static int
-  ft_raccess_sort_ref_by_id( FT_RFork_Ref*  a,
-                             FT_RFork_Ref*  b )
-  {
-    if ( a->res_id < b->res_id )
-      return -1;
-    else if ( a->res_id > b->res_id )
-      return 1;
-    else
-      return 0;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Raccess_Get_DataOffsets( FT_Library  library,
-                              FT_Stream   stream,
-                              FT_Long     map_offset,
-                              FT_Long     rdata_pos,
-                              FT_Long     tag,
-                              FT_Bool     sort_by_res_id,
-                              FT_Long   **offsets,
-                              FT_Long    *count )
-  {
-    FT_Error      error;
-    int           i, j, cnt, subcnt;
-    FT_Long       tag_internal, rpos;
-    FT_Memory     memory = library->memory;
-    FT_Long       temp;
-    FT_Long       *offsets_internal = NULL;
-    FT_RFork_Ref  *ref = NULL;
-
-
-    FT_TRACE3(( "\n" ));
-    error = FT_Stream_Seek( stream, (FT_ULong)map_offset );
-    if ( error )
-      return error;
-
-    if ( FT_READ_SHORT( cnt ) )
-      return error;
-    cnt++;
-
-    /* `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_SHORT( subcnt )      ||
-           FT_READ_SHORT( rpos )        )
-        return error;
-
-      FT_TRACE2(( "Resource tags: %c%c%c%c\n",
-                  (char)( 0xFF & ( tag_internal >> 24 ) ),
-                  (char)( 0xFF & ( tag_internal >> 16 ) ),
-                  (char)( 0xFF & ( tag_internal >>  8 ) ),
-                  (char)( 0xFF & ( tag_internal >>  0 ) ) ));
-      FT_TRACE3(( "             : subcount=%d, suboffset=0x%04x\n",
-                  subcnt, rpos ));
-
-      if ( tag_internal == tag )
-      {
-        *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;
-
-        if ( FT_NEW_ARRAY( ref, *count ) )
-          return error;
-
-        for ( j = 0; j < *count; j++ )
-        {
-          if ( FT_READ_SHORT( ref[j].res_id ) )
-            goto Exit;
-          if ( FT_STREAM_SKIP( 2 ) )  /* resource name offset */
-            goto Exit;
-          if ( FT_READ_LONG( temp ) ) /* attributes (8bit), offset (24bit) */
-            goto Exit;
-          if ( FT_STREAM_SKIP( 4 ) )  /* mbz */
-            goto Exit;
-
-          if ( ref[j].res_id < 0 || 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 ));
-        }
-
-        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_TRACE3(( "             -- sort resources by their ids --\n" ));
-
-          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 ) )
-          goto Exit;
-
-        /* XXX: duplicated reference ID,
-         *      gap between reference IDs are acceptable?
-         *      further investigation on Apple implementation is needed.
-         */
-        for ( j = 0; j < *count; j++ )
-          offsets_internal[j] = rdata_pos + ref[j].offset;
-
-        *offsets = offsets_internal;
-        error    = FT_Err_Ok;
-
-      Exit:
-        FT_FREE( ref );
-        return error;
-      }
-    }
-
-    return FT_THROW( Cannot_Open_Resource );
-  }
-
-
-#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                     Guessing functions                          ****/
-  /****                                                                 ****/
-  /****            When you add a new guessing function,                ****/
-  /****           update FT_RACCESS_N_RULES in ftrfork.h.               ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static FT_Error
-  raccess_guess_apple_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_apple_single( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_darwin_ufs_export( FT_Library  library,
-                                   FT_Stream   stream,
-                                   char       *base_file_name,
-                                   char      **result_file_name,
-                                   FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_darwin_newvfs( FT_Library  library,
-                               FT_Stream   stream,
-                               char       *base_file_name,
-                               char      **result_file_name,
-                               FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_darwin_hfsplus( FT_Library  library,
-                                FT_Stream   stream,
-                                char       *base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_vfat( FT_Library  library,
-                      FT_Stream   stream,
-                      char       *base_file_name,
-                      char      **result_file_name,
-                      FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_cap( FT_Library  library,
-                           FT_Stream   stream,
-                           char       *base_file_name,
-                           char      **result_file_name,
-                           FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_netatalk( FT_Library  library,
-                                FT_Stream   stream,
-                                char       *base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset );
-
-
-  CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table,
-                                  ft_raccess_guess_rec)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double,      apple_double)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single,      apple_single)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs,     darwin_newvfs)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus,    darwin_hfsplus)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat,              vfat)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap,         linux_cap)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double,      linux_double)
-  CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk,    linux_netatalk)
-  CONST_FT_RFORK_RULE_ARRAY_END
-
-
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                       Helper functions                          ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-
-  static FT_Error
-  raccess_guess_apple_generic( FT_Library  library,
-                               FT_Stream   stream,
-                               char       *base_file_name,
-                               FT_Int32    magic,
-                               FT_Long    *result_offset );
-
-  static FT_Error
-  raccess_guess_linux_double_from_file_name( FT_Library  library,
-                                             char *      file_name,
-                                             FT_Long    *result_offset );
-
-  static char *
-  raccess_make_file_name( FT_Memory    memory,
-                          const char  *original_name,
-                          const char  *insertion );
-
-  FT_BASE_DEF( void )
-  FT_Raccess_Guess( FT_Library  library,
-                    FT_Stream   stream,
-                    char*       base_name,
-                    char      **new_names,
-                    FT_Long    *offsets,
-                    FT_Error   *errors )
-  {
-    FT_Int  i;
-
-
-    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
-    {
-      new_names[i] = NULL;
-      if ( NULL != stream )
-        errors[i] = FT_Stream_Seek( stream, 0 );
-      else
-        errors[i] = FT_Err_Ok;
-
-      if ( errors[i] )
-        continue;
-
-      errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library,
-                                                 stream, base_name,
-                                                 &(new_names[i]),
-                                                 &(offsets[i]) );
-    }
-
-    return;
-  }
-
-
-#ifndef FT_MACINTOSH
-  static FT_RFork_Rule
-  raccess_get_rule_type_from_rule_index( FT_Library  library,
-                                         FT_UInt     rule_index )
-  {
-    FT_UNUSED( library );
-
-    if ( rule_index >= FT_RACCESS_N_RULES )
-      return FT_RFork_Rule_invalid;
-
-    return FT_RACCESS_GUESS_TABLE_GET[rule_index].type;
-  }
-
-
-  /*
-   * For this function, refer ftbase.h.
-   */
-  FT_LOCAL_DEF( FT_Bool )
-  ft_raccess_rule_by_darwin_vfs( FT_Library  library,
-                                 FT_UInt     rule_index )
-  {
-    switch( raccess_get_rule_type_from_rule_index( library, rule_index ) )
-    {
-      case FT_RFork_Rule_darwin_newvfs:
-      case FT_RFork_Rule_darwin_hfsplus:
-        return TRUE;
-
-      default:
-        return FALSE;
-    }
-  }
-#endif
-
-
-  static FT_Error
-  raccess_guess_apple_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    FT_Int32  magic = ( 0x00 << 24 ) |
-                      ( 0x05 << 16 ) |
-                      ( 0x16 <<  8 ) |
-                        0x07;
-
-
-    *result_file_name = NULL;
-    if ( NULL == stream )
-      return FT_THROW( Cannot_Open_Stream );
-
-    return raccess_guess_apple_generic( library, stream, base_file_name,
-                                        magic, result_offset );
-  }
-
-
-  static FT_Error
-  raccess_guess_apple_single( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    FT_Int32  magic = ( 0x00 << 24 ) |
-                      ( 0x05 << 16 ) |
-                      ( 0x16 <<  8 ) |
-                        0x00;
-
-
-    *result_file_name = NULL;
-    if ( NULL == stream )
-      return FT_THROW( Cannot_Open_Stream );
-
-    return raccess_guess_apple_generic( library, stream, base_file_name,
-                                        magic, result_offset );
-  }
-
-
-  static FT_Error
-  raccess_guess_darwin_ufs_export( FT_Library  library,
-                                   FT_Stream   stream,
-                                   char       *base_file_name,
-                                   char      **result_file_name,
-                                   FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory  = library->memory;
-    newpath = raccess_make_file_name( memory, base_file_name, "._" );
-    if ( !newpath )
-      return FT_THROW( Out_Of_Memory );
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_darwin_hfsplus( FT_Library  library,
-                                FT_Stream   stream,
-                                char       *base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset )
-  {
-    /*
-      Only meaningful on systems with hfs+ drivers (or Macs).
-     */
-    FT_Error   error;
-    char*      newpath = NULL;
-    FT_Memory  memory;
-    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    if ( base_file_len + 6 > FT_INT_MAX )
-      return FT_THROW( Array_Too_Large );
-
-    if ( FT_ALLOC( newpath, base_file_len + 6 ) )
-      return error;
-
-    FT_MEM_COPY( newpath, base_file_name, base_file_len );
-    FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 );
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_darwin_newvfs( FT_Library  library,
-                               FT_Stream   stream,
-                               char       *base_file_name,
-                               char      **result_file_name,
-                               FT_Long    *result_offset )
-  {
-    /*
-      Only meaningful on systems with Mac OS X (> 10.1).
-     */
-    FT_Error   error;
-    char*      newpath = NULL;
-    FT_Memory  memory;
-    FT_Long    base_file_len = (FT_Long)ft_strlen( base_file_name );
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    if ( base_file_len + 18 > FT_INT_MAX )
-      return FT_THROW( Array_Too_Large );
-
-    if ( FT_ALLOC( newpath, base_file_len + 18 ) )
-      return error;
-
-    FT_MEM_COPY( newpath, base_file_name, base_file_len );
-    FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 );
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_vfat( FT_Library  library,
-                      FT_Stream   stream,
-                      char       *base_file_name,
-                      char      **result_file_name,
-                      FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name,
-                                      "resource.frk/" );
-    if ( !newpath )
-      return FT_THROW( Out_Of_Memory );
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_cap( FT_Library  library,
-                           FT_Stream   stream,
-                           char       *base_file_name,
-                           char      **result_file_name,
-                           FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name, ".resource/" );
-    if ( !newpath )
-      return FT_THROW( Out_Of_Memory );
-
-    *result_file_name = newpath;
-    *result_offset    = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_double( FT_Library  library,
-                              FT_Stream   stream,
-                              char       *base_file_name,
-                              char      **result_file_name,
-                              FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name, "%" );
-    if ( !newpath )
-      return FT_THROW( Out_Of_Memory );
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_netatalk( FT_Library  library,
-                                FT_Stream   stream,
-                                char       *base_file_name,
-                                char      **result_file_name,
-                                FT_Long    *result_offset )
-  {
-    char*      newpath;
-    FT_Error   error;
-    FT_Memory  memory;
-
-    FT_UNUSED( stream );
-
-
-    memory = library->memory;
-
-    newpath = raccess_make_file_name( memory, base_file_name,
-                                      ".AppleDouble/" );
-    if ( !newpath )
-      return FT_THROW( Out_Of_Memory );
-
-    error = raccess_guess_linux_double_from_file_name( library, newpath,
-                                                       result_offset );
-    if ( !error )
-      *result_file_name = newpath;
-    else
-      FT_FREE( newpath );
-
-    return error;
-  }
-
-
-  static FT_Error
-  raccess_guess_apple_generic( FT_Library  library,
-                               FT_Stream   stream,
-                               char       *base_file_name,
-                               FT_Int32    magic,
-                               FT_Long    *result_offset )
-  {
-    FT_Int32   magic_from_stream;
-    FT_Error   error;
-    FT_Int32   version_number = 0;
-    FT_UShort  n_of_entries;
-
-    int        i;
-    FT_Int32   entry_id, entry_offset, entry_length = 0;
-
-    const FT_Int32  resource_fork_entry_id = 0x2;
-
-    FT_UNUSED( library );
-    FT_UNUSED( base_file_name );
-    FT_UNUSED( version_number );
-    FT_UNUSED( entry_length   );
-
-
-    if ( FT_READ_LONG( magic_from_stream ) )
-      return error;
-    if ( magic_from_stream != magic )
-      return FT_THROW( Unknown_File_Format );
-
-    if ( FT_READ_LONG( version_number ) )
-      return error;
-
-    /* filler */
-    error = FT_Stream_Skip( stream, 16 );
-    if ( error )
-      return error;
-
-    if ( FT_READ_USHORT( n_of_entries ) )
-      return error;
-    if ( n_of_entries == 0 )
-      return FT_THROW( Unknown_File_Format );
-
-    for ( i = 0; i < n_of_entries; i++ )
-    {
-      if ( FT_READ_LONG( entry_id ) )
-        return error;
-      if ( entry_id == resource_fork_entry_id )
-      {
-        if ( FT_READ_LONG( entry_offset ) ||
-             FT_READ_LONG( entry_length ) )
-          continue;
-        *result_offset = entry_offset;
-
-        return FT_Err_Ok;
-      }
-      else
-      {
-        error = FT_Stream_Skip( stream, 4 + 4 );    /* offset + length */
-        if ( error )
-          return error;
-      }
-    }
-
-    return FT_THROW( Unknown_File_Format );
-  }
-
-
-  static FT_Error
-  raccess_guess_linux_double_from_file_name( FT_Library  library,
-                                             char       *file_name,
-                                             FT_Long    *result_offset )
-  {
-    FT_Open_Args  args2;
-    FT_Stream     stream2;
-    char *        nouse = NULL;
-    FT_Error      error;
-
-
-    args2.flags    = FT_OPEN_PATHNAME;
-    args2.pathname = file_name;
-    error = FT_Stream_New( library, &args2, &stream2 );
-    if ( error )
-      return error;
-
-    error = raccess_guess_apple_double( library, stream2, file_name,
-                                        &nouse, result_offset );
-
-    FT_Stream_Free( stream2, 0 );
-
-    return error;
-  }
-
-
-  static char*
-  raccess_make_file_name( FT_Memory    memory,
-                          const char  *original_name,
-                          const char  *insertion )
-  {
-    char*        new_name = NULL;
-    const char*  tmp;
-    const char*  slash;
-    size_t       new_length;
-    FT_Error     error = FT_Err_Ok;
-
-    FT_UNUSED( error );
-
-
-    new_length = ft_strlen( original_name ) + ft_strlen( insertion );
-    if ( FT_ALLOC( new_name, new_length + 1 ) )
-      return NULL;
-
-    tmp = ft_strrchr( original_name, '/' );
-    if ( tmp )
-    {
-      ft_strncpy( new_name,
-                  original_name,
-                  (size_t)( tmp - original_name + 1 ) );
-      new_name[tmp - original_name + 1] = '\0';
-      slash = tmp + 1;
-    }
-    else
-    {
-      slash       = original_name;
-      new_name[0] = '\0';
-    }
-
-    ft_strcat( new_name, insertion );
-    ft_strcat( new_name, slash );
-
-    return new_name;
-  }
-
-
-#else   /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
-
-
-  /*************************************************************************/
-  /*                  Dummy function; just sets errors                     */
-  /*************************************************************************/
-
-  FT_BASE_DEF( void )
-  FT_Raccess_Guess( FT_Library  library,
-                    FT_Stream   stream,
-                    char       *base_name,
-                    char      **new_names,
-                    FT_Long    *offsets,
-                    FT_Error   *errors )
-  {
-    FT_Int  i;
-
-    FT_UNUSED( library );
-    FT_UNUSED( stream );
-    FT_UNUSED( base_name );
-
-
-    for ( i = 0; i < FT_RACCESS_N_RULES; i++ )
-    {
-      new_names[i] = NULL;
-      offsets[i]   = 0;
-      errors[i]    = FT_ERR( Unimplemented_Feature );
-    }
-  }
-
-
-#endif  /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftsnames.c b/third_party/freetype/src/base/ftsnames.c
deleted file mode 100644
index a5b41eb8..0000000
--- a/third_party/freetype/src/base/ftsnames.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsnames.c                                                             */
-/*                                                                         */
-/*    Simple interface to access SFNT name tables (which are used          */
-/*    to hold font names, copyright info, notices, etc.) (body).           */
-/*                                                                         */
-/*    This is _not_ used to retrieve glyph names!                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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_SFNT_NAMES_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-#include FT_INTERNAL_STREAM_H
-
-
-#ifdef TT_CONFIG_OPTION_SFNT_NAMES
-
-
-  /* documentation is in ftsnames.h */
-
-  FT_EXPORT_DEF( FT_UInt )
-  FT_Get_Sfnt_Name_Count( FT_Face  face )
-  {
-    return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0;
-  }
-
-
-  /* documentation is in ftsnames.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_Sfnt_Name( FT_Face       face,
-                    FT_UInt       idx,
-                    FT_SfntName  *aname )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-
-
-    if ( aname && face && FT_IS_SFNT( face ) )
-    {
-      TT_Face  ttface = (TT_Face)face;
-
-
-      if ( idx < (FT_UInt)ttface->num_names )
-      {
-        TT_NameEntryRec*  entry = ttface->name_table.names + idx;
-
-
-        /* 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;
-          }
-        }
-
-        aname->platform_id = entry->platformID;
-        aname->encoding_id = entry->encodingID;
-        aname->language_id = entry->languageID;
-        aname->name_id     = entry->nameID;
-        aname->string      = (FT_Byte*)entry->string;
-        aname->string_len  = entry->stringLength;
-
-        error = FT_Err_Ok;
-      }
-    }
-
-    return error;
-  }
-
-
-#endif /* TT_CONFIG_OPTION_SFNT_NAMES */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftstream.c b/third_party/freetype/src/base/ftstream.c
deleted file mode 100644
index a3f8c8b..0000000
--- a/third_party/freetype/src/base/ftstream.c
+++ /dev/null
@@ -1,860 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftstream.c                                                             */
-/*                                                                         */
-/*    I/O stream support (body).                                           */
-/*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_DEBUG_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_stream
-
-
-  FT_BASE_DEF( void )
-  FT_Stream_OpenMemory( FT_Stream       stream,
-                        const FT_Byte*  base,
-                        FT_ULong        size )
-  {
-    stream->base   = (FT_Byte*) base;
-    stream->size   = size;
-    stream->pos    = 0;
-    stream->cursor = NULL;
-    stream->read   = NULL;
-    stream->close  = NULL;
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Stream_Close( FT_Stream  stream )
-  {
-    if ( stream && stream->close )
-      stream->close( stream );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_Seek( FT_Stream  stream,
-                  FT_ULong   pos )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( stream->read )
-    {
-      if ( stream->read( stream, pos, 0, 0 ) )
-      {
-        FT_ERROR(( "FT_Stream_Seek:"
-                   " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-                   pos, stream->size ));
-
-        error = FT_THROW( Invalid_Stream_Operation );
-      }
-    }
-    /* note that seeking to the first position after the file is valid */
-    else if ( pos > stream->size )
-    {
-      FT_ERROR(( "FT_Stream_Seek:"
-                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-                 pos, stream->size ));
-
-      error = FT_THROW( Invalid_Stream_Operation );
-    }
-
-    if ( !error )
-      stream->pos = pos;
-
-    return error;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_Skip( FT_Stream  stream,
-                  FT_Long    distance )
-  {
-    if ( distance < 0 )
-      return FT_THROW( Invalid_Stream_Operation );
-
-    return FT_Stream_Seek( stream, stream->pos + (FT_ULong)distance );
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_Pos( FT_Stream  stream )
-  {
-    return stream->pos;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_Read( FT_Stream  stream,
-                  FT_Byte*   buffer,
-                  FT_ULong   count )
-  {
-    return FT_Stream_ReadAt( stream, stream->pos, buffer, count );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_ReadAt( FT_Stream  stream,
-                    FT_ULong   pos,
-                    FT_Byte*   buffer,
-                    FT_ULong   count )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_ULong  read_bytes;
-
-
-    if ( pos >= stream->size )
-    {
-      FT_ERROR(( "FT_Stream_ReadAt:"
-                 " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-                 pos, stream->size ));
-
-      return FT_THROW( Invalid_Stream_Operation );
-    }
-
-    if ( stream->read )
-      read_bytes = stream->read( stream, pos, buffer, count );
-    else
-    {
-      read_bytes = stream->size - pos;
-      if ( read_bytes > count )
-        read_bytes = count;
-
-      FT_MEM_COPY( buffer, stream->base + pos, read_bytes );
-    }
-
-    stream->pos = pos + read_bytes;
-
-    if ( read_bytes < count )
-    {
-      FT_ERROR(( "FT_Stream_ReadAt:"
-                 " invalid read; expected %lu bytes, got %lu\n",
-                 count, read_bytes ));
-
-      error = FT_THROW( Invalid_Stream_Operation );
-    }
-
-    return error;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_TryRead( FT_Stream  stream,
-                     FT_Byte*   buffer,
-                     FT_ULong   count )
-  {
-    FT_ULong  read_bytes = 0;
-
-
-    if ( stream->pos >= stream->size )
-      goto Exit;
-
-    if ( stream->read )
-      read_bytes = stream->read( stream, stream->pos, buffer, count );
-    else
-    {
-      read_bytes = stream->size - stream->pos;
-      if ( read_bytes > count )
-        read_bytes = count;
-
-      FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes );
-    }
-
-    stream->pos += read_bytes;
-
-  Exit:
-    return read_bytes;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_ExtractFrame( FT_Stream  stream,
-                          FT_ULong   count,
-                          FT_Byte**  pbytes )
-  {
-    FT_Error  error;
-
-
-    error = FT_Stream_EnterFrame( stream, count );
-    if ( !error )
-    {
-      *pbytes = (FT_Byte*)stream->cursor;
-
-      /* equivalent to FT_Stream_ExitFrame(), with no memory block release */
-      stream->cursor = NULL;
-      stream->limit  = NULL;
-    }
-
-    return error;
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Stream_ReleaseFrame( FT_Stream  stream,
-                          FT_Byte**  pbytes )
-  {
-    if ( stream && stream->read )
-    {
-      FT_Memory  memory = stream->memory;
-
-#ifdef FT_DEBUG_MEMORY
-      ft_mem_free( memory, *pbytes );
-      *pbytes = NULL;
-#else
-      FT_FREE( *pbytes );
-#endif
-    }
-    *pbytes = NULL;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_EnterFrame( FT_Stream  stream,
-                        FT_ULong   count )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_ULong  read_bytes;
-
-
-    /* check for nested frame access */
-    FT_ASSERT( stream && stream->cursor == 0 );
-
-    if ( stream->read )
-    {
-      /* allocate the frame in memory */
-      FT_Memory  memory = stream->memory;
-
-
-      /* simple sanity check */
-      if ( count > stream->size )
-      {
-        FT_ERROR(( "FT_Stream_EnterFrame:"
-                   " frame size (%lu) larger than stream size (%lu)\n",
-                   count, stream->size ));
-
-        error = FT_THROW( Invalid_Stream_Operation );
-        goto Exit;
-      }
-
-#ifdef FT_DEBUG_MEMORY
-      /* assume _ft_debug_file and _ft_debug_lineno are already set */
-      stream->base = (unsigned char*)ft_mem_qalloc( memory,
-                                                    (FT_Long)count,
-                                                    &error );
-      if ( error )
-        goto Exit;
-#else
-      if ( FT_QALLOC( stream->base, count ) )
-        goto Exit;
-#endif
-      /* read it */
-      read_bytes = stream->read( stream, stream->pos,
-                                 stream->base, count );
-      if ( read_bytes < count )
-      {
-        FT_ERROR(( "FT_Stream_EnterFrame:"
-                   " invalid read; expected %lu bytes, got %lu\n",
-                   count, read_bytes ));
-
-        FT_FREE( stream->base );
-        error = FT_THROW( Invalid_Stream_Operation );
-      }
-      stream->cursor = stream->base;
-      stream->limit  = stream->cursor + count;
-      stream->pos   += read_bytes;
-    }
-    else
-    {
-      /* check current and new position */
-      if ( stream->pos >= stream->size        ||
-           stream->size - stream->pos < count )
-      {
-        FT_ERROR(( "FT_Stream_EnterFrame:"
-                   " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n",
-                   stream->pos, count, stream->size ));
-
-        error = FT_THROW( Invalid_Stream_Operation );
-        goto Exit;
-      }
-
-      /* set cursor */
-      stream->cursor = stream->base + stream->pos;
-      stream->limit  = stream->cursor + count;
-      stream->pos   += count;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Stream_ExitFrame( FT_Stream  stream )
-  {
-    /* IMPORTANT: The assertion stream->cursor != 0 was removed, given    */
-    /*            that it is possible to access a frame of length 0 in    */
-    /*            some weird fonts (usually, when accessing an array of   */
-    /*            0 records, like in some strange kern tables).           */
-    /*                                                                    */
-    /*  In this case, the loader code handles the 0-length table          */
-    /*  gracefully; however, stream.cursor is really set to 0 by the      */
-    /*  FT_Stream_EnterFrame() call, and this is not an error.            */
-    /*                                                                    */
-    FT_ASSERT( stream );
-
-    if ( stream->read )
-    {
-      FT_Memory  memory = stream->memory;
-
-#ifdef FT_DEBUG_MEMORY
-      ft_mem_free( memory, stream->base );
-      stream->base = NULL;
-#else
-      FT_FREE( stream->base );
-#endif
-    }
-    stream->cursor = NULL;
-    stream->limit  = NULL;
-  }
-
-
-  FT_BASE_DEF( FT_Char )
-  FT_Stream_GetChar( FT_Stream  stream )
-  {
-    FT_Char  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result = 0;
-    if ( stream->cursor < stream->limit )
-      result = (FT_Char)*stream->cursor++;
-
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_UShort )
-  FT_Stream_GetUShort( FT_Stream  stream )
-  {
-    FT_Byte*   p;
-    FT_UShort  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result         = 0;
-    p              = stream->cursor;
-    if ( p + 1 < stream->limit )
-      result       = FT_NEXT_USHORT( p );
-    stream->cursor = p;
-
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_UShort )
-  FT_Stream_GetUShortLE( FT_Stream  stream )
-  {
-    FT_Byte*   p;
-    FT_UShort  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result         = 0;
-    p              = stream->cursor;
-    if ( p + 1 < stream->limit )
-      result       = FT_NEXT_USHORT_LE( p );
-    stream->cursor = p;
-
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_GetUOffset( FT_Stream  stream )
-  {
-    FT_Byte*  p;
-    FT_ULong  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result         = 0;
-    p              = stream->cursor;
-    if ( p + 2 < stream->limit )
-      result       = FT_NEXT_UOFF3( p );
-    stream->cursor = p;
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_GetULong( FT_Stream  stream )
-  {
-    FT_Byte*  p;
-    FT_ULong  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result         = 0;
-    p              = stream->cursor;
-    if ( p + 3 < stream->limit )
-      result       = FT_NEXT_ULONG( p );
-    stream->cursor = p;
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_GetULongLE( FT_Stream  stream )
-  {
-    FT_Byte*  p;
-    FT_ULong  result;
-
-
-    FT_ASSERT( stream && stream->cursor );
-
-    result         = 0;
-    p              = stream->cursor;
-    if ( p + 3 < stream->limit )
-      result       = FT_NEXT_ULONG_LE( p );
-    stream->cursor = p;
-    return result;
-  }
-
-
-  FT_BASE_DEF( FT_Char )
-  FT_Stream_ReadChar( FT_Stream  stream,
-                      FT_Error*  error )
-  {
-    FT_Byte  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->read )
-    {
-      if ( stream->read( stream, stream->pos, &result, 1L ) != 1L )
-        goto Fail;
-    }
-    else
-    {
-      if ( stream->pos < stream->size )
-        result = stream->base[stream->pos];
-      else
-        goto Fail;
-    }
-    stream->pos++;
-
-    return (FT_Char)result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadChar:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_UShort )
-  FT_Stream_ReadUShort( FT_Stream  stream,
-                        FT_Error*  error )
-  {
-    FT_Byte    reads[2];
-    FT_Byte*   p      = 0;
-    FT_UShort  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->pos + 1 < stream->size )
-    {
-      if ( stream->read )
-      {
-        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
-          goto Fail;
-
-        p = reads;
-      }
-      else
-        p = stream->base + stream->pos;
-
-      if ( p )
-        result = FT_NEXT_USHORT( p );
-    }
-    else
-      goto Fail;
-
-    stream->pos += 2;
-
-    return result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadUShort:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_UShort )
-  FT_Stream_ReadUShortLE( FT_Stream  stream,
-                          FT_Error*  error )
-  {
-    FT_Byte    reads[2];
-    FT_Byte*   p      = 0;
-    FT_UShort  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->pos + 1 < stream->size )
-    {
-      if ( stream->read )
-      {
-        if ( stream->read( stream, stream->pos, reads, 2L ) != 2L )
-          goto Fail;
-
-        p = reads;
-      }
-      else
-        p = stream->base + stream->pos;
-
-      if ( p )
-        result = FT_NEXT_USHORT_LE( p );
-    }
-    else
-      goto Fail;
-
-    stream->pos += 2;
-
-    return result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadUShortLE:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_ReadUOffset( FT_Stream  stream,
-                         FT_Error*  error )
-  {
-    FT_Byte   reads[3];
-    FT_Byte*  p      = 0;
-    FT_ULong  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->pos + 2 < stream->size )
-    {
-      if ( stream->read )
-      {
-        if (stream->read( stream, stream->pos, reads, 3L ) != 3L )
-          goto Fail;
-
-        p = reads;
-      }
-      else
-        p = stream->base + stream->pos;
-
-      if ( p )
-        result = FT_NEXT_UOFF3( p );
-    }
-    else
-      goto Fail;
-
-    stream->pos += 3;
-
-    return result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadUOffset:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_ReadULong( FT_Stream  stream,
-                       FT_Error*  error )
-  {
-    FT_Byte   reads[4];
-    FT_Byte*  p      = 0;
-    FT_ULong  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->pos + 3 < stream->size )
-    {
-      if ( stream->read )
-      {
-        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
-          goto Fail;
-
-        p = reads;
-      }
-      else
-        p = stream->base + stream->pos;
-
-      if ( p )
-        result = FT_NEXT_ULONG( p );
-    }
-    else
-      goto Fail;
-
-    stream->pos += 4;
-
-    return result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadULong:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_ULong )
-  FT_Stream_ReadULongLE( FT_Stream  stream,
-                         FT_Error*  error )
-  {
-    FT_Byte   reads[4];
-    FT_Byte*  p      = 0;
-    FT_ULong  result = 0;
-
-
-    FT_ASSERT( stream );
-
-    *error = FT_Err_Ok;
-
-    if ( stream->pos + 3 < stream->size )
-    {
-      if ( stream->read )
-      {
-        if ( stream->read( stream, stream->pos, reads, 4L ) != 4L )
-          goto Fail;
-
-        p = reads;
-      }
-      else
-        p = stream->base + stream->pos;
-
-      if ( p )
-        result = FT_NEXT_ULONG_LE( p );
-    }
-    else
-      goto Fail;
-
-    stream->pos += 4;
-
-    return result;
-
-  Fail:
-    *error = FT_THROW( Invalid_Stream_Operation );
-    FT_ERROR(( "FT_Stream_ReadULongLE:"
-               " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
-               stream->pos, stream->size ));
-
-    return 0;
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_ReadFields( FT_Stream              stream,
-                        const FT_Frame_Field*  fields,
-                        void*                  structure )
-  {
-    FT_Error  error;
-    FT_Bool   frame_accessed = 0;
-    FT_Byte*  cursor;
-
-
-    if ( !fields )
-      return FT_THROW( Invalid_Argument );
-
-    if ( !stream )
-      return FT_THROW( Invalid_Stream_Handle );
-
-    cursor = stream->cursor;
-
-    error = FT_Err_Ok;
-    do
-    {
-      FT_ULong  value;
-      FT_Int    sign_shift;
-      FT_Byte*  p;
-
-
-      switch ( fields->value )
-      {
-      case ft_frame_start:  /* access a new frame */
-        error = FT_Stream_EnterFrame( stream, fields->offset );
-        if ( error )
-          goto Exit;
-
-        frame_accessed = 1;
-        cursor         = stream->cursor;
-        fields++;
-        continue;  /* loop! */
-
-      case ft_frame_bytes:  /* read a byte sequence */
-      case ft_frame_skip:   /* skip some bytes      */
-        {
-          FT_UInt  len = fields->size;
-
-
-          if ( cursor + len > stream->limit )
-          {
-            error = FT_THROW( Invalid_Stream_Operation );
-            goto Exit;
-          }
-
-          if ( fields->value == ft_frame_bytes )
-          {
-            p = (FT_Byte*)structure + fields->offset;
-            FT_MEM_COPY( p, cursor, len );
-          }
-          cursor += len;
-          fields++;
-          continue;
-        }
-
-      case ft_frame_byte:
-      case ft_frame_schar:  /* read a single byte */
-        value = FT_NEXT_BYTE( cursor );
-        sign_shift = 24;
-        break;
-
-      case ft_frame_short_be:
-      case ft_frame_ushort_be:  /* read a 2-byte big-endian short */
-        value = FT_NEXT_USHORT( cursor );
-        sign_shift = 16;
-        break;
-
-      case ft_frame_short_le:
-      case ft_frame_ushort_le:  /* read a 2-byte little-endian short */
-        value = FT_NEXT_USHORT_LE( cursor );
-        sign_shift = 16;
-        break;
-
-      case ft_frame_long_be:
-      case ft_frame_ulong_be:  /* read a 4-byte big-endian long */
-        value = FT_NEXT_ULONG( cursor );
-        sign_shift = 0;
-        break;
-
-      case ft_frame_long_le:
-      case ft_frame_ulong_le:  /* read a 4-byte little-endian long */
-        value = FT_NEXT_ULONG_LE( cursor );
-        sign_shift = 0;
-        break;
-
-      case ft_frame_off3_be:
-      case ft_frame_uoff3_be:  /* read a 3-byte big-endian long */
-        value = FT_NEXT_UOFF3( cursor );
-        sign_shift = 8;
-        break;
-
-      case ft_frame_off3_le:
-      case ft_frame_uoff3_le:  /* read a 3-byte little-endian long */
-        value = FT_NEXT_UOFF3_LE( cursor );
-        sign_shift = 8;
-        break;
-
-      default:
-        /* otherwise, exit the loop */
-        stream->cursor = cursor;
-        goto Exit;
-      }
-
-      /* now, compute the signed value is necessary */
-      if ( fields->value & FT_FRAME_OP_SIGNED )
-        value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift );
-
-      /* finally, store the value in the object */
-
-      p = (FT_Byte*)structure + fields->offset;
-      switch ( fields->size )
-      {
-      case ( 8 / FT_CHAR_BIT ):
-        *(FT_Byte*)p = (FT_Byte)value;
-        break;
-
-      case ( 16 / FT_CHAR_BIT ):
-        *(FT_UShort*)p = (FT_UShort)value;
-        break;
-
-      case ( 32 / FT_CHAR_BIT ):
-        *(FT_UInt32*)p = (FT_UInt32)value;
-        break;
-
-      default:  /* for 64-bit systems */
-        *(FT_ULong*)p = (FT_ULong)value;
-      }
-
-      /* go to next field */
-      fields++;
-    }
-    while ( 1 );
-
-  Exit:
-    /* close the frame if it was opened by this read */
-    if ( frame_accessed )
-      FT_Stream_ExitFrame( stream );
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftsystem.c b/third_party/freetype/src/base/ftsystem.c
deleted file mode 100644
index 324f949..0000000
--- a/third_party/freetype/src/base/ftsystem.c
+++ /dev/null
@@ -1,320 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsystem.c                                                             */
-/*                                                                         */
-/*    ANSI-specific FreeType low-level system interface (body).            */
-/*                                                                         */
-/*  Copyright 1996-2017 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 contains the default interface used by FreeType to access   */
-  /* low-level, i.e. memory management, i/o access as well as thread       */
-  /* synchronisation.  It can be replaced by user-specific routines if     */
-  /* necessary.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_SYSTEM_H
-#include FT_ERRORS_H
-#include FT_TYPES_H
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                       MEMORY MANAGEMENT INTERFACE                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* It is not necessary to do any error checking for the                  */
-  /* allocation-related functions.  This will be done by the higher level  */
-  /* routines like ft_mem_alloc() or ft_mem_realloc().                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_alloc                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The memory allocation function.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A pointer to the memory object.                          */
-  /*                                                                       */
-  /*    size   :: The requested size in bytes.                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The address of newly allocated block.                              */
-  /*                                                                       */
-  FT_CALLBACK_DEF( void* )
-  ft_alloc( FT_Memory  memory,
-            long       size )
-  {
-    FT_UNUSED( memory );
-
-    return ft_smalloc( (size_t)size );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_realloc                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The memory reallocation function.                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory   :: A pointer to the memory object.                        */
-  /*                                                                       */
-  /*    cur_size :: The current size of the allocated memory block.        */
-  /*                                                                       */
-  /*    new_size :: The newly requested size in bytes.                     */
-  /*                                                                       */
-  /*    block    :: The current address of the block in memory.            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The address of the reallocated memory block.                       */
-  /*                                                                       */
-  FT_CALLBACK_DEF( void* )
-  ft_realloc( FT_Memory  memory,
-              long       cur_size,
-              long       new_size,
-              void*      block )
-  {
-    FT_UNUSED( memory );
-    FT_UNUSED( cur_size );
-
-    return ft_srealloc( block, (size_t)new_size );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_free                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The memory release function.                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory  :: A pointer to the memory object.                         */
-  /*                                                                       */
-  /*    block   :: The address of block in memory to be freed.             */
-  /*                                                                       */
-  FT_CALLBACK_DEF( void )
-  ft_free( FT_Memory  memory,
-           void*      block )
-  {
-    FT_UNUSED( memory );
-
-    ft_sfree( block );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                     RESOURCE MANAGEMENT INTERFACE                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_io
-
-  /* We use the macro STREAM_FILE for convenience to extract the       */
-  /* system-specific stream handle from a given FreeType stream object */
-#define STREAM_FILE( stream )  ( (FT_FILE*)stream->descriptor.pointer )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_ansi_stream_close                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The function to close a stream.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A pointer to the stream object.                          */
-  /*                                                                       */
-  FT_CALLBACK_DEF( void )
-  ft_ansi_stream_close( FT_Stream  stream )
-  {
-    ft_fclose( STREAM_FILE( stream ) );
-
-    stream->descriptor.pointer = NULL;
-    stream->size               = 0;
-    stream->base               = NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_ansi_stream_io                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The function to open a stream.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A pointer to the stream object.                          */
-  /*                                                                       */
-  /*    offset :: The position in the data stream to start reading.        */
-  /*                                                                       */
-  /*    buffer :: The address of buffer to store the read data.            */
-  /*                                                                       */
-  /*    count  :: The number of bytes to read from the stream.             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The number of bytes actually read.  If `count' is zero (this is,   */
-  /*    the function is used for seeking), a non-zero return value         */
-  /*    indicates an error.                                                */
-  /*                                                                       */
-  FT_CALLBACK_DEF( unsigned long )
-  ft_ansi_stream_io( FT_Stream       stream,
-                     unsigned long   offset,
-                     unsigned char*  buffer,
-                     unsigned long   count )
-  {
-    FT_FILE*  file;
-
-
-    if ( !count && offset > stream->size )
-      return 1;
-
-    file = STREAM_FILE( stream );
-
-    if ( stream->pos != offset )
-      ft_fseek( file, (long)offset, SEEK_SET );
-
-    return (unsigned long)ft_fread( buffer, 1, count, file );
-  }
-
-
-  /* documentation is in ftstream.h */
-
-  FT_BASE_DEF( FT_Error )
-  FT_Stream_Open( FT_Stream    stream,
-                  const char*  filepathname )
-  {
-    FT_FILE*  file;
-
-
-    if ( !stream )
-      return FT_THROW( Invalid_Stream_Handle );
-
-    stream->descriptor.pointer = NULL;
-    stream->pathname.pointer   = (char*)filepathname;
-    stream->base               = NULL;
-    stream->pos                = 0;
-    stream->read               = NULL;
-    stream->close              = NULL;
-
-    file = ft_fopen( filepathname, "rb" );
-    if ( !file )
-    {
-      FT_ERROR(( "FT_Stream_Open:"
-                 " could not open `%s'\n", filepathname ));
-
-      return FT_THROW( Cannot_Open_Resource );
-    }
-
-    ft_fseek( file, 0, SEEK_END );
-    stream->size = (unsigned long)ft_ftell( file );
-    if ( !stream->size )
-    {
-      FT_ERROR(( "FT_Stream_Open:" ));
-      FT_ERROR(( " opened `%s' but zero-sized\n", filepathname ));
-      ft_fclose( file );
-      return FT_THROW( Cannot_Open_Stream );
-    }
-    ft_fseek( file, 0, SEEK_SET );
-
-    stream->descriptor.pointer = file;
-    stream->read  = ft_ansi_stream_io;
-    stream->close = ft_ansi_stream_close;
-
-    FT_TRACE1(( "FT_Stream_Open:" ));
-    FT_TRACE1(( " opened `%s' (%d bytes) successfully\n",
-                filepathname, stream->size ));
-
-    return FT_Err_Ok;
-  }
-
-#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */
-
-#ifdef FT_DEBUG_MEMORY
-
-  extern FT_Int
-  ft_mem_debug_init( FT_Memory  memory );
-
-  extern void
-  ft_mem_debug_done( FT_Memory  memory );
-
-#endif
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( FT_Memory )
-  FT_New_Memory( void )
-  {
-    FT_Memory  memory;
-
-
-    memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) );
-    if ( memory )
-    {
-      memory->user    = NULL;
-      memory->alloc   = ft_alloc;
-      memory->realloc = ft_realloc;
-      memory->free    = ft_free;
-#ifdef FT_DEBUG_MEMORY
-      ft_mem_debug_init( memory );
-#endif
-    }
-
-    return memory;
-  }
-
-
-  /* documentation is in ftobjs.h */
-
-  FT_BASE_DEF( void )
-  FT_Done_Memory( FT_Memory  memory )
-  {
-#ifdef FT_DEBUG_MEMORY
-    ft_mem_debug_done( memory );
-#endif
-    ft_sfree( memory );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/fttrigon.c b/third_party/freetype/src/base/fttrigon.c
deleted file mode 100644
index 7a4d17c..0000000
--- a/third_party/freetype/src/base/fttrigon.c
+++ /dev/null
@@ -1,526 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fttrigon.c                                                             */
-/*                                                                         */
-/*    FreeType trigonometric functions (body).                             */
-/*                                                                         */
-/*  Copyright 2001-2017 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 is a fixed-point CORDIC implementation of trigonometric          */
-  /* functions as well as transformations between Cartesian and polar      */
-  /* coordinates.  The angles are represented as 16.16 fixed-point values  */
-  /* in degrees, i.e., the angular resolution is 2^-16 degrees.  Note that */
-  /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a       */
-  /* discrete Cartesian grid can have the same or better angular           */
-  /* resolution.  Therefore, to maintain this precision, some functions    */
-  /* require an interim upscaling of the vectors, whereas others operate   */
-  /* with 24-bit long vectors directly.                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_CALC_H
-#include FT_TRIGONOMETRY_H
-
-
-  /* the Cordic shrink factor 0.858785336480436 * 2^32 */
-#define FT_TRIG_SCALE      0xDBD95B16UL
-
-  /* the highest bit in overflow-safe vector components, */
-  /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30         */
-#define FT_TRIG_SAFE_MSB   29
-
-  /* this table was generated for FT_PI = 180L << 16, i.e. degrees */
-#define FT_TRIG_MAX_ITERS  23
-
-  static const FT_Angle
-  ft_trig_arctan_table[] =
-  {
-    1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L,
-    14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L,
-    57L, 29L, 14L, 7L, 4L, 2L, 1L
-  };
-
-
-#ifdef FT_LONG64
-
-  /* multiply a given value by the CORDIC shrink factor */
-  static FT_Fixed
-  ft_trig_downscale( FT_Fixed  val )
-  {
-    FT_Int  s = 1;
-
-
-    if ( val < 0 )
-    {
-       val = -val;
-       s = -1;
-    }
-
-    /* 0x40000000 comes from regression analysis between true */
-    /* and CORDIC hypotenuse, so it minimizes the error       */
-    val = (FT_Fixed)(
-            ( (FT_UInt64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 );
-
-    return s < 0 ? -val : val;
-  }
-
-#else /* !FT_LONG64 */
-
-  /* multiply a given value by the CORDIC shrink factor */
-  static FT_Fixed
-  ft_trig_downscale( FT_Fixed  val )
-  {
-    FT_Int     s = 1;
-    FT_UInt32  lo1, hi1, lo2, hi2, lo, hi, i1, i2;
-
-
-    if ( val < 0 )
-    {
-       val = -val;
-       s = -1;
-    }
-
-    lo1 = (FT_UInt32)val & 0x0000FFFFU;
-    hi1 = (FT_UInt32)val >> 16;
-    lo2 = FT_TRIG_SCALE & 0x0000FFFFU;
-    hi2 = FT_TRIG_SCALE >> 16;
-
-    lo = lo1 * lo2;
-    i1 = lo1 * hi2;
-    i2 = lo2 * hi1;
-    hi = hi1 * hi2;
-
-    /* Check carry overflow of i1 + i2 */
-    i1 += i2;
-    hi += (FT_UInt32)( i1 < i2 ) << 16;
-
-    hi += i1 >> 16;
-    i1  = i1 << 16;
-
-    /* Check carry overflow of i1 + lo */
-    lo += i1;
-    hi += ( lo < i1 );
-
-    /* 0x40000000 comes from regression analysis between true */
-    /* and CORDIC hypotenuse, so it minimizes the error       */
-
-    /* Check carry overflow of lo + 0x40000000 */
-    lo += 0x40000000UL;
-    hi += ( lo < 0x40000000UL );
-
-    val = (FT_Fixed)hi;
-
-    return s < 0 ? -val : val;
-  }
-
-#endif /* !FT_LONG64 */
-
-
-  /* undefined and never called for zero vector */
-  static FT_Int
-  ft_trig_prenorm( FT_Vector*  vec )
-  {
-    FT_Pos  x, y;
-    FT_Int  shift;
-
-
-    x = vec->x;
-    y = vec->y;
-
-    shift = FT_MSB( (FT_UInt32)( FT_ABS( x ) | FT_ABS( y ) ) );
-
-    if ( shift <= FT_TRIG_SAFE_MSB )
-    {
-      shift  = FT_TRIG_SAFE_MSB - shift;
-      vec->x = (FT_Pos)( (FT_ULong)x << shift );
-      vec->y = (FT_Pos)( (FT_ULong)y << shift );
-    }
-    else
-    {
-      shift -= FT_TRIG_SAFE_MSB;
-      vec->x = x >> shift;
-      vec->y = y >> shift;
-      shift  = -shift;
-    }
-
-    return shift;
-  }
-
-
-  static void
-  ft_trig_pseudo_rotate( FT_Vector*  vec,
-                         FT_Angle    theta )
-  {
-    FT_Int           i;
-    FT_Fixed         x, y, xtemp, b;
-    const FT_Angle  *arctanptr;
-
-
-    x = vec->x;
-    y = vec->y;
-
-    /* Rotate inside [-PI/4,PI/4] sector */
-    while ( theta < -FT_ANGLE_PI4 )
-    {
-      xtemp  =  y;
-      y      = -x;
-      x      =  xtemp;
-      theta +=  FT_ANGLE_PI2;
-    }
-
-    while ( theta > FT_ANGLE_PI4 )
-    {
-      xtemp  = -y;
-      y      =  x;
-      x      =  xtemp;
-      theta -=  FT_ANGLE_PI2;
-    }
-
-    arctanptr = ft_trig_arctan_table;
-
-    /* Pseudorotations, with right shifts */
-    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
-    {
-      if ( theta < 0 )
-      {
-        xtemp  = x + ( ( y + b ) >> i );
-        y      = y - ( ( x + b ) >> i );
-        x      = xtemp;
-        theta += *arctanptr++;
-      }
-      else
-      {
-        xtemp  = x - ( ( y + b ) >> i );
-        y      = y + ( ( x + b ) >> i );
-        x      = xtemp;
-        theta -= *arctanptr++;
-      }
-    }
-
-    vec->x = x;
-    vec->y = y;
-  }
-
-
-  static void
-  ft_trig_pseudo_polarize( FT_Vector*  vec )
-  {
-    FT_Angle         theta;
-    FT_Int           i;
-    FT_Fixed         x, y, xtemp, b;
-    const FT_Angle  *arctanptr;
-
-
-    x = vec->x;
-    y = vec->y;
-
-    /* Get the vector into [-PI/4,PI/4] sector */
-    if ( y > x )
-    {
-      if ( y > -x )
-      {
-        theta =  FT_ANGLE_PI2;
-        xtemp =  y;
-        y     = -x;
-        x     =  xtemp;
-      }
-      else
-      {
-        theta =  y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI;
-        x     = -x;
-        y     = -y;
-      }
-    }
-    else
-    {
-      if ( y < -x )
-      {
-        theta = -FT_ANGLE_PI2;
-        xtemp = -y;
-        y     =  x;
-        x     =  xtemp;
-      }
-      else
-      {
-        theta = 0;
-      }
-    }
-
-    arctanptr = ft_trig_arctan_table;
-
-    /* Pseudorotations, with right shifts */
-    for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ )
-    {
-      if ( y > 0 )
-      {
-        xtemp  = x + ( ( y + b ) >> i );
-        y      = y - ( ( x + b ) >> i );
-        x      = xtemp;
-        theta += *arctanptr++;
-      }
-      else
-      {
-        xtemp  = x - ( ( y + b ) >> i );
-        y      = y + ( ( x + b ) >> i );
-        x      = xtemp;
-        theta -= *arctanptr++;
-      }
-    }
-
-    /* round theta to acknowledge its error that mostly comes */
-    /* from accumulated rounding errors in the arctan table   */
-    if ( theta >= 0 )
-      theta = FT_PAD_ROUND( theta, 16 );
-    else
-      theta = -FT_PAD_ROUND( -theta, 16 );
-
-    vec->x = x;
-    vec->y = theta;
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_Cos( FT_Angle  angle )
-  {
-    FT_Vector  v;
-
-
-    FT_Vector_Unit( &v, angle );
-
-    return v.x;
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_Sin( FT_Angle  angle )
-  {
-    FT_Vector  v;
-
-
-    FT_Vector_Unit( &v, angle );
-
-    return v.y;
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_Tan( FT_Angle  angle )
-  {
-    FT_Vector  v;
-
-
-    FT_Vector_Unit( &v, angle );
-
-    return FT_DivFix( v.y, v.x );
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Angle )
-  FT_Atan2( FT_Fixed  dx,
-            FT_Fixed  dy )
-  {
-    FT_Vector  v;
-
-
-    if ( dx == 0 && dy == 0 )
-      return 0;
-
-    v.x = dx;
-    v.y = dy;
-    ft_trig_prenorm( &v );
-    ft_trig_pseudo_polarize( &v );
-
-    return v.y;
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Vector_Unit( FT_Vector*  vec,
-                  FT_Angle    angle )
-  {
-    if ( !vec )
-      return;
-
-    vec->x = FT_TRIG_SCALE >> 8;
-    vec->y = 0;
-    ft_trig_pseudo_rotate( vec, angle );
-    vec->x = ( vec->x + 0x80L ) >> 8;
-    vec->y = ( vec->y + 0x80L ) >> 8;
-  }
-
-
-  /* these macros return 0 for positive numbers,
-     and -1 for negative ones */
-#define FT_SIGN_LONG( x )   ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) )
-#define FT_SIGN_INT( x )    ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) )
-#define FT_SIGN_INT32( x )  ( (x) >> 31 )
-#define FT_SIGN_INT16( x )  ( (x) >> 15 )
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Vector_Rotate( FT_Vector*  vec,
-                    FT_Angle    angle )
-  {
-    FT_Int     shift;
-    FT_Vector  v;
-
-
-    if ( !vec || !angle )
-      return;
-
-    v = *vec;
-
-    if ( v.x == 0 && v.y == 0 )
-      return;
-
-    shift = ft_trig_prenorm( &v );
-    ft_trig_pseudo_rotate( &v, angle );
-    v.x = ft_trig_downscale( v.x );
-    v.y = ft_trig_downscale( v.y );
-
-    if ( shift > 0 )
-    {
-      FT_Int32  half = (FT_Int32)1L << ( shift - 1 );
-
-
-      vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift;
-      vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift;
-    }
-    else
-    {
-      shift  = -shift;
-      vec->x = (FT_Pos)( (FT_ULong)v.x << shift );
-      vec->y = (FT_Pos)( (FT_ULong)v.y << shift );
-    }
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Fixed )
-  FT_Vector_Length( FT_Vector*  vec )
-  {
-    FT_Int     shift;
-    FT_Vector  v;
-
-
-    if ( !vec )
-      return 0;
-
-    v = *vec;
-
-    /* handle trivial cases */
-    if ( v.x == 0 )
-    {
-      return FT_ABS( v.y );
-    }
-    else if ( v.y == 0 )
-    {
-      return FT_ABS( v.x );
-    }
-
-    /* general case */
-    shift = ft_trig_prenorm( &v );
-    ft_trig_pseudo_polarize( &v );
-
-    v.x = ft_trig_downscale( v.x );
-
-    if ( shift > 0 )
-      return ( v.x + ( 1L << ( shift - 1 ) ) ) >> shift;
-
-    return (FT_Fixed)( (FT_UInt32)v.x << -shift );
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Vector_Polarize( FT_Vector*  vec,
-                      FT_Fixed   *length,
-                      FT_Angle   *angle )
-  {
-    FT_Int     shift;
-    FT_Vector  v;
-
-
-    if ( !vec || !length || !angle )
-      return;
-
-    v = *vec;
-
-    if ( v.x == 0 && v.y == 0 )
-      return;
-
-    shift = ft_trig_prenorm( &v );
-    ft_trig_pseudo_polarize( &v );
-
-    v.x = ft_trig_downscale( v.x );
-
-    *length = shift >= 0 ?                      ( v.x >>  shift )
-                         : (FT_Fixed)( (FT_UInt32)v.x << -shift );
-    *angle  = v.y;
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Vector_From_Polar( FT_Vector*  vec,
-                        FT_Fixed    length,
-                        FT_Angle    angle )
-  {
-    if ( !vec )
-      return;
-
-    vec->x = length;
-    vec->y = 0;
-
-    FT_Vector_Rotate( vec, angle );
-  }
-
-
-  /* documentation is in fttrigon.h */
-
-  FT_EXPORT_DEF( FT_Angle )
-  FT_Angle_Diff( FT_Angle  angle1,
-                 FT_Angle  angle2 )
-  {
-    FT_Angle  delta = angle2 - angle1;
-
-
-    while ( delta <= -FT_ANGLE_PI )
-      delta += FT_ANGLE_2PI;
-
-    while ( delta > FT_ANGLE_PI )
-      delta -= FT_ANGLE_2PI;
-
-    return delta;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/fttype1.c b/third_party/freetype/src/base/fttype1.c
deleted file mode 100644
index 4d16a63..0000000
--- a/third_party/freetype/src/base/fttype1.c
+++ /dev/null
@@ -1,127 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fttype1.c                                                              */
-/*                                                                         */
-/*    FreeType utility file for PS names support (body).                   */
-/*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_SERVICE_H
-#include FT_SERVICE_POSTSCRIPT_INFO_H
-
-
-  /* documentation is in t1tables.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_PS_Font_Info( FT_Face          face,
-                       PS_FontInfoRec*  afont_info )
-  {
-    FT_Error           error;
-    FT_Service_PsInfo  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !afont_info )
-      return FT_THROW( Invalid_Argument );
-
-    FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
-
-    if ( service && service->ps_get_font_info )
-      error = service->ps_get_font_info( face, afont_info );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-  /* documentation is in t1tables.h */
-
-  FT_EXPORT_DEF( FT_Int )
-  FT_Has_PS_Glyph_Names( FT_Face  face )
-  {
-    FT_Int             result = 0;
-    FT_Service_PsInfo  service;
-
-
-    if ( face )
-    {
-      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
-
-      if ( service && service->ps_has_glyph_names )
-        result = service->ps_has_glyph_names( face );
-    }
-
-    return result;
-  }
-
-
-  /* documentation is in t1tables.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_PS_Font_Private( FT_Face         face,
-                          PS_PrivateRec*  afont_private )
-  {
-    FT_Error           error;
-    FT_Service_PsInfo  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !afont_private )
-      return FT_THROW( Invalid_Argument );
-
-    FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
-
-    if ( service && service->ps_get_font_private )
-      error = service->ps_get_font_private( face, afont_private );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-  /* documentation is in t1tables.h */
-
-  FT_EXPORT_DEF( FT_Long )
-  FT_Get_PS_Font_Value( FT_Face       face,
-                        PS_Dict_Keys  key,
-                        FT_UInt       idx,
-                        void         *value,
-                        FT_Long       value_len )
-  {
-    FT_Int             result  = 0;
-    FT_Service_PsInfo  service = NULL;
-
-
-    if ( face )
-    {
-      FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO );
-
-      if ( service && service->ps_get_font_value )
-        result = service->ps_get_font_value( face, key, idx,
-                                             value, value_len );
-    }
-
-    return result;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftutil.c b/third_party/freetype/src/base/ftutil.c
deleted file mode 100644
index dccc209..0000000
--- a/third_party/freetype/src/base/ftutil.c
+++ /dev/null
@@ -1,441 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftutil.c                                                               */
-/*                                                                         */
-/*    FreeType utility file for memory and list management (body).         */
-/*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_MEMORY_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_LIST_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_memory
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*****               M E M O R Y   M A N A G E M E N T               *****/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_alloc( FT_Memory  memory,
-                FT_Long    size,
-                FT_Error  *p_error )
-  {
-    FT_Error    error;
-    FT_Pointer  block = ft_mem_qalloc( memory, size, &error );
-
-    if ( !error && size > 0 )
-      FT_MEM_ZERO( block, size );
-
-    *p_error = error;
-    return block;
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_qalloc( FT_Memory  memory,
-                 FT_Long    size,
-                 FT_Error  *p_error )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_Pointer  block = NULL;
-
-
-    if ( size > 0 )
-    {
-      block = memory->alloc( memory, size );
-      if ( !block )
-        error = FT_THROW( Out_Of_Memory );
-    }
-    else if ( size < 0 )
-    {
-      /* may help catch/prevent security issues */
-      error = FT_THROW( Invalid_Argument );
-    }
-
-    *p_error = error;
-    return block;
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_realloc( FT_Memory  memory,
-                  FT_Long    item_size,
-                  FT_Long    cur_count,
-                  FT_Long    new_count,
-                  void*      block,
-                  FT_Error  *p_error )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    block = ft_mem_qrealloc( memory, item_size,
-                             cur_count, new_count, block, &error );
-    if ( !error && new_count > cur_count )
-      FT_MEM_ZERO( (char*)block + cur_count * item_size,
-                   ( new_count - cur_count ) * item_size );
-
-    *p_error = error;
-    return block;
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_qrealloc( FT_Memory  memory,
-                   FT_Long    item_size,
-                   FT_Long    cur_count,
-                   FT_Long    new_count,
-                   void*      block,
-                   FT_Error  *p_error )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* Note that we now accept `item_size == 0' as a valid parameter, in
-     * order to cover very weird cases where an ALLOC_MULT macro would be
-     * called.
-     */
-    if ( cur_count < 0 || new_count < 0 || item_size < 0 )
-    {
-      /* may help catch/prevent nasty security issues */
-      error = FT_THROW( Invalid_Argument );
-    }
-    else if ( new_count == 0 || item_size == 0 )
-    {
-      ft_mem_free( memory, block );
-      block = NULL;
-    }
-    else if ( new_count > FT_INT_MAX/item_size )
-    {
-      error = FT_THROW( Array_Too_Large );
-    }
-    else if ( cur_count == 0 )
-    {
-      FT_ASSERT( !block );
-
-      block = ft_mem_alloc( memory, new_count*item_size, &error );
-    }
-    else
-    {
-      FT_Pointer  block2;
-      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 )
-        error = FT_THROW( Out_Of_Memory );
-      else
-        block = block2;
-    }
-
-    *p_error = error;
-    return block;
-  }
-
-
-  FT_BASE_DEF( void )
-  ft_mem_free( FT_Memory   memory,
-               const void *P )
-  {
-    if ( P )
-      memory->free( memory, (void*)P );
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_dup( FT_Memory    memory,
-              const void*  address,
-              FT_ULong     size,
-              FT_Error    *p_error )
-  {
-    FT_Error    error;
-    FT_Pointer  p = ft_mem_qalloc( memory, (FT_Long)size, &error );
-
-
-    if ( !error && address )
-      ft_memcpy( p, address, size );
-
-    *p_error = error;
-    return p;
-  }
-
-
-  FT_BASE_DEF( FT_Pointer )
-  ft_mem_strdup( FT_Memory    memory,
-                 const char*  str,
-                 FT_Error    *p_error )
-  {
-    FT_ULong  len = str ? (FT_ULong)ft_strlen( str ) + 1
-                        : 0;
-
-
-    return ft_mem_dup( memory, str, len, p_error );
-  }
-
-
-  FT_BASE_DEF( FT_Int )
-  ft_mem_strcpyn( char*        dst,
-                  const char*  src,
-                  FT_ULong     size )
-  {
-    while ( size > 1 && *src != 0 )
-    {
-      *dst++ = *src++;
-      size--;
-    }
-
-    *dst = 0;  /* always zero-terminate */
-
-    return *src != 0;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*****            D O U B L Y   L I N K E D   L I S T S              *****/
-  /*****                                                               *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_list
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( FT_ListNode )
-  FT_List_Find( FT_List  list,
-                void*    data )
-  {
-    FT_ListNode  cur;
-
-
-    if ( !list )
-      return NULL;
-
-    cur = list->head;
-    while ( cur )
-    {
-      if ( cur->data == data )
-        return cur;
-
-      cur = cur->next;
-    }
-
-    return NULL;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( void )
-  FT_List_Add( FT_List      list,
-               FT_ListNode  node )
-  {
-    FT_ListNode  before;
-
-
-    if ( !list || !node )
-      return;
-
-    before = list->tail;
-
-    node->next = NULL;
-    node->prev = before;
-
-    if ( before )
-      before->next = node;
-    else
-      list->head = node;
-
-    list->tail = node;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( void )
-  FT_List_Insert( FT_List      list,
-                  FT_ListNode  node )
-  {
-    FT_ListNode  after;
-
-
-    if ( !list || !node )
-      return;
-
-    after = list->head;
-
-    node->next = after;
-    node->prev = NULL;
-
-    if ( !after )
-      list->tail = node;
-    else
-      after->prev = node;
-
-    list->head = node;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( void )
-  FT_List_Remove( FT_List      list,
-                  FT_ListNode  node )
-  {
-    FT_ListNode  before, after;
-
-
-    if ( !list || !node )
-      return;
-
-    before = node->prev;
-    after  = node->next;
-
-    if ( before )
-      before->next = after;
-    else
-      list->head = after;
-
-    if ( after )
-      after->prev = before;
-    else
-      list->tail = before;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( void )
-  FT_List_Up( FT_List      list,
-              FT_ListNode  node )
-  {
-    FT_ListNode  before, after;
-
-
-    if ( !list || !node )
-      return;
-
-    before = node->prev;
-    after  = node->next;
-
-    /* check whether we are already on top of the list */
-    if ( !before )
-      return;
-
-    before->next = after;
-
-    if ( after )
-      after->prev = before;
-    else
-      list->tail = before;
-
-    node->prev       = NULL;
-    node->next       = list->head;
-    list->head->prev = node;
-    list->head       = node;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_List_Iterate( FT_List           list,
-                   FT_List_Iterator  iterator,
-                   void*             user )
-  {
-    FT_ListNode  cur;
-    FT_Error     error = FT_Err_Ok;
-
-
-    if ( !list || !iterator )
-      return FT_THROW( Invalid_Argument );
-
-    cur = list->head;
-
-    while ( cur )
-    {
-      FT_ListNode  next = cur->next;
-
-
-      error = iterator( cur, user );
-      if ( error )
-        break;
-
-      cur = next;
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftlist.h */
-
-  FT_EXPORT_DEF( void )
-  FT_List_Finalize( FT_List             list,
-                    FT_List_Destructor  destroy,
-                    FT_Memory           memory,
-                    void*               user )
-  {
-    FT_ListNode  cur;
-
-
-    if ( !list || !memory )
-      return;
-
-    cur = list->head;
-    while ( cur )
-    {
-      FT_ListNode  next = cur->next;
-      void*        data = cur->data;
-
-
-      if ( destroy )
-        destroy( memory, data, user );
-
-      FT_FREE( cur );
-      cur = next;
-    }
-
-    list->head = NULL;
-    list->tail = NULL;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2arrst.c b/third_party/freetype/src/cff/cf2arrst.c
deleted file mode 100644
index 6796450..0000000
--- a/third_party/freetype/src/cff/cf2arrst.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2arrst.c                                                             */
-/*                                                                         */
-/*    Adobe's code for Array Stacks (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 "cf2arrst.h"
-
-#include "cf2error.h"
-
-
-  /*
-   * CF2_ArrStack uses an error pointer, to enable shared errors.
-   * Shared errors are necessary when multiple objects allow the program
-   * to continue after detecting errors.  Only the first error should be
-   * recorded.
-   */
-
-  FT_LOCAL_DEF( void )
-  cf2_arrstack_init( CF2_ArrStack  arrstack,
-                     FT_Memory     memory,
-                     FT_Error*     error,
-                     size_t        sizeItem )
-  {
-    FT_ASSERT( arrstack );
-
-    /* initialize the structure */
-    arrstack->memory    = memory;
-    arrstack->error     = error;
-    arrstack->sizeItem  = sizeItem;
-    arrstack->allocated = 0;
-    arrstack->chunk     = 10;    /* chunks of 10 items */
-    arrstack->count     = 0;
-    arrstack->totalSize = 0;
-    arrstack->ptr       = NULL;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_arrstack_finalize( CF2_ArrStack  arrstack )
-  {
-    FT_Memory  memory = arrstack->memory;     /* for FT_FREE */
-
-
-    FT_ASSERT( arrstack );
-
-    arrstack->allocated = 0;
-    arrstack->count     = 0;
-    arrstack->totalSize = 0;
-
-    /* free the data buffer */
-    FT_FREE( arrstack->ptr );
-  }
-
-
-  /* allocate or reallocate the buffer size; */
-  /* return false on memory error */
-  static FT_Bool
-  cf2_arrstack_setNumElements( CF2_ArrStack  arrstack,
-                               size_t        numElements )
-  {
-    FT_ASSERT( arrstack );
-
-    {
-      FT_Error   error  = FT_Err_Ok;        /* for FT_REALLOC */
-      FT_Memory  memory = arrstack->memory; /* for FT_REALLOC */
-
-      size_t  newSize = numElements * arrstack->sizeItem;
-
-
-      if ( numElements > FT_LONG_MAX / arrstack->sizeItem )
-        goto exit;
-
-
-      FT_ASSERT( newSize > 0 );   /* avoid realloc with zero size */
-
-      if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) )
-      {
-        arrstack->allocated = numElements;
-        arrstack->totalSize = newSize;
-
-        if ( arrstack->count > numElements )
-        {
-          /* we truncated the list! */
-          CF2_SET_ERROR( arrstack->error, Stack_Overflow );
-          arrstack->count = numElements;
-          return FALSE;
-        }
-
-        return TRUE;     /* success */
-      }
-    }
-
-  exit:
-    /* if there's not already an error, store this one */
-    CF2_SET_ERROR( arrstack->error, Out_Of_Memory );
-
-    return FALSE;
-  }
-
-
-  /* set the count, ensuring allocation is sufficient */
-  FT_LOCAL_DEF( void )
-  cf2_arrstack_setCount( CF2_ArrStack  arrstack,
-                         size_t        numElements )
-  {
-    FT_ASSERT( arrstack );
-
-    if ( numElements > arrstack->allocated )
-    {
-      /* expand the allocation first */
-      if ( !cf2_arrstack_setNumElements( arrstack, numElements ) )
-        return;
-    }
-
-    arrstack->count = numElements;
-  }
-
-
-  /* clear the count */
-  FT_LOCAL_DEF( void )
-  cf2_arrstack_clear( CF2_ArrStack  arrstack )
-  {
-    FT_ASSERT( arrstack );
-
-    arrstack->count = 0;
-  }
-
-
-  /* current number of items */
-  FT_LOCAL_DEF( size_t )
-  cf2_arrstack_size( const CF2_ArrStack  arrstack )
-  {
-    FT_ASSERT( arrstack );
-
-    return arrstack->count;
-  }
-
-
-  FT_LOCAL_DEF( void* )
-  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack )
-  {
-    FT_ASSERT( arrstack );
-
-    return arrstack->ptr;
-  }
-
-
-  /* return pointer to the given element */
-  FT_LOCAL_DEF( void* )
-  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,
-                           size_t              idx )
-  {
-    void*  newPtr;
-
-
-    FT_ASSERT( arrstack );
-
-    if ( idx >= arrstack->count )
-    {
-      /* overflow */
-      CF2_SET_ERROR( arrstack->error, Stack_Overflow );
-      idx = 0;    /* choose safe default */
-    }
-
-    newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem;
-
-    return newPtr;
-  }
-
-
-  /* push (append) an element at the end of the list;         */
-  /* return false on memory error                             */
-  /* TODO: should there be a length param for extra checking? */
-  FT_LOCAL_DEF( void )
-  cf2_arrstack_push( CF2_ArrStack  arrstack,
-                     const void*   ptr )
-  {
-    FT_ASSERT( arrstack );
-
-    if ( arrstack->count == arrstack->allocated )
-    {
-      /* grow the buffer by one chunk */
-      if ( !cf2_arrstack_setNumElements(
-             arrstack, arrstack->allocated + arrstack->chunk ) )
-      {
-        /* on error, ignore the push */
-        return;
-      }
-    }
-
-    FT_ASSERT( ptr );
-
-    {
-      size_t  offset = arrstack->count * arrstack->sizeItem;
-      void*   newPtr = (FT_Byte*)arrstack->ptr + offset;
-
-
-      FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem );
-      arrstack->count += 1;
-    }
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2arrst.h b/third_party/freetype/src/cff/cf2arrst.h
deleted file mode 100644
index 3c21a3b..0000000
--- a/third_party/freetype/src/cff/cf2arrst.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2arrst.h                                                             */
-/*                                                                         */
-/*    Adobe's code for Array Stacks (specification).                       */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2ARRST_H_
-#define CF2ARRST_H_
-
-
-#include "cf2error.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /* need to define the struct here (not opaque) so it can be allocated by */
-  /* clients                                                               */
-  typedef struct  CF2_ArrStackRec_
-  {
-    FT_Memory  memory;
-    FT_Error*  error;
-
-    size_t  sizeItem;       /* bytes per element             */
-    size_t  allocated;      /* items allocated               */
-    size_t  chunk;          /* allocation increment in items */
-    size_t  count;          /* number of elements allocated  */
-    size_t  totalSize;      /* total bytes allocated         */
-
-    void*  ptr;             /* ptr to data                   */
-
-  } CF2_ArrStackRec, *CF2_ArrStack;
-
-
-  FT_LOCAL( void )
-  cf2_arrstack_init( CF2_ArrStack  arrstack,
-                     FT_Memory     memory,
-                     FT_Error*     error,
-                     size_t        sizeItem );
-  FT_LOCAL( void )
-  cf2_arrstack_finalize( CF2_ArrStack  arrstack );
-
-  FT_LOCAL( void )
-  cf2_arrstack_setCount( CF2_ArrStack  arrstack,
-                         size_t        numElements );
-  FT_LOCAL( void )
-  cf2_arrstack_clear( CF2_ArrStack  arrstack );
-  FT_LOCAL( size_t )
-  cf2_arrstack_size( const CF2_ArrStack  arrstack );
-
-  FT_LOCAL( void* )
-  cf2_arrstack_getBuffer( const CF2_ArrStack  arrstack );
-  FT_LOCAL( void* )
-  cf2_arrstack_getPointer( const CF2_ArrStack  arrstack,
-                           size_t              idx );
-
-  FT_LOCAL( void )
-  cf2_arrstack_push( CF2_ArrStack  arrstack,
-                     const void*   ptr );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2ARRST_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2blues.c b/third_party/freetype/src/cff/cf2blues.c
deleted file mode 100644
index 250f89e..0000000
--- a/third_party/freetype/src/cff/cf2blues.c
+++ /dev/null
@@ -1,579 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2blues.c                                                             */
-/*                                                                         */
-/*    Adobe's code for handling Blue Zones (body).                         */
-/*                                                                         */
-/*  Copyright 2009-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 "cf2blues.h"
-#include "cf2hints.h"
-#include "cf2font.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_cf2blues
-
-
-  /*
-   * For blue values, the FreeType parser produces an array of integers,
-   * while the Adobe CFF engine produces an array of fixed.
-   * Define a macro to convert FreeType to fixed.
-   */
-#define cf2_blueToFixed( x )  cf2_intToFixed( x )
-
-
-  FT_LOCAL_DEF( void )
-  cf2_blues_init( CF2_Blues  blues,
-                  CF2_Font   font )
-  {
-    /* pointer to parsed font object */
-    CFF_Decoder*  decoder = font->decoder;
-
-    CF2_Fixed  zoneHeight;
-    CF2_Fixed  maxZoneHeight = 0;
-    CF2_Fixed  csUnitsPerPixel;
-
-    size_t  numBlueValues;
-    size_t  numOtherBlues;
-    size_t  numFamilyBlues;
-    size_t  numFamilyOtherBlues;
-
-    FT_Pos*  blueValues;
-    FT_Pos*  otherBlues;
-    FT_Pos*  familyBlues;
-    FT_Pos*  familyOtherBlues;
-
-    size_t     i;
-    CF2_Fixed  emBoxBottom, emBoxTop;
-
-#if 0
-    CF2_Int  unitsPerEm = font->unitsPerEm;
-
-
-    if ( unitsPerEm == 0 )
-      unitsPerEm = 1000;
-#endif
-
-    FT_ZERO( blues );
-    blues->scale = font->innerTransform.d;
-
-    cf2_getBlueMetrics( decoder,
-                        &blues->blueScale,
-                        &blues->blueShift,
-                        &blues->blueFuzz );
-
-    cf2_getBlueValues( decoder, &numBlueValues, &blueValues );
-    cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues );
-    cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues );
-    cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues );
-
-    /*
-     * synthetic em box hint heuristic
-     *
-     * Apply this when ideographic dictionary (LanguageGroup 1) has no
-     * real alignment zones.  Adobe tools generate dummy zones at -250 and
-     * 1100 for a 1000 unit em.  Fonts with ICF-based alignment zones
-     * should not enable the heuristic.  When the heuristic is enabled,
-     * the font's blue zones are ignored.
-     *
-     */
-
-    /* get em box from OS/2 typoAscender/Descender                      */
-    /* TODO: FreeType does not parse these metrics.  Skip them for now. */
-#if 0
-    FCM_getHorizontalLineMetrics( &e,
-                                  font->font,
-                                  &ascender,
-                                  &descender,
-                                  &linegap );
-    if ( ascender - descender == unitsPerEm )
-    {
-      emBoxBottom = cf2_intToFixed( descender );
-      emBoxTop    = cf2_intToFixed( ascender );
-    }
-    else
-#endif
-    {
-      emBoxBottom = CF2_ICF_Bottom;
-      emBoxTop    = CF2_ICF_Top;
-    }
-
-    if ( cf2_getLanguageGroup( decoder ) == 1                   &&
-         ( numBlueValues == 0                                 ||
-           ( numBlueValues == 4                             &&
-             cf2_blueToFixed( blueValues[0] ) < emBoxBottom &&
-             cf2_blueToFixed( blueValues[1] ) < emBoxBottom &&
-             cf2_blueToFixed( blueValues[2] ) > emBoxTop    &&
-             cf2_blueToFixed( blueValues[3] ) > emBoxTop    ) ) )
-    {
-      /*
-       * Construct hint edges suitable for synthetic ghost hints at top
-       * and bottom of em box.  +-CF2_MIN_COUNTER allows for unhinted
-       * features above or below the last hinted edge.  This also gives a
-       * net 1 pixel boost to the height of ideographic glyphs.
-       *
-       * Note: Adjust synthetic hints outward by epsilon (0x.0001) to
-       *       avoid interference.  E.g., some fonts have real hints at
-       *       880 and -120.
-       */
-
-      blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON;
-      blues->emBoxBottomEdge.dsCoord = cf2_fixedRound(
-                                         FT_MulFix(
-                                           blues->emBoxBottomEdge.csCoord,
-                                           blues->scale ) ) -
-                                       CF2_MIN_COUNTER;
-      blues->emBoxBottomEdge.scale   = blues->scale;
-      blues->emBoxBottomEdge.flags   = CF2_GhostBottom |
-                                       CF2_Locked |
-                                       CF2_Synthetic;
-
-      blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON +
-                                    2 * font->darkenY;
-      blues->emBoxTopEdge.dsCoord = cf2_fixedRound(
-                                      FT_MulFix(
-                                        blues->emBoxTopEdge.csCoord,
-                                        blues->scale ) ) +
-                                    CF2_MIN_COUNTER;
-      blues->emBoxTopEdge.scale   = blues->scale;
-      blues->emBoxTopEdge.flags   = CF2_GhostTop |
-                                    CF2_Locked |
-                                    CF2_Synthetic;
-
-      blues->doEmBoxHints = TRUE;    /* enable the heuristic */
-
-      return;
-    }
-
-    /* copy `BlueValues' and `OtherBlues' to a combined array of top and */
-    /* bottom zones                                                      */
-    for ( i = 0; i < numBlueValues; i += 2 )
-    {
-      blues->zone[blues->count].csBottomEdge =
-        cf2_blueToFixed( blueValues[i] );
-      blues->zone[blues->count].csTopEdge =
-        cf2_blueToFixed( blueValues[i + 1] );
-
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
-
-      if ( zoneHeight < 0 )
-      {
-        FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
-        continue;   /* reject this zone */
-      }
-
-      if ( zoneHeight > maxZoneHeight )
-      {
-        /* take maximum before darkening adjustment      */
-        /* so overshoot suppression point doesn't change */
-        maxZoneHeight = zoneHeight;
-      }
-
-      /* adjust both edges of top zone upward by twice darkening amount */
-      if ( i != 0 )
-      {
-        blues->zone[blues->count].csTopEdge    += 2 * font->darkenY;
-        blues->zone[blues->count].csBottomEdge += 2 * font->darkenY;
-      }
-
-      /* first `BlueValue' is bottom zone; others are top */
-      if ( i == 0 )
-      {
-        blues->zone[blues->count].bottomZone =
-          TRUE;
-        blues->zone[blues->count].csFlatEdge =
-          blues->zone[blues->count].csTopEdge;
-      }
-      else
-      {
-        blues->zone[blues->count].bottomZone =
-          FALSE;
-        blues->zone[blues->count].csFlatEdge =
-          blues->zone[blues->count].csBottomEdge;
-      }
-
-      blues->count += 1;
-    }
-
-    for ( i = 0; i < numOtherBlues; i += 2 )
-    {
-      blues->zone[blues->count].csBottomEdge =
-        cf2_blueToFixed( otherBlues[i] );
-      blues->zone[blues->count].csTopEdge =
-        cf2_blueToFixed( otherBlues[i + 1] );
-
-      zoneHeight = blues->zone[blues->count].csTopEdge -
-                   blues->zone[blues->count].csBottomEdge;
-
-      if ( zoneHeight < 0 )
-      {
-        FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" ));
-        continue;   /* reject this zone */
-      }
-
-      if ( zoneHeight > maxZoneHeight )
-      {
-        /* take maximum before darkening adjustment      */
-        /* so overshoot suppression point doesn't change */
-        maxZoneHeight = zoneHeight;
-      }
-
-      /* Note: bottom zones are not adjusted for darkening amount */
-
-      /* all OtherBlues are bottom zone */
-      blues->zone[blues->count].bottomZone =
-        TRUE;
-      blues->zone[blues->count].csFlatEdge =
-        blues->zone[blues->count].csTopEdge;
-
-      blues->count += 1;
-    }
-
-    /* Adjust for FamilyBlues */
-
-    /* Search for the nearest flat edge in `FamilyBlues' or                */
-    /* `FamilyOtherBlues'.  According to the Black Book, any matching edge */
-    /* must be within one device pixel                                     */
-
-    csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale );
-
-    /* loop on all zones in this font */
-    for ( i = 0; i < blues->count; i++ )
-    {
-      size_t     j;
-      CF2_Fixed  minDiff;
-      CF2_Fixed  flatFamilyEdge, diff;
-      /* value for this font */
-      CF2_Fixed  flatEdge = blues->zone[i].csFlatEdge;
-
-
-      if ( blues->zone[i].bottomZone )
-      {
-        /* In a bottom zone, the top edge is the flat edge.             */
-        /* Search `FamilyOtherBlues' for bottom zones; look for closest */
-        /* Family edge that is within the one pixel threshold.          */
-
-        minDiff = CF2_FIXED_MAX;
-
-        for ( j = 0; j < numFamilyOtherBlues; j += 2 )
-        {
-          /* top edge */
-          flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] );
-
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
-
-          if ( diff < minDiff && diff < csUnitsPerPixel )
-          {
-            blues->zone[i].csFlatEdge = flatFamilyEdge;
-            minDiff                   = diff;
-
-            if ( diff == 0 )
-              break;
-          }
-        }
-
-        /* check the first member of FamilyBlues, which is a bottom zone */
-        if ( numFamilyBlues >= 2 )
-        {
-          /* top edge */
-          flatFamilyEdge = cf2_blueToFixed( familyBlues[1] );
-
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
-
-          if ( diff < minDiff && diff < csUnitsPerPixel )
-            blues->zone[i].csFlatEdge = flatFamilyEdge;
-        }
-      }
-      else
-      {
-        /* In a top zone, the bottom edge is the flat edge.                */
-        /* Search `FamilyBlues' for top zones; skip first zone, which is a */
-        /* bottom zone; look for closest Family edge that is within the    */
-        /* one pixel threshold                                             */
-
-        minDiff = CF2_FIXED_MAX;
-
-        for ( j = 2; j < numFamilyBlues; j += 2 )
-        {
-          /* bottom edge */
-          flatFamilyEdge = cf2_blueToFixed( familyBlues[j] );
-
-          /* adjust edges of top zone upward by twice darkening amount */
-          flatFamilyEdge += 2 * font->darkenY;      /* bottom edge */
-
-          diff = cf2_fixedAbs( flatEdge - flatFamilyEdge );
-
-          if ( diff < minDiff && diff < csUnitsPerPixel )
-          {
-            blues->zone[i].csFlatEdge = flatFamilyEdge;
-            minDiff                   = diff;
-
-            if ( diff == 0 )
-              break;
-          }
-        }
-      }
-    }
-
-    /* TODO: enforce separation of zones, including BlueFuzz */
-
-    /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */
-    /* `bcsetup.c'.                                               */
-
-    if ( maxZoneHeight > 0 )
-    {
-      if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ),
-                                         maxZoneHeight ) )
-      {
-        /* clamp at maximum scale */
-        blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ),
-                                      maxZoneHeight );
-      }
-
-      /*
-       * TODO: Revisit the bug fix for 613448.  The minimum scale
-       *       requirement catches a number of library fonts.  For
-       *       example, with default BlueScale (.039625) and 0.4 minimum,
-       *       the test below catches any font with maxZoneHeight < 10.1.
-       *       There are library fonts ranging from 2 to 10 that get
-       *       caught, including e.g., Eurostile LT Std Medium with
-       *       maxZoneHeight of 6.
-       *
-       */
-#if 0
-      if ( blueScale < .4 / maxZoneHeight )
-      {
-        tetraphilia_assert( 0 );
-        /* clamp at minimum scale, per bug 0613448 fix */
-        blueScale = .4 / maxZoneHeight;
-      }
-#endif
-
-    }
-
-    /*
-     * Suppress overshoot and boost blue zones at small sizes.  Boost
-     * amount varies linearly from 0.5 pixel near 0 to 0 pixel at
-     * blueScale cutoff.
-     * Note: This boost amount is different from the coretype heuristic.
-     *
-     */
-
-    if ( blues->scale < blues->blueScale )
-    {
-      blues->suppressOvershoot = TRUE;
-
-      /* Change rounding threshold for `dsFlatEdge'.                    */
-      /* 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->scale,
-                                  blues->blueScale );
-      if ( blues->boost > 0x7FFF )
-      {
-        /* boost must remain less than 0.5, or baseline could go negative */
-        blues->boost = 0x7FFF;
-      }
-    }
-
-    /* boost and darkening have similar effects; don't do both */
-    if ( font->stemDarkened )
-      blues->boost = 0;
-
-    /* set device space alignment for each zone;    */
-    /* apply boost amount before rounding flat edge */
-
-    for ( i = 0; i < blues->count; i++ )
-    {
-      if ( blues->zone[i].bottomZone )
-        blues->zone[i].dsFlatEdge = cf2_fixedRound(
-                                      FT_MulFix(
-                                        blues->zone[i].csFlatEdge,
-                                        blues->scale ) -
-                                      blues->boost );
-      else
-        blues->zone[i].dsFlatEdge = cf2_fixedRound(
-                                      FT_MulFix(
-                                        blues->zone[i].csFlatEdge,
-                                        blues->scale ) +
-                                      blues->boost );
-    }
-  }
-
-
-  /*
-   * Check whether `stemHint' is captured by one of the blue zones.
-   *
-   * Zero, one or both edges may be valid; only valid edges can be
-   * captured.  For compatibility with CoolType, search top and bottom
-   * zones in the same pass (see `BlueLock').  If a hint is captured,
-   * return true and position the edge(s) in one of 3 ways:
-   *
-   *  1) If `BlueScale' suppresses overshoot, position the captured edge
-   *     at the flat edge of the zone.
-   *  2) If overshoot is not suppressed and `BlueShift' requires
-   *     overshoot, position the captured edge a minimum of 1 device pixel
-   *     from the flat edge.
-   *  3) If overshoot is not suppressed or required, position the captured
-   *     edge at the nearest device pixel.
-   *
-   */
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_blues_capture( const CF2_Blues  blues,
-                     CF2_Hint         bottomHintEdge,
-                     CF2_Hint         topHintEdge )
-  {
-    /* TODO: validate? */
-    CF2_Fixed  csFuzz = blues->blueFuzz;
-
-    /* new position of captured edge */
-    CF2_Fixed  dsNew;
-
-    /* amount that hint is moved when positioned */
-    CF2_Fixed  dsMove = 0;
-
-    FT_Bool   captured = FALSE;
-    CF2_UInt  i;
-
-
-    /* assert edge flags are consistent */
-    FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) &&
-               !cf2_hint_isBottom( topHintEdge ) );
-
-    /* TODO: search once without blue fuzz for compatibility with coretype? */
-    for ( i = 0; i < blues->count; i++ )
-    {
-      if ( blues->zone[i].bottomZone           &&
-           cf2_hint_isBottom( bottomHintEdge ) )
-      {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               bottomHintEdge->csCoord                   &&
-             bottomHintEdge->csCoord <=
-               ( 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 ) >=
-                      blues->blueShift )
-          {
-            /* guarantee minimum of 1 pixel overshoot */
-            dsNew = FT_MIN(
-                      cf2_fixedRound( bottomHintEdge->dsCoord ),
-                      blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) );
-          }
-
-          else
-          {
-            /* simply round captured edge */
-            dsNew = cf2_fixedRound( bottomHintEdge->dsCoord );
-          }
-
-          dsMove   = dsNew - bottomHintEdge->dsCoord;
-          captured = TRUE;
-
-          break;
-        }
-      }
-
-      if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) )
-      {
-        if ( ( blues->zone[i].csBottomEdge - csFuzz ) <=
-               topHintEdge->csCoord                      &&
-             topHintEdge->csCoord <=
-               ( 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 ) >=
-                      blues->blueShift )
-          {
-            /* guarantee minimum of 1 pixel overshoot */
-            dsNew = FT_MAX(
-                      cf2_fixedRound( topHintEdge->dsCoord ),
-                      blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) );
-          }
-
-          else
-          {
-            /* simply round captured edge */
-            dsNew = cf2_fixedRound( topHintEdge->dsCoord );
-          }
-
-          dsMove   = dsNew - topHintEdge->dsCoord;
-          captured = TRUE;
-
-          break;
-        }
-      }
-    }
-
-    if ( captured )
-    {
-      /* move both edges and flag them `locked' */
-      if ( cf2_hint_isValid( bottomHintEdge ) )
-      {
-        bottomHintEdge->dsCoord += dsMove;
-        cf2_hint_lock( bottomHintEdge );
-      }
-
-      if ( cf2_hint_isValid( topHintEdge ) )
-      {
-        topHintEdge->dsCoord += dsMove;
-        cf2_hint_lock( topHintEdge );
-      }
-    }
-
-    return captured;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2blues.h b/third_party/freetype/src/cff/cf2blues.h
deleted file mode 100644
index 96fb60f..0000000
--- a/third_party/freetype/src/cff/cf2blues.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2blues.h                                                             */
-/*                                                                         */
-/*    Adobe's code for handling Blue Zones (specification).                */
-/*                                                                         */
-/*  Copyright 2009-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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*
-   * A `CF2_Blues' object stores the blue zones (horizontal alignment
-   * zones) of a font.  These are specified in the CFF private dictionary
-   * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'.
-   * Each zone is defined by a top and bottom edge in character space.
-   * Further, each zone is either a top zone or a bottom zone, as recorded
-   * by `bottomZone'.
-   *
-   * The maximum number of `BlueValues' and `FamilyBlues' is 7 each.
-   * However, these are combined to produce a total of 7 zones.
-   * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues'
-   * is 5 and these are combined to produce an additional 5 zones.
-   *
-   * Blue zones are used to `capture' hints and force them to a common
-   * alignment point.  This alignment is recorded in device space in
-   * `dsFlatEdge'.  Except for this value, a `CF2_Blues' object could be
-   * constructed independently of scaling.  Construction may occur once
-   * the matrix is known.  Other features implemented in the Capture
-   * method are overshoot suppression, overshoot enforcement, and Blue
-   * Boost.
-   *
-   * Capture is determined by `BlueValues' and `OtherBlues', but the
-   * alignment point may be adjusted to the scaled flat edge of
-   * `FamilyBlues' or `FamilyOtherBlues'.  No alignment is done to the
-   * curved edge of a zone.
-   *
-   */
-
-
-#ifndef CF2BLUES_H_
-#define CF2BLUES_H_
-
-
-#include "cf2glue.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   * `CF2_Hint' is shared by `cf2hints.h' and
-   * `cf2blues.h', but `cf2blues.h' depends on
-   * `cf2hints.h', so define it here.  Note: The typedef is in
-   * `cf2glue.h'.
-   *
-   */
-  enum
-  {
-    CF2_GhostBottom = 0x1,  /* a single bottom edge           */
-    CF2_GhostTop    = 0x2,  /* a single top edge              */
-    CF2_PairBottom  = 0x4,  /* the bottom edge of a stem hint */
-    CF2_PairTop     = 0x8,  /* the top edge of a stem hint    */
-    CF2_Locked      = 0x10, /* this edge has been aligned     */
-                            /* by a blue zone                 */
-    CF2_Synthetic   = 0x20  /* this edge was synthesized      */
-  };
-
-
-  /*
-   * Default value for OS/2 typoAscender/Descender when their difference
-   * is not equal to `unitsPerEm'.  The default is based on -250 and 1100
-   * in `CF2_Blues', assuming 1000 units per em here.
-   *
-   */
-  enum
-  {
-    CF2_ICF_Top    = cf2_intToFixed(  880 ),
-    CF2_ICF_Bottom = cf2_intToFixed( -120 )
-  };
-
-
-  /*
-   * Constant used for hint adjustment and for synthetic em box hint
-   * placement.
-   */
-#define CF2_MIN_COUNTER  cf2_floatToFixed( 0.5 )
-
-
-  /* shared typedef is in cf2glue.h */
-  struct  CF2_HintRec_
-  {
-    CF2_UInt  flags;  /* attributes of the edge            */
-    size_t    index;  /* index in original stem hint array */
-                      /* (if not synthetic)                */
-    CF2_Fixed  csCoord;
-    CF2_Fixed  dsCoord;
-    CF2_Fixed  scale;
-  };
-
-
-  typedef struct  CF2_BlueRec_
-  {
-    CF2_Fixed  csBottomEdge;
-    CF2_Fixed  csTopEdge;
-    CF2_Fixed  csFlatEdge; /* may be from either local or Family zones */
-    CF2_Fixed  dsFlatEdge; /* top edge of bottom zone or bottom edge   */
-                           /* of top zone (rounded)                    */
-    FT_Bool  bottomZone;
-
-  } CF2_BlueRec;
-
-
-  /* max total blue zones is 12 */
-  enum
-  {
-    CF2_MAX_BLUES      = 7,
-    CF2_MAX_OTHERBLUES = 5
-  };
-
-
-  typedef struct  CF2_BluesRec_
-  {
-    CF2_Fixed  scale;
-    CF2_UInt   count;
-    FT_Bool    suppressOvershoot;
-    FT_Bool    doEmBoxHints;
-
-    CF2_Fixed  blueScale;
-    CF2_Fixed  blueShift;
-    CF2_Fixed  blueFuzz;
-
-    CF2_Fixed  boost;
-
-    CF2_HintRec  emBoxTopEdge;
-    CF2_HintRec  emBoxBottomEdge;
-
-    CF2_BlueRec  zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES];
-
-  } CF2_BluesRec, *CF2_Blues;
-
-
-  FT_LOCAL( void )
-  cf2_blues_init( CF2_Blues  blues,
-                  CF2_Font   font );
-  FT_LOCAL( FT_Bool )
-  cf2_blues_capture( const CF2_Blues  blues,
-                     CF2_Hint         bottomHintEdge,
-                     CF2_Hint         topHintEdge );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2BLUES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2error.c b/third_party/freetype/src/cff/cf2error.c
deleted file mode 100644
index e3dd69f..0000000
--- a/third_party/freetype/src/cff/cf2error.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2error.c                                                             */
-/*                                                                         */
-/*    Adobe's code for error handling (body).                              */
-/*                                                                         */
-/*  Copyright 2006-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 "cf2error.h"
-
-
-  FT_LOCAL_DEF( void )
-  cf2_setError( FT_Error*  error,
-                FT_Error   value )
-  {
-    if ( error && !*error )
-      *error = value;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2error.h b/third_party/freetype/src/cff/cf2error.h
deleted file mode 100644
index 512edd1..0000000
--- a/third_party/freetype/src/cff/cf2error.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2error.h                                                             */
-/*                                                                         */
-/*    Adobe's code for error handling (specification).                     */
-/*                                                                         */
-/*  Copyright 2006-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 CF2ERROR_H_
-#define CF2ERROR_H_
-
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  CF2_Err_
-#define FT_ERR_BASE    FT_Mod_Err_CF2
-
-
-#include FT_ERRORS_H
-#include "cf2ft.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   * A poor-man error facility.
-   *
-   * This code being written in vanilla C, doesn't have the luxury of a
-   * language-supported exception mechanism such as the one available in
-   * Java.  Instead, we are stuck with using error codes that must be
-   * carefully managed and preserved.  However, it is convenient for us to
-   * 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.
-   * 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 propagate and be handled at the appropriate location in
-   * the code.
-   *
-   * This allows a style of code where the error code is initialized
-   * up front and a block of calls are made with the error code only
-   * being checked after the block.  If a new error occurs, the original
-   * error will be preserved and a functional no-op should result in any
-   * subsequent function that has an initial error code not equal to
-   * `FT_Err_Ok'.
-   *
-   * Errors are encoded by calling the `FT_THROW' macro.  For example,
-   *
-   * {
-   *   FT_Error  e;
-   *
-   *
-   *   ...
-   *   e = FT_THROW( Out_Of_Memory );
-   * }
-   *
-   */
-
-
-  /* Set error code to a particular value. */
-  FT_LOCAL( void )
-  cf2_setError( FT_Error*  error,
-                FT_Error   value );
-
-
-  /*
-   * A macro that conditionally sets an error code.
-   *
-   * This macro will first check whether `error' is set;
-   * if not, it will set it to `e'.
-   *
-  */
-#define CF2_SET_ERROR( error, e )              \
-          cf2_setError( error, FT_THROW( e ) )
-
-
-FT_END_HEADER
-
-
-#endif /* CF2ERROR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2fixed.h b/third_party/freetype/src/cff/cf2fixed.h
deleted file mode 100644
index 2e4b503..0000000
--- a/third_party/freetype/src/cff/cf2fixed.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2fixed.h                                                             */
-/*                                                                         */
-/*    Adobe's code for Fixed Point Mathematics (specification only).       */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2FIXED_H_
-#define CF2FIXED_H_
-
-
-FT_BEGIN_HEADER
-
-
-  /* rasterizer integer and fixed point arithmetic must be 32-bit */
-
-#define   CF2_Fixed  CF2_F16Dot16
-  typedef FT_Int32   CF2_Frac;   /* 2.30 fixed point */
-
-
-#define CF2_FIXED_MAX      ( (CF2_Fixed)0x7FFFFFFFL )
-#define CF2_FIXED_MIN      ( (CF2_Fixed)0x80000000L )
-#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 */
-
-#define cf2_intToFixed( i )                                              \
-          ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) )
-#define cf2_fixedToInt( x )                                              \
-          ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) )
-#define cf2_fixedRound( x )                                              \
-          ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) )
-#define cf2_floatToFixed( f )                                            \
-          ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) )
-#define cf2_fixedAbs( x )                                                \
-          ( (x) < 0 ? -(x) : (x) )
-#define cf2_fixedFloor( x )                                              \
-          ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) )
-#define cf2_fixedFraction( x )                                           \
-          ( (x) - cf2_fixedFloor( x ) )
-#define cf2_fracToFixed( x )                                             \
-          ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 )                       \
-                    :  ( (  (x) + 0x2000 ) >> 14 ) )
-
-
-  /* signed numeric types */
-  typedef enum  CF2_NumberType_
-  {
-    CF2_NumberFixed,    /* 16.16 */
-    CF2_NumberFrac,     /*  2.30 */
-    CF2_NumberInt       /* 32.0  */
-
-  } CF2_NumberType;
-
-
-FT_END_HEADER
-
-
-#endif /* CF2FIXED_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2font.c b/third_party/freetype/src/cff/cf2font.c
deleted file mode 100644
index a86e361..0000000
--- a/third_party/freetype/src/cff/cf2font.c
+++ /dev/null
@@ -1,562 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2font.c                                                              */
-/*                                                                         */
-/*    Adobe's code for font instances (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 <ft2build.h>
-#include FT_INTERNAL_CALC_H
-
-#include "cf2ft.h"
-
-#include "cf2glue.h"
-#include "cf2font.h"
-#include "cf2error.h"
-#include "cf2intrp.h"
-
-
-  /* Compute a stem darkening amount in character space. */
-  static void
-  cf2_computeDarkening( CF2_Fixed   emRatio,
-                        CF2_Fixed   ppem,
-                        CF2_Fixed   stemWidth,
-                        CF2_Fixed*  darkenAmount,
-                        CF2_Fixed   boldenAmount,
-                        FT_Bool     stemDarkened,
-                        FT_Int*     darkenParams )
-  {
-    /*
-     * Total darkening amount is computed in 1000 unit character space
-     * using the modified 5 part curve as Adobe's Avalon rasterizer.
-     * The darkening amount is smaller for thicker stems.
-     * It becomes zero when the stem is thicker than 2.333 pixels.
-     *
-     * By default, we use
-     *
-     *   darkenAmount = 0.4 pixels   if scaledStem <= 0.5 pixels,
-     *   darkenAmount = 0.275 pixels if 1 <= scaledStem <= 1.667 pixels,
-     *   darkenAmount = 0 pixel      if scaledStem >= 2.333 pixels,
-     *
-     * and piecewise linear in-between:
-     *
-     *
-     *   darkening
-     *       ^
-     *       |
-     *       |      (x1,y1)
-     *       |--------+
-     *       |         \
-     *       |          \
-     *       |           \          (x3,y3)
-     *       |            +----------+
-     *       |        (x2,y2)         \
-     *       |                         \
-     *       |                          \
-     *       |                           +-----------------
-     *       |                         (x4,y4)
-     *       +--------------------------------------------->   stem
-     *                                                       thickness
-     *
-     *
-     * This corresponds to the following values for the
-     * `darkening-parameters' property:
-     *
-     *   (x1, y1) = (500, 400)
-     *   (x2, y2) = (1000, 275)
-     *   (x3, y3) = (1667, 275)
-     *   (x4, y4) = (2333, 0)
-     *
-     */
-
-    /* Internal calculations are done in units per thousand for */
-    /* convenience. The x axis is scaled stem width in          */
-    /* thousandths of a pixel. That is, 1000 is 1 pixel.        */
-    /* The y axis is darkening amount in thousandths of a pixel.*/
-    /* In the code, below, dividing by ppem and                 */
-    /* adjusting for emRatio converts darkenAmount to character */
-    /* space (font units).                                      */
-    CF2_Fixed  stemWidthPer1000, scaledStem;
-    FT_Int     logBase2;
-
-
-    *darkenAmount = 0;
-
-    if ( boldenAmount == 0 && !stemDarkened )
-      return;
-
-    /* protect against range problems and divide by zero */
-    if ( emRatio < cf2_floatToFixed( .01 ) )
-      return;
-
-    if ( stemDarkened )
-    {
-      FT_Int  x1 = darkenParams[0];
-      FT_Int  y1 = darkenParams[1];
-      FT_Int  x2 = darkenParams[2];
-      FT_Int  y2 = darkenParams[3];
-      FT_Int  x3 = darkenParams[4];
-      FT_Int  y3 = darkenParams[5];
-      FT_Int  x4 = darkenParams[6];
-      FT_Int  y4 = darkenParams[7];
-
-
-      /* convert from true character space to 1000 unit character space; */
-      /* add synthetic emboldening effect                                */
-
-      /* `stemWidthPer1000' will not overflow for a legitimate font      */
-
-      stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio );
-
-      /* `scaledStem' can easily overflow, so we must clamp its maximum  */
-      /* value; the test doesn't need to be precise, but must be         */
-      /* conservative.  The clamp value (default 2333) where             */
-      /* `darkenAmount' is zero is well below the overflow value of      */
-      /* 32767.                                                          */
-      /*                                                                 */
-      /* FT_MSB computes the integer part of the base 2 logarithm.  The  */
-      /* number of bits for the product is 1 or 2 more than the sum of   */
-      /* logarithms; remembering that the 16 lowest bits of the fraction */
-      /* are dropped this is correct to within a factor of almost 4.     */
-      /* For example, 0x80.0000 * 0x80.0000 = 0x4000.0000 is 23+23 and   */
-      /* is flagged as possible overflow because 0xFF.FFFF * 0xFF.FFFF = */
-      /* 0xFFFF.FE00 is also 23+23.                                      */
-
-      logBase2 = FT_MSB( (FT_UInt32)stemWidthPer1000 ) +
-                   FT_MSB( (FT_UInt32)ppem );
-
-      if ( logBase2 >= 46 )
-        /* possible overflow */
-        scaledStem = cf2_intToFixed( x4 );
-      else
-        scaledStem = FT_MulFix( stemWidthPer1000, ppem );
-
-      /* now apply the darkening parameters */
-
-      if ( scaledStem < cf2_intToFixed( x1 ) )
-        *darkenAmount = FT_DivFix( cf2_intToFixed( y1 ), ppem );
-
-      else if ( scaledStem < cf2_intToFixed( x2 ) )
-      {
-        FT_Int  xdelta = x2 - x1;
-        FT_Int  ydelta = y2 - y1;
-        FT_Int  x      = stemWidthPer1000 -
-                           FT_DivFix( cf2_intToFixed( x1 ), ppem );
-
-
-        if ( !xdelta )
-          goto Try_x3;
-
-        *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) +
-                          FT_DivFix( cf2_intToFixed( y1 ), ppem );
-      }
-
-      else if ( scaledStem < cf2_intToFixed( x3 ) )
-      {
-      Try_x3:
-        {
-          FT_Int  xdelta = x3 - x2;
-          FT_Int  ydelta = y3 - y2;
-          FT_Int  x      = stemWidthPer1000 -
-                             FT_DivFix( cf2_intToFixed( x2 ), ppem );
-
-
-          if ( !xdelta )
-            goto Try_x4;
-
-          *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) +
-                            FT_DivFix( cf2_intToFixed( y2 ), ppem );
-        }
-      }
-
-      else if ( scaledStem < cf2_intToFixed( x4 ) )
-      {
-      Try_x4:
-        {
-          FT_Int  xdelta = x4 - x3;
-          FT_Int  ydelta = y4 - y3;
-          FT_Int  x      = stemWidthPer1000 -
-                             FT_DivFix( cf2_intToFixed( x3 ), ppem );
-
-
-          if ( !xdelta )
-            goto Use_y4;
-
-          *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) +
-                            FT_DivFix( cf2_intToFixed( y3 ), ppem );
-        }
-      }
-
-      else
-      {
-      Use_y4:
-        *darkenAmount = FT_DivFix( cf2_intToFixed( y4 ), ppem );
-      }
-
-      /* use half the amount on each side and convert back to true */
-      /* character space                                           */
-      *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio );
-    }
-
-    /* add synthetic emboldening effect in character space */
-    *darkenAmount += boldenAmount / 2;
-  }
-
-
-  /* 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
-  cf2_font_setup( CF2_Font           font,
-                  const CF2_Matrix*  transform )
-  {
-    /* pointer to parsed font object */
-    CFF_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;
-
-    CFF_SubFont  subFont;
-    CF2_Fixed    ppem;
-
-    CF2_UInt   lenNormalizedV = 0;
-    FT_Fixed*  normalizedV    = NULL;
-
-
-    /* clear previous error */
-    font->error = FT_Err_Ok;
-
-    /* if a CID fontDict has changed, we need to recompute some cached */
-    /* data                                                            */
-    subFont = cf2_getSubfont( decoder );
-    if ( font->lastSubfont != subFont )
-    {
-      font->lastSubfont = subFont;
-      needExtraSetup    = TRUE;
-    }
-
-    /* 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 ( cff_blend_check_vector( &subFont->blend,
-                                   subFont->private_dict.vsindex,
-                                   lenNormalizedV,
-                                   normalizedV ) )
-      {
-        /* blend has changed, reparse */
-        cff_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.                                    */
-    ppem = cf2_getPpemY( decoder );
-    if ( font->ppem != ppem )
-    {
-      font->ppem     = ppem;
-      needExtraSetup = TRUE;
-    }
-
-    /* copy hinted flag on each call */
-    font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted );
-
-    /* determine if transform has changed;       */
-    /* include Fontmatrix but ignore translation */
-    if ( ft_memcmp( transform,
-                    &font->currentTransform,
-                    4 * sizeof ( CF2_Fixed ) ) != 0 )
-    {
-      /* save `key' information for `cache of one' matrix data; */
-      /* save client transform, without the translation         */
-      font->currentTransform    = *transform;
-      font->currentTransform.tx =
-      font->currentTransform.ty = cf2_intToFixed( 0 );
-
-      /* TODO: FreeType transform is simple scalar; for now, use identity */
-      /*       for outer                                                  */
-      font->innerTransform   = *transform;
-      font->outerTransform.a =
-      font->outerTransform.d = cf2_intToFixed( 1 );
-      font->outerTransform.b =
-      font->outerTransform.c = cf2_intToFixed( 0 );
-
-      needExtraSetup = TRUE;
-    }
-
-    /*
-     * font->darkened is set to true if there is a stem darkening request or
-     * the font is synthetic emboldened.
-     * font->darkened controls whether to adjust blue zones, winding order,
-     * and hinting.
-     *
-     */
-    if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) )
-    {
-      font->stemDarkened =
-        (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened );
-
-      /* blue zones depend on darkened flag */
-      needExtraSetup = TRUE;
-    }
-
-    /* recompute variables that are dependent on transform or FontDict or */
-    /* darken flag                                                        */
-    if ( needExtraSetup )
-    {
-      /* StdVW is found in the private dictionary;                       */
-      /* recompute darkening amounts whenever private dictionary or      */
-      /* transform change                                                */
-      /* Note: a rendering flag turns darkening on or off, so we want to */
-      /*       store the `on' amounts;                                   */
-      /*       darkening amount is computed in character space           */
-      /* TODO: testing size-dependent darkening here;                    */
-      /*       what to do for rotations?                                 */
-
-      CF2_Fixed  emRatio;
-      CF2_Fixed  stdHW;
-      CF2_Int    unitsPerEm = font->unitsPerEm;
-
-
-      if ( unitsPerEm == 0 )
-        unitsPerEm = 1000;
-
-      ppem = FT_MAX( cf2_intToFixed( 4 ),
-                     font->ppem ); /* use minimum ppem of 4 */
-
-#if 0
-      /* since vstem is measured in the x-direction, we use the `a' member */
-      /* of the fontMatrix                                                 */
-      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a );
-#endif
-
-      /* Freetype does not preserve the fontMatrix when parsing; use */
-      /* unitsPerEm instead.                                         */
-      /* TODO: check precision of this                               */
-      emRatio     = cf2_intToFixed( 1000 ) / unitsPerEm;
-      font->stdVW = cf2_getStdVW( decoder );
-
-      if ( font->stdVW <= 0 )
-        font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
-
-      if ( boldenX > 0 )
-      {
-        /* Ensure that boldenX is at least 1 pixel for synthetic bold font */
-        /* (similar to what Avalon does)                                   */
-        boldenX = FT_MAX( boldenX,
-                          FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) );
-
-        /* Synthetic emboldening adds at least 1 pixel to darkenX, while */
-        /* stem darkening adds at most half pixel.  Since the purpose of */
-        /* stem darkening (readability at small sizes) is met with       */
-        /* synthetic emboldening, no need to add stem darkening for a    */
-        /* synthetic bold font.                                          */
-        cf2_computeDarkening( emRatio,
-                              ppem,
-                              font->stdVW,
-                              &font->darkenX,
-                              boldenX,
-                              FALSE,
-                              font->darkenParams );
-      }
-      else
-        cf2_computeDarkening( emRatio,
-                              ppem,
-                              font->stdVW,
-                              &font->darkenX,
-                              0,
-                              font->stemDarkened,
-                              font->darkenParams );
-
-#if 0
-      /* since hstem is measured in the y-direction, we use the `d' member */
-      /* of the fontMatrix                                                 */
-      /* TODO: use the same units per em as above; check this              */
-      emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d );
-#endif
-
-      /* set the default stem width, because it must be the same for all */
-      /* family members;                                                 */
-      /* choose a constant for StdHW that depends on font contrast       */
-      stdHW = cf2_getStdHW( decoder );
-
-      if ( stdHW > 0 && font->stdVW > 2 * stdHW )
-        font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio );
-      else
-      {
-        /* low contrast font gets less hstem darkening */
-        font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio );
-      }
-
-      cf2_computeDarkening( emRatio,
-                            ppem,
-                            font->stdHW,
-                            &font->darkenY,
-                            boldenY,
-                            font->stemDarkened,
-                            font->darkenParams );
-
-      if ( font->darkenX != 0 || font->darkenY != 0 )
-        font->darkened = TRUE;
-      else
-        font->darkened = FALSE;
-
-      font->reverseWinding = FALSE; /* initial expectation is CCW */
-
-      /* compute blue zones for this instance */
-      cf2_blues_init( &font->blues, font );
-
-    } /* needExtraSetup */
-  }
-
-
-  /* equivalent to AdobeGetOutline */
-  FT_LOCAL_DEF( FT_Error )
-  cf2_getGlyphOutline( CF2_Font           font,
-                       CF2_Buffer         charstring,
-                       const CF2_Matrix*  transform,
-                       CF2_F16Dot16*      glyphWidth )
-  {
-    FT_Error  lastError = FT_Err_Ok;
-
-    FT_Vector  translation;
-
-#if 0
-    FT_Vector  advancePoint;
-#endif
-
-    CF2_Fixed  advWidth = 0;
-    FT_Bool    needWinding;
-
-
-    /* Note: use both integer and fraction for outlines.  This allows bbox */
-    /*       to come out directly.                                         */
-
-    translation.x = transform->tx;
-    translation.y = transform->ty;
-
-    /* set up values based on transform */
-    cf2_font_setup( font, transform );
-    if ( font->error )
-      goto exit;                      /* setup encountered an error */
-
-    /* reset darken direction */
-    font->reverseWinding = FALSE;
-
-    /* winding order only affects darkening */
-    needWinding = font->darkened;
-
-    while ( 1 )
-    {
-      /* reset output buffer */
-      cf2_outline_reset( &font->outline );
-
-      /* build the outline, passing the full translation */
-      cf2_interpT2CharString( font,
-                              charstring,
-                              (CF2_OutlineCallbacks)&font->outline,
-                              &translation,
-                              FALSE,
-                              0,
-                              0,
-                              &advWidth );
-
-      if ( font->error )
-        goto exit;
-
-      if ( !needWinding )
-        break;
-
-      /* check winding order */
-      if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */
-        break;
-
-      /* invert darkening and render again                            */
-      /* TODO: this should be a parameter to getOutline-computeOffset */
-      font->reverseWinding = TRUE;
-
-      needWinding = FALSE;    /* exit after next iteration */
-    }
-
-    /* finish storing client outline */
-    cf2_outline_close( &font->outline );
-
-  exit:
-    /* FreeType just wants the advance width; there is no translation */
-    *glyphWidth = advWidth;
-
-    /* free resources and collect errors from objects we've used */
-    cf2_setError( &font->error, lastError );
-
-    return font->error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2font.h b/third_party/freetype/src/cff/cf2font.h
deleted file mode 100644
index 17ecd17..0000000
--- a/third_party/freetype/src/cff/cf2font.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2font.h                                                              */
-/*                                                                         */
-/*    Adobe's code for font instances (specification).                     */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2FONT_H_
-#define CF2FONT_H_
-
-
-#include "cf2ft.h"
-#include "cf2blues.h"
-#include "cffload.h"
-
-
-FT_BEGIN_HEADER
-
-
-#define CF2_OPERAND_STACK_SIZE  48
-#define CF2_MAX_SUBR            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 CF2_STORAGE_SIZE        32
-
-
-  /* typedef is in `cf2glue.h' */
-  struct  CF2_FontRec_
-  {
-    FT_Memory  memory;
-    FT_Error   error;     /* shared error for this instance */
-
-    FT_Bool             isCFF2;
-    CF2_RenderingFlags  renderingFlags;
-
-    /* variables that depend on Transform:  */
-    /* the following have zero translation; */
-    /* inner * outer = font * original      */
-
-    CF2_Matrix  currentTransform;  /* original client matrix           */
-    CF2_Matrix  innerTransform;    /* for hinting; erect, scaled       */
-    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 */
-    CF2_Fixed  syntheticEmboldeningAmountY;   /* character space units */
-
-    /* FreeType related members */
-    CF2_OutlineRec  outline;       /* freetype glyph outline functions */
-    CFF_Decoder*    decoder;
-    CFF_SubFont     lastSubfont;              /* FreeType parsed data; */
-                                              /* top font or subfont   */
-
-    /* these flags can vary from one call to the next */
-    FT_Bool  hinted;
-    FT_Bool  darkened;       /* true if stemDarkened or synthetic bold */
-                             /* i.e. darkenX != 0 || darkenY != 0      */
-    FT_Bool  stemDarkened;
-
-    FT_Int  darkenParams[8];              /* 1000 unit character space */
-
-    /* variables that depend on both FontDict and Transform */
-    CF2_Fixed  stdVW;     /* in character space; depends on dict entry */
-    CF2_Fixed  stdHW;     /* in character space; depends on dict entry */
-    CF2_Fixed  darkenX;                    /* character space units    */
-    CF2_Fixed  darkenY;                    /* depends on transform     */
-                                           /* and private dict (StdVW) */
-    FT_Bool  reverseWinding;               /* darken assuming          */
-                                           /* counterclockwise winding */
-
-    CF2_BluesRec  blues;                         /* computed zone data */
-  };
-
-
-  FT_LOCAL( FT_Error )
-  cf2_getGlyphOutline( CF2_Font           font,
-                       CF2_Buffer         charstring,
-                       const CF2_Matrix*  transform,
-                       CF2_F16Dot16*      glyphWidth );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2FONT_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2ft.c b/third_party/freetype/src/cff/cf2ft.c
deleted file mode 100644
index c0d067e..0000000
--- a/third_party/freetype/src/cff/cf2ft.c
+++ /dev/null
@@ -1,748 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2ft.c                                                                */
-/*                                                                         */
-/*    FreeType Glue Component to Adobe's Interpreter (body).               */
-/*                                                                         */
-/*  Copyright 2013-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 "cf2font.h"
-#include "cf2error.h"
-
-
-#define CF2_MAX_SIZE  cf2_intToFixed( 2000 )    /* max ppem */
-
-
-  /*
-   * This check should avoid most internal overflow cases.  Clients should
-   * generally respond to `Glyph_Too_Big' by getting a glyph outline
-   * at EM size, scaling it and filling it as a graphics operation.
-   *
-   */
-  static FT_Error
-  cf2_checkTransform( const CF2_Matrix*  transform,
-                      CF2_Int            unitsPerEm )
-  {
-    CF2_Fixed  maxScale;
-
-
-    FT_ASSERT( unitsPerEm > 0 );
-
-    if ( transform->a <= 0 || transform->d <= 0 )
-      return FT_THROW( Invalid_Size_Handle );
-
-    FT_ASSERT( transform->b == 0 && transform->c == 0 );
-    FT_ASSERT( transform->tx == 0 && transform->ty == 0 );
-
-    if ( unitsPerEm > 0x7FFF )
-      return FT_THROW( Glyph_Too_Big );
-
-    maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) );
-
-    if ( transform->a > maxScale || transform->d > maxScale )
-      return FT_THROW( Glyph_Too_Big );
-
-    return FT_Err_Ok;
-  }
-
-
-  static void
-  cf2_setGlyphWidth( CF2_Outline  outline,
-                     CF2_Fixed    width )
-  {
-    CFF_Decoder*  decoder = outline->decoder;
-
-
-    FT_ASSERT( decoder );
-
-    decoder->glyph_width = cf2_fixedToInt( width );
-  }
-
-
-  /* Clean up font instance. */
-  static void
-  cf2_free_instance( void*  ptr )
-  {
-    CF2_Font  font = (CF2_Font)ptr;
-
-
-    if ( font )
-    {
-      FT_Memory  memory = font->memory;
-
-
-      FT_FREE( font->blend.lastNDV );
-      FT_FREE( font->blend.BV );
-    }
-  }
-
-
-  /********************************************/
-  /*                                          */
-  /* functions for handling client outline;   */
-  /* FreeType uses coordinates in 26.6 format */
-  /*                                          */
-  /********************************************/
-
-  static void
-  cf2_builder_moveTo( CF2_OutlineCallbacks      callbacks,
-                      const CF2_CallbackParams  params )
-  {
-    /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
-
-    (void)params;        /* only used in debug mode */
-
-
-    FT_ASSERT( outline && outline->decoder );
-    FT_ASSERT( params->op == CF2_PathOpMoveTo );
-
-    builder = &outline->decoder->builder;
-
-    /* note: two successive moves simply close the contour twice */
-    cff_builder_close_contour( builder );
-    builder->path_begun = 0;
-  }
-
-
-  static void
-  cf2_builder_lineTo( CF2_OutlineCallbacks      callbacks,
-                      const CF2_CallbackParams  params )
-  {
-    FT_Error  error;
-
-    /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
-
-
-    FT_ASSERT( outline && outline->decoder );
-    FT_ASSERT( params->op == CF2_PathOpLineTo );
-
-    builder = &outline->decoder->builder;
-
-    if ( !builder->path_begun )
-    {
-      /* 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 );
-      if ( error )
-      {
-        if ( !*callbacks->error )
-          *callbacks->error =  error;
-        return;
-      }
-    }
-
-    /* `cff_builder_add_point1' includes a check_points call for one point */
-    error = cff_builder_add_point1( builder,
-                                    params->pt1.x,
-                                    params->pt1.y );
-    if ( error )
-    {
-      if ( !*callbacks->error )
-        *callbacks->error =  error;
-      return;
-    }
-  }
-
-
-  static void
-  cf2_builder_cubeTo( CF2_OutlineCallbacks      callbacks,
-                      const CF2_CallbackParams  params )
-  {
-    FT_Error  error;
-
-    /* downcast the object pointer */
-    CF2_Outline   outline = (CF2_Outline)callbacks;
-    CFF_Builder*  builder;
-
-
-    FT_ASSERT( outline && outline->decoder );
-    FT_ASSERT( params->op == CF2_PathOpCubeTo );
-
-    builder = &outline->decoder->builder;
-
-    if ( !builder->path_begun )
-    {
-      /* 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 );
-      if ( error )
-      {
-        if ( !*callbacks->error )
-          *callbacks->error =  error;
-        return;
-      }
-    }
-
-    /* prepare room for 3 points: 2 off-curve, 1 on-curve */
-    error = cff_check_points( builder, 3 );
-    if ( error )
-    {
-      if ( !*callbacks->error )
-        *callbacks->error =  error;
-      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 );
-  }
-
-
-  static void
-  cf2_outline_init( CF2_Outline  outline,
-                    FT_Memory    memory,
-                    FT_Error*    error )
-  {
-    FT_ZERO( outline );
-
-    outline->root.memory = memory;
-    outline->root.error  = error;
-
-    outline->root.moveTo = cf2_builder_moveTo;
-    outline->root.lineTo = cf2_builder_lineTo;
-    outline->root.cubeTo = cf2_builder_cubeTo;
-  }
-
-
-  /* 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 )
-  {
-    FT_ASSERT( decoder && decoder->builder.glyph );
-
-    /* note: FreeType scale includes a factor of 64 */
-    *hinted = decoder->builder.glyph->hint;
-    *scaled = decoder->builder.glyph->scaled;
-
-    if ( *hinted )
-    {
-      *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64;
-      *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64;
-    }
-    else
-    {
-      /* for unhinted outlines, `cff_slot_load' does the scaling, */
-      /* thus render at `unity' scale                             */
-
-      *x_scale = 0x0400;   /* 1/64 as 16.16 */
-      *y_scale = 0x0400;
-    }
-  }
-
-
-  /* get units per em from `FT_Face' */
-  /* TODO: should handle font matrix concatenation? */
-  static FT_UShort
-  cf2_getUnitsPerEm( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->builder.face );
-    FT_ASSERT( decoder->builder.face->root.units_per_EM );
-
-    return decoder->builder.face->root.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 )
-  {
-    FT_Memory  memory;
-    FT_Error   error = FT_Err_Ok;
-    CF2_Font   font;
-
-
-    FT_ASSERT( decoder && decoder->cff );
-
-    memory = decoder->builder.memory;
-
-    /* CF2 data is saved here across glyphs */
-    font = (CF2_Font)decoder->cff->cf2_instance.data;
-
-    /* on first glyph, allocate instance structure */
-    if ( !decoder->cff->cf2_instance.data )
-    {
-      decoder->cff->cf2_instance.finalizer =
-        (FT_Generic_Finalizer)cf2_free_instance;
-
-      if ( FT_ALLOC( decoder->cff->cf2_instance.data,
-                     sizeof ( CF2_FontRec ) ) )
-        return FT_THROW( Out_Of_Memory );
-
-      font = (CF2_Font)decoder->cff->cf2_instance.data;
-
-      font->memory = memory;
-
-      /* initialize a client outline, to be shared by each glyph rendered */
-      cf2_outline_init( &font->outline, font->memory, &font->error );
-    }
-
-    /* save decoder; it is a stack variable and will be different on each */
-    /* call                                                               */
-    font->decoder         = decoder;
-    font->outline.decoder = decoder;
-
-    {
-      /* build parameters for Adobe engine */
-
-      CFF_Builder*  builder = &decoder->builder;
-      CFF_Driver    driver  = (CFF_Driver)FT_FACE_DRIVER( builder->face );
-
-      /* local error */
-      FT_Error       error2 = FT_Err_Ok;
-      CF2_BufferRec  buf;
-      CF2_Matrix     transform;
-      CF2_F16Dot16   glyphWidth;
-
-      FT_Bool  hinted;
-      FT_Bool  scaled;
-
-
-      /* FreeType has already looked up the GID; convert to         */
-      /* `RegionBuffer', assuming that the input has been validated */
-      FT_ASSERT( charstring_base + charstring_len >= charstring_base );
-
-      FT_ZERO( &buf );
-      buf.start =
-      buf.ptr   = charstring_base;
-      buf.end   = charstring_base + charstring_len;
-
-      FT_ZERO( &transform );
-
-      cf2_getScaleAndHintFlag( decoder,
-                               &transform.a,
-                               &transform.d,
-                               &hinted,
-                               &scaled );
-
-      /* copy isCFF2 boolean from TT_Face to CF2_Font */
-      font->isCFF2 = builder->face->isCFF2;
-
-      font->renderingFlags = 0;
-      if ( hinted )
-        font->renderingFlags |= CF2_FlagsHinted;
-      if ( scaled && !driver->no_stem_darkening )
-        font->renderingFlags |= CF2_FlagsDarkened;
-
-      font->darkenParams[0] = driver->darken_params[0];
-      font->darkenParams[1] = driver->darken_params[1];
-      font->darkenParams[2] = driver->darken_params[2];
-      font->darkenParams[3] = driver->darken_params[3];
-      font->darkenParams[4] = driver->darken_params[4];
-      font->darkenParams[5] = driver->darken_params[5];
-      font->darkenParams[6] = driver->darken_params[6];
-      font->darkenParams[7] = driver->darken_params[7];
-
-      /* now get an outline for this glyph;      */
-      /* also get units per em to validate scale */
-      font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder );
-
-      if ( scaled )
-      {
-        error2 = cf2_checkTransform( &transform, font->unitsPerEm );
-        if ( error2 )
-          return error2;
-      }
-
-      error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth );
-      if ( error2 )
-        return FT_ERR( Invalid_File_Format );
-
-      cf2_setGlyphWidth( &font->outline, glyphWidth );
-
-      return FT_Err_Ok;
-    }
-  }
-
-
-  /* get pointer to current FreeType subfont (based on current glyphID) */
-  FT_LOCAL_DEF( CFF_SubFont )
-  cf2_getSubfont( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return decoder->current_subfont;
-  }
-
-
-  /* get pointer to VStore structure */
-  FT_LOCAL_DEF( CFF_VStore )
-  cf2_getVStore( CFF_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( CFF_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( CFF_Decoder*  decoder,
-                           CF2_UInt     *len,
-                           FT_Fixed*    *vec )
-  {
-    FT_ASSERT( decoder && decoder->builder.face );
-    FT_ASSERT( vec && len );
-
-    return cff_get_var_blend( decoder->builder.face, len, vec, NULL );
-  }
-#endif
-
-
-  /* get `y_ppem' from `CFF_Size' */
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getPpemY( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder                          &&
-               decoder->builder.face            &&
-               decoder->builder.face->root.size );
-
-    /*
-     * Note that `y_ppem' can be zero if there wasn't a call to
-     * `FT_Set_Char_Size' or something similar.  However, this isn't a
-     * problem since we come to this place in the code only if
-     * FT_LOAD_NO_SCALE is set (the other case gets caught by
-     * `cf2_checkTransform').  The ppem value is needed to compute the stem
-     * darkening, which is disabled for getting the unscaled outline.
-     *
-     */
-    return cf2_intToFixed(
-             decoder->builder.face->root.size->metrics.y_ppem );
-  }
-
-
-  /* get standard stem widths for the current subfont; */
-  /* FreeType stores these as integer font units       */
-  /* (note: variable names seem swapped)               */
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdVW( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return cf2_intToFixed(
-             decoder->current_subfont->private_dict.standard_height );
-  }
-
-
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getStdHW( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return cf2_intToFixed(
-             decoder->current_subfont->private_dict.standard_width );
-  }
-
-
-  /* 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 )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    *blueScale = FT_DivFix(
-                   decoder->current_subfont->private_dict.blue_scale,
-                   cf2_intToFixed( 1000 ) );
-    *blueShift = cf2_intToFixed(
-                   decoder->current_subfont->private_dict.blue_shift );
-    *blueFuzz  = cf2_intToFixed(
-                   decoder->current_subfont->private_dict.blue_fuzz );
-  }
-
-
-  /* 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 )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    *count = decoder->current_subfont->private_dict.num_blue_values;
-    *data  = (FT_Pos*)
-               &decoder->current_subfont->private_dict.blue_values;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_getOtherBlues( CFF_Decoder*  decoder,
-                     size_t*       count,
-                     FT_Pos*      *data )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    *count = decoder->current_subfont->private_dict.num_other_blues;
-    *data  = (FT_Pos*)
-               &decoder->current_subfont->private_dict.other_blues;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_getFamilyBlues( CFF_Decoder*  decoder,
-                      size_t*       count,
-                      FT_Pos*      *data )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    *count = decoder->current_subfont->private_dict.num_family_blues;
-    *data  = (FT_Pos*)
-               &decoder->current_subfont->private_dict.family_blues;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_getFamilyOtherBlues( CFF_Decoder*  decoder,
-                           size_t*       count,
-                           FT_Pos*      *data )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    *count = decoder->current_subfont->private_dict.num_family_other_blues;
-    *data  = (FT_Pos*)
-               &decoder->current_subfont->private_dict.family_other_blues;
-  }
-
-
-  FT_LOCAL_DEF( CF2_Int )
-  cf2_getLanguageGroup( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return decoder->current_subfont->private_dict.language_group;
-  }
-
-
-  /* convert unbiased subroutine index to `CF2_Buffer' and */
-  /* return 0 on success                                   */
-  FT_LOCAL_DEF( CF2_Int )
-  cf2_initGlobalRegionBuffer( CFF_Decoder*  decoder,
-                              CF2_Int       subrNum,
-                              CF2_Buffer    buf )
-  {
-    CF2_UInt  idx;
-
-
-    FT_ASSERT( decoder );
-
-    FT_ZERO( buf );
-
-    idx = (CF2_UInt)( subrNum + decoder->globals_bias );
-    if ( idx >= decoder->num_globals )
-      return TRUE;     /* error */
-
-    FT_ASSERT( decoder->globals );
-
-    buf->start =
-    buf->ptr   = decoder->globals[idx];
-    buf->end   = decoder->globals[idx + 1];
-
-    return FALSE;      /* success */
-  }
-
-
-  /* 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_Int   gid;
-    FT_Byte*  charstring;
-    FT_ULong  len;
-    FT_Error  error;
-
-
-    FT_ASSERT( decoder );
-
-    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 )
-      gid = code;
-    else
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-    {
-      gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code );
-      if ( gid < 0 )
-        return FT_THROW( Invalid_Glyph_Format );
-    }
-
-    error = cff_get_glyph_data( decoder->builder.face,
-                                (CF2_UInt)gid,
-                                &charstring,
-                                &len );
-    /* TODO: for now, just pass the FreeType error through */
-    if ( error )
-      return error;
-
-    /* assume input has been validated */
-    FT_ASSERT( charstring + len >= charstring );
-
-    buf->start = charstring;
-    buf->end   = charstring + len;
-    buf->ptr   = buf->start;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_freeSeacComponent( CFF_Decoder*  decoder,
-                         CF2_Buffer    buf )
-  {
-    FT_ASSERT( decoder );
-
-    cff_free_glyph_data( decoder->builder.face,
-                         (FT_Byte**)&buf->start,
-                         (FT_ULong)( buf->end - buf->start ) );
-  }
-
-
-  FT_LOCAL_DEF( CF2_Int )
-  cf2_initLocalRegionBuffer( CFF_Decoder*  decoder,
-                             CF2_Int       subrNum,
-                             CF2_Buffer    buf )
-  {
-    CF2_UInt  idx;
-
-
-    FT_ASSERT( decoder );
-
-    FT_ZERO( buf );
-
-    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];
-
-    return FALSE;      /* success */
-  }
-
-
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getDefaultWidthX( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return cf2_intToFixed(
-             decoder->current_subfont->private_dict.default_width );
-  }
-
-
-  FT_LOCAL_DEF( CF2_Fixed )
-  cf2_getNominalWidthX( CFF_Decoder*  decoder )
-  {
-    FT_ASSERT( decoder && decoder->current_subfont );
-
-    return cf2_intToFixed(
-             decoder->current_subfont->private_dict.nominal_width );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_outline_reset( CF2_Outline  outline )
-  {
-    CFF_Decoder*  decoder = outline->decoder;
-
-
-    FT_ASSERT( decoder );
-
-    outline->root.windingMomentum = 0;
-
-    FT_GlyphLoader_Rewind( decoder->builder.loader );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_outline_close( CF2_Outline  outline )
-  {
-    CFF_Decoder*  decoder = outline->decoder;
-
-
-    FT_ASSERT( decoder );
-
-    cff_builder_close_contour( &decoder->builder );
-
-    FT_GlyphLoader_Add( decoder->builder.loader );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2ft.h b/third_party/freetype/src/cff/cf2ft.h
deleted file mode 100644
index b054a6e..0000000
--- a/third_party/freetype/src/cff/cf2ft.h
+++ /dev/null
@@ -1,159 +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( CFF_VStore )
-  cf2_getVStore( CFF_Decoder*  decoder );
-
-  FT_LOCAL( FT_UInt )
-  cf2_getMaxstack( CFF_Decoder*  decoder );
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_LOCAL( FT_Error )
-  cf2_getNormalizedVector( CFF_Decoder*  decoder,
-                           CF2_UInt     *len,
-                           FT_Fixed*    *vec );
-#endif
-
-  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_Int       subrNum,
-                              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_Int       subrNum,
-                             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/third_party/freetype/src/cff/cf2glue.h b/third_party/freetype/src/cff/cf2glue.h
deleted file mode 100644
index 56a7c24..0000000
--- a/third_party/freetype/src/cff/cf2glue.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2glue.h                                                              */
-/*                                                                         */
-/*    Adobe's code for shared stuff (specification only).                  */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2GLUE_H_
-#define CF2GLUE_H_
-
-
-/* common includes for other modules */
-#include "cf2error.h"
-#include "cf2fixed.h"
-#include "cf2arrst.h"
-#include "cf2read.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /* rendering parameters */
-
-  /* apply hints to rendered glyphs */
-#define CF2_FlagsHinted    1
-  /* for testing */
-#define CF2_FlagsDarkened  2
-
-  /* type for holding the flags */
-  typedef CF2_Int  CF2_RenderingFlags;
-
-
-  /* elements of a glyph outline */
-  typedef enum  CF2_PathOp_
-  {
-    CF2_PathOpMoveTo = 1,     /* change the current point */
-    CF2_PathOpLineTo = 2,     /* line                     */
-    CF2_PathOpQuadTo = 3,     /* quadratic curve          */
-    CF2_PathOpCubeTo = 4      /* cubic curve              */
-
-  } CF2_PathOp;
-
-
-  /* a matrix of fixed point values */
-  typedef struct  CF2_Matrix_
-  {
-    CF2_F16Dot16  a;
-    CF2_F16Dot16  b;
-    CF2_F16Dot16  c;
-    CF2_F16Dot16  d;
-    CF2_F16Dot16  tx;
-    CF2_F16Dot16  ty;
-
-  } CF2_Matrix;
-
-
-  /* these typedefs are needed by more than one header file */
-  /* and gcc compiler doesn't allow redefinition            */
-  typedef struct CF2_FontRec_  CF2_FontRec, *CF2_Font;
-  typedef struct CF2_HintRec_  CF2_HintRec, *CF2_Hint;
-
-
-  /* A common structure for all callback parameters.                       */
-  /*                                                                       */
-  /* Some members may be unused.  For example, `pt0' is not used for       */
-  /* `moveTo' and `pt3' is not used for `quadTo'.  The initial point `pt0' */
-  /* is included for each path element for generality; curve conversions   */
-  /* need it.  The `op' parameter allows one function to handle multiple   */
-  /* element types.                                                        */
-
-  typedef struct  CF2_CallbackParamsRec_
-  {
-    FT_Vector  pt0;
-    FT_Vector  pt1;
-    FT_Vector  pt2;
-    FT_Vector  pt3;
-
-    CF2_Int  op;
-
-  } CF2_CallbackParamsRec, *CF2_CallbackParams;
-
-
-  /* forward reference */
-  typedef struct CF2_OutlineCallbacksRec_  CF2_OutlineCallbacksRec,
-                                           *CF2_OutlineCallbacks;
-
-  /* callback function pointers */
-  typedef void
-  (*CF2_Callback_Type)( CF2_OutlineCallbacks      callbacks,
-                        const CF2_CallbackParams  params );
-
-
-  struct  CF2_OutlineCallbacksRec_
-  {
-    CF2_Callback_Type  moveTo;
-    CF2_Callback_Type  lineTo;
-    CF2_Callback_Type  quadTo;
-    CF2_Callback_Type  cubeTo;
-
-    CF2_Int  windingMomentum;    /* for winding order detection */
-
-    FT_Memory  memory;
-    FT_Error*  error;
-  };
-
-
-FT_END_HEADER
-
-
-#endif /* CF2GLUE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2hints.c b/third_party/freetype/src/cff/cf2hints.c
deleted file mode 100644
index c8f7dfe..0000000
--- a/third_party/freetype/src/cff/cf2hints.c
+++ /dev/null
@@ -1,1848 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2hints.c                                                             */
-/*                                                                         */
-/*    Adobe's code for handling CFF hints (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 "cf2hints.h"
-#include "cf2intrp.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_cf2hints
-
-
-  typedef struct  CF2_HintMoveRec_
-  {
-    size_t     j;          /* index of upper hint map edge   */
-    CF2_Fixed  moveUp;     /* adjustment to optimum position */
-
-  } CF2_HintMoveRec, *CF2_HintMove;
-
-
-  /* Compute angular momentum for winding order detection.  It is called */
-  /* for all lines and curves, but not necessarily in element order.     */
-  static CF2_Int
-  cf2_getWindingMomentum( CF2_Fixed  x1,
-                          CF2_Fixed  y1,
-                          CF2_Fixed  x2,
-                          CF2_Fixed  y2 )
-  {
-    /* 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 );
-  }
-
-
-  /*
-   * Construct from a StemHint; this is used as a parameter to
-   * `cf2_blues_capture'.
-   * `hintOrigin' is the character space displacement of a seac accent.
-   * Adjust stem hint for darkening here.
-   *
-   */
-  static void
-  cf2_hint_init( CF2_Hint            hint,
-                 const CF2_ArrStack  stemHintArray,
-                 size_t              indexStemHint,
-                 const CF2_Font      font,
-                 CF2_Fixed           hintOrigin,
-                 CF2_Fixed           scale,
-                 FT_Bool             bottom )
-  {
-    CF2_Fixed               width;
-    const CF2_StemHintRec*  stemHint;
-
-
-    FT_ZERO( hint );
-
-    stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer(
-                                         stemHintArray,
-                                         indexStemHint );
-
-    width = stemHint->max - stemHint->min;
-
-    if ( width == cf2_intToFixed( -21 ) )
-    {
-      /* ghost bottom */
-
-      if ( bottom )
-      {
-        hint->csCoord = stemHint->max;
-        hint->flags   = CF2_GhostBottom;
-      }
-      else
-        hint->flags = 0;
-    }
-
-    else if ( width == cf2_intToFixed( -20 ) )
-    {
-      /* ghost top */
-
-      if ( bottom )
-        hint->flags = 0;
-      else
-      {
-        hint->csCoord = stemHint->min;
-        hint->flags   = CF2_GhostTop;
-      }
-    }
-
-    else if ( width < 0 )
-    {
-      /* inverted pair */
-
-      /*
-       * Hints with negative widths were produced by an early version of a
-       * non-Adobe font tool.  The Type 2 spec allows edge (ghost) hints
-       * with negative widths, but says
-       *
-       *   All other negative widths have undefined meaning.
-       *
-       * CoolType has a silent workaround that negates the hint width; for
-       * permissive mode, we do the same here.
-       *
-       * Note: Such fonts cannot use ghost hints, but should otherwise work.
-       * Note: Some poor hints in our faux fonts can produce negative
-       *       widths at some blends.  For example, see a light weight of
-       *       `u' in ASerifMM.
-       *
-       */
-      if ( bottom )
-      {
-        hint->csCoord = stemHint->max;
-        hint->flags   = CF2_PairBottom;
-      }
-      else
-      {
-        hint->csCoord = stemHint->min;
-        hint->flags   = CF2_PairTop;
-      }
-    }
-
-    else
-    {
-      /* normal pair */
-
-      if ( bottom )
-      {
-        hint->csCoord = stemHint->min;
-        hint->flags   = CF2_PairBottom;
-      }
-      else
-      {
-        hint->csCoord = stemHint->max;
-        hint->flags   = CF2_PairTop;
-      }
-    }
-
-    /* Now that ghost hints have been detected, adjust this edge for      */
-    /* darkening.  Bottoms are not changed; tops are incremented by twice */
-    /* `darkenY'.                                                         */
-    if ( cf2_hint_isTop( hint ) )
-      hint->csCoord += 2 * font->darkenY;
-
-    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 )
-    {
-      if ( cf2_hint_isTop( hint ) )
-        hint->dsCoord = stemHint->maxDS;
-      else
-        hint->dsCoord = stemHint->minDS;
-
-      cf2_hint_lock( hint );
-    }
-    else
-      hint->dsCoord = FT_MulFix( hint->csCoord, scale );
-  }
-
-
-  /* initialize an invalid hint map element */
-  static void
-  cf2_hint_initZero( CF2_Hint  hint )
-  {
-    FT_ZERO( hint );
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hint_isValid( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( hint->flags != 0 );
-  }
-
-
-  static FT_Bool
-  cf2_hint_isPair( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags                      &
-                        ( CF2_PairBottom | CF2_PairTop ) ) != 0 );
-  }
-
-
-  static FT_Bool
-  cf2_hint_isPairTop( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 );
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hint_isTop( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags                    &
-                        ( CF2_PairTop | CF2_GhostTop ) ) != 0 );
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_hint_isBottom( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags                          &
-                        ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 );
-  }
-
-
-  static FT_Bool
-  cf2_hint_isLocked( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 );
-  }
-
-
-  static FT_Bool
-  cf2_hint_isSynthetic( const CF2_Hint  hint )
-  {
-    return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hint_lock( CF2_Hint  hint )
-  {
-    hint->flags |= CF2_Locked;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_hintmap_init( CF2_HintMap   hintmap,
-                    CF2_Font      font,
-                    CF2_HintMap   initialMap,
-                    CF2_ArrStack  hintMoves,
-                    CF2_Fixed     scale )
-  {
-    FT_ZERO( hintmap );
-
-    /* copy parameters from font instance */
-    hintmap->hinted         = font->hinted;
-    hintmap->scale          = scale;
-    hintmap->font           = font;
-    hintmap->initialHintMap = initialMap;
-    /* will clear in `cf2_hintmap_adjustHints' */
-    hintmap->hintMoves      = hintMoves;
-  }
-
-
-  static FT_Bool
-  cf2_hintmap_isValid( const CF2_HintMap  hintmap )
-  {
-    return hintmap->isValid;
-  }
-
-
-  /* transform character space coordinate to device space using hint map */
-  static CF2_Fixed
-  cf2_hintmap_map( CF2_HintMap  hintmap,
-                   CF2_Fixed    csCoord )
-  {
-    if ( hintmap->count == 0 || ! hintmap->hinted )
-    {
-      /* there are no hints; use uniform scale and zero offset */
-      return FT_MulFix( csCoord, hintmap->scale );
-    }
-    else
-    {
-      /* start linear search from last hit */
-      CF2_UInt  i = hintmap->lastIndex;
-
-      FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES );
-
-      /* search up */
-      while ( i < hintmap->count - 1                  &&
-              csCoord >= hintmap->edge[i + 1].csCoord )
-        i += 1;
-
-      /* search down */
-      while ( i > 0 && csCoord < hintmap->edge[i].csCoord )
-        i -= 1;
-
-      hintmap->lastIndex = i;
-
-      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;
-      }
-      else
-      {
-        /*
-         * 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;
-      }
-    }
-  }
-
-
-  /*
-   * This hinting policy moves a hint pair in device space so that one of
-   * its two edges is on a device pixel boundary (its fractional part is
-   * zero).  `cf2_hintmap_insertHint' guarantees no overlap in CS
-   * space.  Ensure here that there is no overlap in DS.
-   *
-   * In the first pass, edges are adjusted relative to adjacent hints.
-   * Those that are below have already been adjusted.  Those that are
-   * above have not yet been adjusted.  If a hint above blocks an
-   * adjustment to an optimal position, we will try again in a second
-   * pass.  The second pass is top-down.
-   *
-   */
-
-  static void
-  cf2_hintmap_adjustHints( CF2_HintMap  hintmap )
-  {
-    size_t  i, j;
-
-
-    cf2_arrstack_clear( hintmap->hintMoves );      /* working storage */
-
-    /*
-     * First pass is bottom-up (font hint order) without look-ahead.
-     * Locked edges are already adjusted.
-     * Unlocked edges begin with dsCoord from `initialHintMap'.
-     * Save edges that are not optimally adjusted in `hintMoves' array,
-     * and process them in second pass.
-     */
-
-    for ( i = 0; i < hintmap->count; i++ )
-    {
-      FT_Bool  isPair = cf2_hint_isPair( &hintmap->edge[i] );
-
-
-      /* index of upper edge (same value for ghost hint) */
-      j = isPair ? i + 1 : i;
-
-      FT_ASSERT( j < hintmap->count );
-      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) );
-      FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) );
-      FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) ==
-                   cf2_hint_isLocked( &hintmap->edge[j] ) );
-
-      if ( !cf2_hint_isLocked( &hintmap->edge[i] ) )
-      {
-        /* hint edge is not locked, we can adjust it */
-        CF2_Fixed  fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord );
-        CF2_Fixed  fracUp   = cf2_fixedFraction( hintmap->edge[j].dsCoord );
-
-        /* calculate all four possibilities; moves down are negative */
-        CF2_Fixed  downMoveDown = 0 - fracDown;
-        CF2_Fixed  upMoveDown   = 0 - fracUp;
-        CF2_Fixed  downMoveUp   = ( fracDown == 0 )
-                                    ? 0
-                                    : cf2_intToFixed( 1 ) - fracDown;
-        CF2_Fixed  upMoveUp     = ( fracUp == 0 )
-                                    ? 0
-                                    : cf2_intToFixed( 1 ) - fracUp;
-
-        /* smallest move up */
-        CF2_Fixed  moveUp   = FT_MIN( downMoveUp, upMoveUp );
-        /* smallest move down */
-        CF2_Fixed  moveDown = FT_MAX( downMoveDown, upMoveDown );
-
-        /* final amount to move edge or edge pair */
-        CF2_Fixed  move;
-
-        CF2_Fixed  downMinCounter = CF2_MIN_COUNTER;
-        CF2_Fixed  upMinCounter   = CF2_MIN_COUNTER;
-        FT_Bool    saveEdge       = FALSE;
-
-
-        /* minimum counter constraint doesn't apply when adjacent edges */
-        /* are synthetic                                                */
-        /* TODO: doesn't seem a big effect; for now, reduce the code    */
-#if 0
-        if ( i == 0                                        ||
-             cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) )
-          downMinCounter = 0;
-
-        if ( j >= hintmap->count - 1                       ||
-             cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) )
-          upMinCounter = 0;
-#endif
-
-        /* 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                            ||
-             hintmap->edge[j + 1].dsCoord >=
-               hintmap->edge[j].dsCoord + moveUp + upMinCounter )
-        {
-          /* there is room to move up; is there also room to move down? */
-          if ( i == 0                                                 ||
-               hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
-          {
-            /* move smaller absolute amount */
-            move = ( -moveDown < moveUp ) ? moveDown : moveUp;  /* optimum */
-          }
-          else
-            move = moveUp;
-        }
-        else
-        {
-          /* is there room to move down? */
-          if ( i == 0                                                 ||
-               hintmap->edge[i - 1].dsCoord <=
-                 hintmap->edge[i].dsCoord + moveDown - downMinCounter )
-          {
-            move     = moveDown;
-            /* true if non-optimum move */
-            saveEdge = (FT_Bool)( moveUp < -moveDown );
-          }
-          else
-          {
-            /* no room to move either way without overlapping or reducing */
-            /* the counter too much                                       */
-            move     = 0;
-            saveEdge = TRUE;
-          }
-        }
-
-        /* Identify non-moves and moves down that aren't optimal, and save */
-        /* them for second pass.                                           */
-        /* Do this only if there is an unlocked edge above (which could    */
-        /* possibly move).                                                 */
-        if ( saveEdge                                    &&
-             j < hintmap->count - 1                      &&
-             !cf2_hint_isLocked( &hintmap->edge[j + 1] ) )
-        {
-          CF2_HintMoveRec  savedMove;
-
-
-          savedMove.j      = j;
-          /* desired adjustment in second pass */
-          savedMove.moveUp = moveUp - move;
-
-          cf2_arrstack_push( hintmap->hintMoves, &savedMove );
-        }
-
-        /* move the edge(s) */
-        hintmap->edge[i].dsCoord += move;
-        if ( isPair )
-          hintmap->edge[j].dsCoord += move;
-      }
-
-      /* assert there are no overlaps in device space */
-      FT_ASSERT( i == 0                                                   ||
-                 hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord );
-      FT_ASSERT( i < j                                                ||
-                 hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord );
-
-      /* adjust the scales, avoiding divide by zero */
-      if ( i > 0 )
-      {
-        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 );
-      }
-
-      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 );
-
-        i += 1;     /* skip upper edge on next loop */
-      }
-    }
-
-    /* second pass tries to move non-optimal hints up, in case there is */
-    /* room now                                                         */
-    for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- )
-    {
-      CF2_HintMove  hintMove = (CF2_HintMove)
-                      cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 );
-
-
-      j = hintMove->j;
-
-      /* this was tested before the push, above */
-      FT_ASSERT( j < hintmap->count - 1 );
-
-      /* is there room to move up? */
-      if ( hintmap->edge[j + 1].dsCoord >=
-             hintmap->edge[j].dsCoord + hintMove->moveUp + CF2_MIN_COUNTER )
-      {
-        /* there is more room now, move edge up */
-        hintmap->edge[j].dsCoord += hintMove->moveUp;
-
-        if ( cf2_hint_isPair( &hintmap->edge[j] ) )
-        {
-          FT_ASSERT( j > 0 );
-          hintmap->edge[j - 1].dsCoord += hintMove->moveUp;
-        }
-      }
-    }
-  }
-
-
-  /* insert hint edges into map, sorted by csCoord */
-  static void
-  cf2_hintmap_insertHint( CF2_HintMap  hintmap,
-                          CF2_Hint     bottomHintEdge,
-                          CF2_Hint     topHintEdge )
-  {
-    CF2_UInt  indexInsert;
-
-    /* set default values, then check for edge hints */
-    FT_Bool   isPair         = TRUE;
-    CF2_Hint  firstHintEdge  = bottomHintEdge;
-    CF2_Hint  secondHintEdge = topHintEdge;
-
-
-    /* one or none of the input params may be invalid when dealing with */
-    /* edge hints; at least one edge must be valid                      */
-    FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) ||
-               cf2_hint_isValid( topHintEdge )    );
-
-    /* determine how many and which edges to insert */
-    if ( !cf2_hint_isValid( bottomHintEdge ) )
-    {
-      /* insert only the top edge */
-      firstHintEdge = topHintEdge;
-      isPair        = FALSE;
-    }
-    else if ( !cf2_hint_isValid( topHintEdge ) )
-    {
-      /* insert only the bottom edge */
-      isPair = FALSE;
-    }
-
-    /* paired edges must be in proper order */
-    if ( isPair                                         &&
-         topHintEdge->csCoord < bottomHintEdge->csCoord )
-      return;
-
-    /* linear search to find index value of insertion point */
-    indexInsert = 0;
-    for ( ; indexInsert < hintmap->count; indexInsert++ )
-    {
-      if ( hintmap->edge[indexInsert].csCoord >= firstHintEdge->csCoord )
-        break;
-    }
-
-    /*
-     * Discard any hints that overlap in character space.  Most often, this
-     * is while building the initial map, where captured hints from all
-     * zones are combined.  Define overlap to include hints that `touch'
-     * (overlap zero).  Hiragino Sans/Gothic fonts have numerous hints that
-     * touch.  Some fonts have non-ideographic glyphs that overlap our
-     * synthetic hints.
-     *
-     * Overlap also occurs when darkening stem hints that are close.
-     *
-     */
-    if ( indexInsert < hintmap->count )
-    {
-      /* we are inserting before an existing edge:    */
-      /* verify that an existing edge is not the same */
-      if ( hintmap->edge[indexInsert].csCoord == firstHintEdge->csCoord )
-        return; /* ignore overlapping stem hint */
-
-      /* verify that a new pair does not straddle the next edge */
-      if ( isPair                                                        &&
-           hintmap->edge[indexInsert].csCoord <= secondHintEdge->csCoord )
-        return; /* ignore overlapping stem hint */
-
-      /* verify that we are not inserting between paired edges */
-      if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) )
-        return; /* ignore overlapping stem hint */
-    }
-
-    /* recompute device space locations using initial hint map */
-    if ( cf2_hintmap_isValid( hintmap->initialHintMap ) &&
-         !cf2_hint_isLocked( firstHintEdge )            )
-    {
-      if ( isPair )
-      {
-        /* 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 );
-
-
-        firstHintEdge->dsCoord  = midpoint - halfWidth;
-        secondHintEdge->dsCoord = midpoint + halfWidth;
-      }
-      else
-        firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap,
-                                                  firstHintEdge->csCoord );
-    }
-
-    /*
-     * Discard any hints that overlap in device space; this can occur
-     * because locked hints have been moved to align with blue zones.
-     *
-     * TODO: Although we might correct this later during adjustment, we
-     * don't currently have a way to delete a conflicting hint once it has
-     * been inserted.  See v2.030 MinionPro-Regular, 12 ppem darkened,
-     * initial hint map for second path, glyph 945 (the perispomeni (tilde)
-     * in U+1F6E, Greek omega with psili and perispomeni).  Darkening is
-     * 25.  Pair 667,747 initially conflicts in design space with top edge
-     * 660.  This is because 667 maps to 7.87, and the top edge was
-     * captured by a zone at 8.0.  The pair is later successfully inserted
-     * in a zone without the top edge.  In this zone it is adjusted to 8.0,
-     * and no longer conflicts with the top edge in design space.  This
-     * means it can be included in yet a later zone which does have the top
-     * edge hint.  This produces a small mismatch between the first and
-     * last points of this path, even though the hint masks are the same.
-     * The density map difference is tiny (1/256).
-     *
-     */
-
-    if ( indexInsert > 0 )
-    {
-      /* we are inserting after an existing edge */
-      if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord )
-        return;
-    }
-
-    if ( indexInsert < hintmap->count )
-    {
-      /* we are inserting before an existing edge */
-      if ( isPair )
-      {
-        if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
-          return;
-      }
-      else
-      {
-        if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord )
-          return;
-      }
-    }
-
-    /* make room to insert */
-    {
-      CF2_UInt  iSrc = hintmap->count - 1;
-      CF2_UInt  iDst = isPair ? hintmap->count + 1 : hintmap->count;
-
-      CF2_UInt  count = hintmap->count - indexInsert;
-
-
-      if ( iDst >= CF2_MAX_HINT_EDGES )
-      {
-        FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" ));
-        return;
-      }
-
-      while ( count-- )
-        hintmap->edge[iDst--] = hintmap->edge[iSrc--];
-
-      /* insert first edge */
-      hintmap->edge[indexInsert] = *firstHintEdge;         /* copy struct */
-      hintmap->count += 1;
-
-      if ( isPair )
-      {
-        /* insert second edge */
-        hintmap->edge[indexInsert + 1] = *secondHintEdge;  /* copy struct */
-        hintmap->count                += 1;
-      }
-    }
-
-    return;
-  }
-
-
-  /*
-   * Build a map from hints and mask.
-   *
-   * This function may recur one level if `hintmap->initialHintMap' is not yet
-   * valid.
-   * If `initialMap' is true, simply build initial map.
-   *
-   * Synthetic hints are used in two ways.  A hint at zero is inserted, if
-   * needed, in the initial hint map, to prevent translations from
-   * propagating across the origin.  If synthetic em box hints are enabled
-   * for ideographic dictionaries, then they are inserted in all hint
-   * maps, including the initial one.
-   *
-   */
-  FT_LOCAL_DEF( void )
-  cf2_hintmap_build( CF2_HintMap   hintmap,
-                     CF2_ArrStack  hStemHintArray,
-                     CF2_ArrStack  vStemHintArray,
-                     CF2_HintMask  hintMask,
-                     CF2_Fixed     hintOrigin,
-                     FT_Bool       initialMap )
-  {
-    FT_Byte*  maskPtr;
-
-    CF2_Font         font = hintmap->font;
-    CF2_HintMaskRec  tempHintMask;
-
-    size_t   bitCount, i;
-    FT_Byte  maskByte;
-
-
-    /* check whether initial map is constructed */
-    if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) )
-    {
-      /* make recursive call with initialHintMap and temporary mask; */
-      /* temporary mask will get all bits set, below */
-      cf2_hintmask_init( &tempHintMask, hintMask->error );
-      cf2_hintmap_build( hintmap->initialHintMap,
-                         hStemHintArray,
-                         vStemHintArray,
-                         &tempHintMask,
-                         hintOrigin,
-                         TRUE );
-    }
-
-    if ( !cf2_hintmask_isValid( hintMask ) )
-    {
-      /* without a hint mask, assume all hints are active */
-      cf2_hintmask_setAll( hintMask,
-                           cf2_arrstack_size( hStemHintArray ) +
-                             cf2_arrstack_size( vStemHintArray ) );
-      if ( !cf2_hintmask_isValid( hintMask ) )
-          return;                   /* too many stem hints */
-    }
-
-    /* begin by clearing the map */
-    hintmap->count     = 0;
-    hintmap->lastIndex = 0;
-
-    /* make a copy of the hint mask so we can modify it */
-    tempHintMask = *hintMask;
-    maskPtr      = cf2_hintmask_getMaskPtr( &tempHintMask );
-
-    /* use the hStem hints only, which are first in the mask */
-    bitCount = cf2_arrstack_size( hStemHintArray );
-
-    /* Defense-in-depth.  Should never return here. */
-    if ( bitCount > hintMask->bitCount )
-        return;
-
-    /* synthetic embox hints get highest priority */
-    if ( font->blues.doEmBoxHints )
-    {
-      CF2_HintRec  dummy;
-
-
-      cf2_hint_initZero( &dummy );   /* invalid hint map element */
-
-      /* ghost bottom */
-      cf2_hintmap_insertHint( hintmap,
-                              &font->blues.emBoxBottomEdge,
-                              &dummy );
-      /* ghost top */
-      cf2_hintmap_insertHint( hintmap,
-                              &dummy,
-                              &font->blues.emBoxTopEdge );
-    }
-
-    /* insert hints captured by a blue zone or already locked (higher */
-    /* priority)                                                      */
-    for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
-    {
-      if ( maskByte & *maskPtr )
-      {
-        /* expand StemHint into two `CF2_Hint' elements */
-        CF2_HintRec  bottomHintEdge, topHintEdge;
-
-
-        cf2_hint_init( &bottomHintEdge,
-                       hStemHintArray,
-                       i,
-                       font,
-                       hintOrigin,
-                       hintmap->scale,
-                       TRUE /* bottom */ );
-        cf2_hint_init( &topHintEdge,
-                       hStemHintArray,
-                       i,
-                       font,
-                       hintOrigin,
-                       hintmap->scale,
-                       FALSE /* top */ );
-
-        if ( cf2_hint_isLocked( &bottomHintEdge ) ||
-             cf2_hint_isLocked( &topHintEdge )    ||
-             cf2_blues_capture( &font->blues,
-                                &bottomHintEdge,
-                                &topHintEdge )   )
-        {
-          /* insert captured hint into map */
-          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
-
-          *maskPtr &= ~maskByte;      /* turn off the bit for this hint */
-        }
-      }
-
-      if ( ( i & 7 ) == 7 )
-      {
-        /* move to next mask byte */
-        maskPtr++;
-        maskByte = 0x80;
-      }
-      else
-        maskByte >>= 1;
-    }
-
-    /* initial hint map includes only captured hints plus maybe one at 0 */
-
-    /*
-     * TODO: There is a problem here because we are trying to build a
-     *       single hint map containing all captured hints.  It is
-     *       possible for there to be conflicts between captured hints,
-     *       either because of darkening or because the hints are in
-     *       separate hint zones (we are ignoring hint zones for the
-     *       initial map).  An example of the latter is MinionPro-Regular
-     *       v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem.
-     *       A stem hint for the psili conflicts with the top edge hint
-     *       for the base character.  The stem hint gets priority because
-     *       of its sort order.  In glyph 884 (Greek Capital Alpha with
-     *       Psili and Oxia), the top of the base character gets a stem
-     *       hint, and the psili does not.  This creates different initial
-     *       maps for the two glyphs resulting in different renderings of
-     *       the base character.  Will probably defer this either as not
-     *       worth the cost or as a font bug.  I don't think there is any
-     *       good reason for an accent to be captured by an alignment
-     *       zone.  -darnold 2/12/10
-     */
-
-    if ( initialMap )
-    {
-      /* Apply a heuristic that inserts a point for (0,0), unless it's     */
-      /* already covered by a mapping.  This locks the baseline for glyphs */
-      /* that have no baseline hints.                                      */
-
-      if ( hintmap->count == 0                           ||
-           hintmap->edge[0].csCoord > 0                  ||
-           hintmap->edge[hintmap->count - 1].csCoord < 0 )
-      {
-        /* all edges are above 0 or all edges are below 0; */
-        /* construct a locked edge hint at 0               */
-
-        CF2_HintRec  edge, invalid;
-
-
-        cf2_hint_initZero( &edge );
-
-        edge.flags = CF2_GhostBottom |
-                     CF2_Locked      |
-                     CF2_Synthetic;
-        edge.scale = hintmap->scale;
-
-        cf2_hint_initZero( &invalid );
-        cf2_hintmap_insertHint( hintmap, &edge, &invalid );
-      }
-    }
-    else
-    {
-      /* insert remaining hints */
-
-      maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask );
-
-      for ( i = 0, maskByte = 0x80; i < bitCount; i++ )
-      {
-        if ( maskByte & *maskPtr )
-        {
-          CF2_HintRec  bottomHintEdge, topHintEdge;
-
-
-          cf2_hint_init( &bottomHintEdge,
-                         hStemHintArray,
-                         i,
-                         font,
-                         hintOrigin,
-                         hintmap->scale,
-                         TRUE /* bottom */ );
-          cf2_hint_init( &topHintEdge,
-                         hStemHintArray,
-                         i,
-                         font,
-                         hintOrigin,
-                         hintmap->scale,
-                         FALSE /* top */ );
-
-          cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge );
-        }
-
-        if ( ( i & 7 ) == 7 )
-        {
-          /* move to next mask byte */
-          maskPtr++;
-          maskByte = 0x80;
-        }
-        else
-          maskByte >>= 1;
-      }
-    }
-
-    /*
-     * Note: The following line is a convenient place to break when
-     *       debugging hinting.  Examine `hintmap->edge' for the list of
-     *       enabled hints, then step over the call to see the effect of
-     *       adjustment.  We stop here first on the recursive call that
-     *       creates the initial map, and then on each counter group and
-     *       hint zone.
-     */
-
-    /* adjust positions of hint edges that are not locked to blue zones */
-    cf2_hintmap_adjustHints( 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 )
-    {
-      for ( i = 0; i < hintmap->count; i++ )
-      {
-        if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) )
-        {
-          /* Note: include both valid and invalid edges            */
-          /* Note: top and bottom edges are copied back separately */
-          CF2_StemHint  stemhint = (CF2_StemHint)
-                          cf2_arrstack_getPointer( hStemHintArray,
-                                                   hintmap->edge[i].index );
-
-
-          if ( cf2_hint_isTop( &hintmap->edge[i] ) )
-            stemhint->maxDS = hintmap->edge[i].dsCoord;
-          else
-            stemhint->minDS = hintmap->edge[i].dsCoord;
-
-          stemhint->used = TRUE;
-        }
-      }
-    }
-
-    /* hint map is ready to use */
-    hintmap->isValid = TRUE;
-
-    /* remember this mask has been used */
-    cf2_hintmask_setNew( hintMask, FALSE );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,
-                      CF2_Font              font,
-                      CF2_OutlineCallbacks  callbacks,
-                      CF2_Fixed             scaleY,
-                      /* CF2_Fixed  hShift, */
-                      CF2_ArrStack          hStemHintArray,
-                      CF2_ArrStack          vStemHintArray,
-                      CF2_HintMask          hintMask,
-                      CF2_Fixed             hintOriginY,
-                      const CF2_Blues       blues,
-                      const FT_Vector*      fractionalTranslation )
-  {
-    FT_ZERO( glyphpath );
-
-    glyphpath->font      = font;
-    glyphpath->callbacks = callbacks;
-
-    cf2_arrstack_init( &glyphpath->hintMoves,
-                       font->memory,
-                       &font->error,
-                       sizeof ( CF2_HintMoveRec ) );
-
-    cf2_hintmap_init( &glyphpath->initialHintMap,
-                      font,
-                      &glyphpath->initialHintMap,
-                      &glyphpath->hintMoves,
-                      scaleY );
-    cf2_hintmap_init( &glyphpath->firstHintMap,
-                      font,
-                      &glyphpath->initialHintMap,
-                      &glyphpath->hintMoves,
-                      scaleY );
-    cf2_hintmap_init( &glyphpath->hintMap,
-                      font,
-                      &glyphpath->initialHintMap,
-                      &glyphpath->hintMoves,
-                      scaleY );
-
-    glyphpath->scaleX = font->innerTransform.a;
-    glyphpath->scaleC = font->innerTransform.c;
-    glyphpath->scaleY = font->innerTransform.d;
-
-    glyphpath->fractionalTranslation = *fractionalTranslation;
-
-#if 0
-    glyphpath->hShift = hShift;       /* for fauxing */
-#endif
-
-    glyphpath->hStemHintArray = hStemHintArray;
-    glyphpath->vStemHintArray = vStemHintArray;
-    glyphpath->hintMask       = hintMask;      /* ptr to current mask */
-    glyphpath->hintOriginY    = hintOriginY;
-    glyphpath->blues          = blues;
-    glyphpath->darken         = font->darkened; /* TODO: should we make copies? */
-    glyphpath->xOffset        = font->darkenX;
-    glyphpath->yOffset        = font->darkenY;
-    glyphpath->miterLimit     = 2 * FT_MAX(
-                                     cf2_fixedAbs( glyphpath->xOffset ),
-                                     cf2_fixedAbs( glyphpath->yOffset ) );
-
-    /* .1 character space unit */
-    glyphpath->snapThreshold = cf2_floatToFixed( 0.1f );
-
-    glyphpath->moveIsPending = TRUE;
-    glyphpath->pathIsOpen    = FALSE;
-    glyphpath->pathIsClosing = FALSE;
-    glyphpath->elemIsQueued  = FALSE;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath )
-  {
-    cf2_arrstack_finalize( &glyphpath->hintMoves );
-  }
-
-
-  /*
-   * Hint point in y-direction and apply outerTransform.
-   * Input `current' hint map (which is actually delayed by one element).
-   * Input x,y point in Character Space.
-   * Output x,y point in Device Space, including translation.
-   */
-  static void
-  cf2_glyphpath_hintPoint( CF2_GlyphPath  glyphpath,
-                           CF2_HintMap    hintmap,
-                           FT_Vector*     ppt,
-                           CF2_Fixed      x,
-                           CF2_Fixed      y )
-  {
-    FT_Vector  pt;   /* hinted point in upright DS */
-
-
-    pt.x = 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;
-  }
-
-
-  /*
-   * From two line segments, (u1,u2) and (v1,v2), compute a point of
-   * intersection on the corresponding lines.
-   * Return false if no intersection is found, or if the intersection is
-   * too far away from the ends of the line segments, u2 and v1.
-   *
-   */
-  static FT_Bool
-  cf2_glyphpath_computeIntersection( CF2_GlyphPath     glyphpath,
-                                     const FT_Vector*  u1,
-                                     const FT_Vector*  u2,
-                                     const FT_Vector*  v1,
-                                     const FT_Vector*  v2,
-                                     FT_Vector*        intersection )
-  {
-    /*
-     * Let `u' be a zero-based vector from the first segment, `v' from the
-     * 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.
-     * `s' is the parameter for the parametric line for the first segment
-     * (`u').
-     *
-     * See notation in
-     * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm.
-     * Calculations are done in 16.16, but must handle the squaring of
-     * line lengths in character space.  We scale all vectors by 1/32 to
-     * avoid overflow.  This allows values up to 4095 to be squared.  The
-     * scale factor cancels in the divide.
-     *
-     * TODO: the scale factor could be computed from UnitsPerEm.
-     *
-     */
-
-#define cf2_perp( a, b )                                    \
-          ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) )
-
-  /* round and divide by 32 */
-#define CF2_CS_SCALE( x )         \
-          ( ( (x) + 0x10 ) >> 5 )
-
-    FT_Vector  u, v, w;      /* scaled vectors */
-    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 );
-
-    denominator = cf2_perp( u, v );
-
-    if ( denominator == 0 )
-      return FALSE;           /* parallel or coincident lines */
-
-    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 );
-
-    /*
-     * Special case snapping for horizontal and vertical lines.
-     * This cleans up intersections and reduces problems with winding
-     * order detection.
-     * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685.
-     * Note: these calculations are in character space.
-     *
-     */
-
-    if ( u1->x == u2->x                                                     &&
-         cf2_fixedAbs( intersection->x - u1->x ) < glyphpath->snapThreshold )
-      intersection->x = u1->x;
-    if ( u1->y == u2->y                                                     &&
-         cf2_fixedAbs( intersection->y - u1->y ) < glyphpath->snapThreshold )
-      intersection->y = u1->y;
-
-    if ( v1->x == v2->x                                                     &&
-         cf2_fixedAbs( intersection->x - v1->x ) < glyphpath->snapThreshold )
-      intersection->x = v1->x;
-    if ( v1->y == v2->y                                                     &&
-         cf2_fixedAbs( 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                                   )
-      return FALSE;
-
-    return TRUE;
-  }
-
-
-  /*
-   * Push the cached element (glyphpath->prevElem*) to the outline
-   * consumer.  When a darkening offset is used, the end point of the
-   * cached element may be adjusted to an intersection point or we may
-   * synthesize a connecting line to the current element.  If we are
-   * closing a subpath, we may also generate a connecting line to the start
-   * point.
-   *
-   * This is where Character Space (CS) is converted to Device Space (DS)
-   * using a hint map.  This calculation must use a HintMap that was valid
-   * at the time the element was saved.  For the first point in a subpath,
-   * that is a saved HintMap.  For most elements, it just means the caller
-   * has delayed building a HintMap from the current HintMask.
-   *
-   * Transform each point with outerTransform and call the outline
-   * callbacks.  This is a general 3x3 transform:
-   *
-   *   x' = a*x + c*y + tx, y' = b*x + d*y + ty
-   *
-   * but it uses 4 elements from CF2_Font and the translation part
-   * from CF2_GlyphPath.
-   *
-   */
-  static void
-  cf2_glyphpath_pushPrevElem( CF2_GlyphPath  glyphpath,
-                              CF2_HintMap    hintmap,
-                              FT_Vector*     nextP0,
-                              FT_Vector      nextP1,
-                              FT_Bool        close )
-  {
-    CF2_CallbackParamsRec  params;
-
-    FT_Vector*  prevP0;
-    FT_Vector*  prevP1;
-
-    FT_Vector  intersection    = { 0, 0 };
-    FT_Bool    useIntersection = FALSE;
-
-
-    FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo ||
-               glyphpath->prevElemOp == CF2_PathOpCubeTo );
-
-    if ( glyphpath->prevElemOp == CF2_PathOpLineTo )
-    {
-      prevP0 = &glyphpath->prevElemP0;
-      prevP1 = &glyphpath->prevElemP1;
-    }
-    else
-    {
-      prevP0 = &glyphpath->prevElemP2;
-      prevP1 = &glyphpath->prevElemP3;
-    }
-
-    /* optimization: if previous and next elements are offset by the same */
-    /* amount, then there will be no gap, and no need to compute an       */
-    /* intersection.                                                      */
-    if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y )
-    {
-      /* previous element does not join next element:             */
-      /* adjust end point of previous element to the intersection */
-      useIntersection = cf2_glyphpath_computeIntersection( glyphpath,
-                                                           prevP0,
-                                                           prevP1,
-                                                           nextP0,
-                                                           &nextP1,
-                                                           &intersection );
-      if ( useIntersection )
-      {
-        /* modify the last point of the cached element (either line or */
-        /* curve)                                                      */
-        *prevP1 = intersection;
-      }
-    }
-
-    params.pt0 = glyphpath->currentDS;
-
-    switch( glyphpath->prevElemOp )
-    {
-    case CF2_PathOpLineTo:
-      params.op = CF2_PathOpLineTo;
-
-      /* note: pt2 and pt3 are unused */
-
-      if ( close )
-      {
-        /* use first hint map if closing */
-        cf2_glyphpath_hintPoint( glyphpath,
-                                 &glyphpath->firstHintMap,
-                                 &params.pt1,
-                                 glyphpath->prevElemP1.x,
-                                 glyphpath->prevElemP1.y );
-      }
-      else
-      {
-        cf2_glyphpath_hintPoint( glyphpath,
-                                 hintmap,
-                                 &params.pt1,
-                                 glyphpath->prevElemP1.x,
-                                 glyphpath->prevElemP1.y );
-      }
-
-      /* output only non-zero length lines */
-      if ( params.pt0.x != params.pt1.x || params.pt0.y != params.pt1.y )
-      {
-        glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
-
-        glyphpath->currentDS = params.pt1;
-      }
-      break;
-
-    case CF2_PathOpCubeTo:
-      params.op = CF2_PathOpCubeTo;
-
-      /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */
-      cf2_glyphpath_hintPoint( glyphpath,
-                               hintmap,
-                               &params.pt1,
-                               glyphpath->prevElemP1.x,
-                               glyphpath->prevElemP1.y );
-      cf2_glyphpath_hintPoint( glyphpath,
-                               hintmap,
-                               &params.pt2,
-                               glyphpath->prevElemP2.x,
-                               glyphpath->prevElemP2.y );
-      cf2_glyphpath_hintPoint( glyphpath,
-                               hintmap,
-                               &params.pt3,
-                               glyphpath->prevElemP3.x,
-                               glyphpath->prevElemP3.y );
-
-      glyphpath->callbacks->cubeTo( glyphpath->callbacks, &params );
-
-      glyphpath->currentDS = params.pt3;
-
-      break;
-    }
-
-    if ( !useIntersection || close )
-    {
-      /* insert connecting line between end of previous element and start */
-      /* of current one                                                   */
-      /* note: at the end of a subpath, we might do both, so use `nextP0' */
-      /* before we change it, below                                       */
-
-      if ( close )
-      {
-        /* if we are closing the subpath, then nextP0 is in the first     */
-        /* hint zone                                                      */
-        cf2_glyphpath_hintPoint( glyphpath,
-                                 &glyphpath->firstHintMap,
-                                 &params.pt1,
-                                 nextP0->x,
-                                 nextP0->y );
-      }
-      else
-      {
-        cf2_glyphpath_hintPoint( glyphpath,
-                                 hintmap,
-                                 &params.pt1,
-                                 nextP0->x,
-                                 nextP0->y );
-      }
-
-      if ( params.pt1.x != glyphpath->currentDS.x ||
-           params.pt1.y != glyphpath->currentDS.y )
-      {
-        /* length is nonzero */
-        params.op  = CF2_PathOpLineTo;
-        params.pt0 = glyphpath->currentDS;
-
-        /* note: pt2 and pt3 are unused */
-        glyphpath->callbacks->lineTo( glyphpath->callbacks, &params );
-
-        glyphpath->currentDS = params.pt1;
-      }
-    }
-
-    if ( useIntersection )
-    {
-      /* return intersection point to caller */
-      *nextP0 = intersection;
-    }
-  }
-
-
-  /* push a MoveTo element based on current point and offset of current */
-  /* element                                                            */
-  static void
-  cf2_glyphpath_pushMove( CF2_GlyphPath  glyphpath,
-                          FT_Vector      start )
-  {
-    CF2_CallbackParamsRec  params;
-
-
-    params.op  = CF2_PathOpMoveTo;
-    params.pt0 = glyphpath->currentDS;
-
-    /* Test if move has really happened yet; it would have called */
-    /* `cf2_hintmap_build' to set `isValid'.                   */
-    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) )
-    {
-      /* we are here iff first subpath is missing a moveto operator: */
-      /* synthesize first moveTo to finish initialization of hintMap */
-      cf2_glyphpath_moveTo( glyphpath,
-                            glyphpath->start.x,
-                            glyphpath->start.y );
-    }
-
-    cf2_glyphpath_hintPoint( glyphpath,
-                             &glyphpath->hintMap,
-                             &params.pt1,
-                             start.x,
-                             start.y );
-
-    /* note: pt2 and pt3 are unused */
-    glyphpath->callbacks->moveTo( glyphpath->callbacks, &params );
-
-    glyphpath->currentDS    = params.pt1;
-    glyphpath->offsetStart0 = start;
-  }
-
-
-  /*
-   * All coordinates are in character space.
-   * On input, (x1, y1) and (x2, y2) give line segment.
-   * On output, (x, y) give offset vector.
-   * We use a piecewise approximation to trig functions.
-   *
-   * TODO: Offset true perpendicular and proper length
-   *       supply the y-translation for hinting here, too,
-   *       that adds yOffset unconditionally to *y.
-   */
-  static void
-  cf2_glyphpath_computeOffset( CF2_GlyphPath  glyphpath,
-                               CF2_Fixed      x1,
-                               CF2_Fixed      y1,
-                               CF2_Fixed      x2,
-                               CF2_Fixed      y2,
-                               CF2_Fixed*     x,
-                               CF2_Fixed*     y )
-  {
-    CF2_Fixed  dx = x2 - x1;
-    CF2_Fixed  dy = y2 - y1;
-
-
-    /* note: negative offsets don't work here; negate deltas to change */
-    /* quadrants, below                                                */
-    if ( glyphpath->font->reverseWinding )
-    {
-      dx = -dx;
-      dy = -dy;
-    }
-
-    *x = *y = 0;
-
-    if ( !glyphpath->darken )
-        return;
-
-    /* add momentum for this path element */
-    glyphpath->callbacks->windingMomentum +=
-      cf2_getWindingMomentum( x1, y1, x2, y2 );
-
-    /* note: allow mixed integer and fixed multiplication here */
-    if ( dx >= 0 )
-    {
-      if ( dy >= 0 )
-      {
-        /* first quadrant, +x +y */
-
-        if ( dx > 2 * dy )
-        {
-          /* +x */
-          *x = 0;
-          *y = 0;
-        }
-        else if ( dy > 2 * dx )
-        {
-          /* +y */
-          *x = glyphpath->xOffset;
-          *y = glyphpath->yOffset;
-        }
-        else
-        {
-          /* +x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
-                          glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
-                          glyphpath->yOffset );
-        }
-      }
-      else
-      {
-        /* fourth quadrant, +x -y */
-
-        if ( dx > -2 * dy )
-        {
-          /* +x */
-          *x = 0;
-          *y = 0;
-        }
-        else if ( -dy > 2 * dx )
-        {
-          /* -y */
-          *x = -glyphpath->xOffset;
-          *y = glyphpath->yOffset;
-        }
-        else
-        {
-          /* +x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
-                          glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 - 0.7 ),
-                          glyphpath->yOffset );
-        }
-      }
-    }
-    else
-    {
-      if ( dy >= 0 )
-      {
-        /* second quadrant, -x +y */
-
-        if ( -dx > 2 * dy )
-        {
-          /* -x */
-          *x = 0;
-          *y = 2 * glyphpath->yOffset;
-        }
-        else if ( dy > -2 * dx )
-        {
-          /* +y */
-          *x = glyphpath->xOffset;
-          *y = glyphpath->yOffset;
-        }
-        else
-        {
-          /* -x +y */
-          *x = FT_MulFix( cf2_floatToFixed( 0.7 ),
-                          glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
-                          glyphpath->yOffset );
-        }
-      }
-      else
-      {
-        /* third quadrant, -x -y */
-
-        if ( -dx > -2 * dy )
-        {
-          /* -x */
-          *x = 0;
-          *y = 2 * glyphpath->yOffset;
-        }
-        else if ( -dy > -2 * dx )
-        {
-          /* -y */
-          *x = -glyphpath->xOffset;
-          *y = glyphpath->yOffset;
-        }
-        else
-        {
-          /* -x -y */
-          *x = FT_MulFix( cf2_floatToFixed( -0.7 ),
-                          glyphpath->xOffset );
-          *y = FT_MulFix( cf2_floatToFixed( 1.0 + 0.7 ),
-                          glyphpath->yOffset );
-        }
-      }
-    }
-  }
-
-
-  /*
-   * The functions cf2_glyphpath_{moveTo,lineTo,curveTo,closeOpenPath} are
-   * called by the interpreter with Character Space (CS) coordinates.  Each
-   * path element is placed into a queue of length one to await the
-   * calculation of the following element.  At that time, the darkening
-   * offset of the following element is known and joins can be computed,
-   * including possible modification of this element, before mapping to
-   * Device Space (DS) and passing it on to the outline consumer.
-   *
-   */
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,
-                        CF2_Fixed      x,
-                        CF2_Fixed      y )
-  {
-    cf2_glyphpath_closeOpenPath( glyphpath );
-
-    /* save the parameters of the move for later, when we'll know how to */
-    /* offset it;                                                        */
-    /* also save last move point */
-    glyphpath->currentCS.x = glyphpath->start.x = x;
-    glyphpath->currentCS.y = glyphpath->start.y = y;
-
-    glyphpath->moveIsPending = TRUE;
-
-    /* ensure we have a valid map with current mask */
-    if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ||
-         cf2_hintmask_isNew( glyphpath->hintMask )   )
-      cf2_hintmap_build( &glyphpath->hintMap,
-                         glyphpath->hStemHintArray,
-                         glyphpath->vStemHintArray,
-                         glyphpath->hintMask,
-                         glyphpath->hintOriginY,
-                         FALSE );
-
-    /* save a copy of current HintMap to use when drawing initial point */
-    glyphpath->firstHintMap = glyphpath->hintMap;     /* structure copy */
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,
-                        CF2_Fixed      x,
-                        CF2_Fixed      y )
-  {
-    CF2_Fixed  xOffset, yOffset;
-    FT_Vector  P0, P1;
-    FT_Bool    newHintMap;
-
-    /*
-     * New hints will be applied after cf2_glyphpath_pushPrevElem has run.
-     * In case this is a synthesized closing line, any new hints should be
-     * delayed until this path is closed (`cf2_hintmask_isNew' will be
-     * called again before the next line or curve).
-     */
-
-    /* true if new hint map not on close */
-    newHintMap = cf2_hintmask_isNew( glyphpath->hintMask ) &&
-                 !glyphpath->pathIsClosing;
-
-    /*
-     * Zero-length lines may occur in the charstring.  Because we cannot
-     * compute darkening offsets or intersections from zero-length lines,
-     * it is best to remove them and avoid artifacts.  However, zero-length
-     * lines in CS at the start of a new hint map can generate non-zero
-     * lines in DS due to hint substitution.  We detect a change in hint
-     * map here and pass those zero-length lines along.
-     */
-
-    /*
-     * Note: Find explicitly closed paths here with a conditional
-     *       breakpoint using
-     *
-     *         !gp->pathIsClosing && gp->start.x == x && gp->start.y == y
-     *
-     */
-
-    if ( glyphpath->currentCS.x == x &&
-         glyphpath->currentCS.y == y &&
-         !newHintMap                 )
-      /*
-       * Ignore zero-length lines in CS where the hint map is the same
-       * because the line in DS will also be zero length.
-       *
-       * Ignore zero-length lines when we synthesize a closing line because
-       * the close will be handled in cf2_glyphPath_pushPrevElem.
-       */
-      return;
-
-    cf2_glyphpath_computeOffset( glyphpath,
-                                 glyphpath->currentCS.x,
-                                 glyphpath->currentCS.y,
-                                 x,
-                                 y,
-                                 &xOffset,
-                                 &yOffset );
-
-    /* construct offset points */
-    P0.x = glyphpath->currentCS.x + xOffset;
-    P0.y = glyphpath->currentCS.y + yOffset;
-    P1.x = x + xOffset;
-    P1.y = y + yOffset;
-
-    if ( glyphpath->moveIsPending )
-    {
-      /* emit offset 1st point as MoveTo */
-      cf2_glyphpath_pushMove( glyphpath, P0 );
-
-      glyphpath->moveIsPending = FALSE;  /* adjust state machine */
-      glyphpath->pathIsOpen    = TRUE;
-
-      glyphpath->offsetStart1 = P1;              /* record second point */
-    }
-
-    if ( glyphpath->elemIsQueued )
-    {
-      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) ||
-                 glyphpath->hintMap.count == 0              );
-
-      cf2_glyphpath_pushPrevElem( glyphpath,
-                                  &glyphpath->hintMap,
-                                  &P0,
-                                  P1,
-                                  FALSE );
-    }
-
-    /* queue the current element with offset points */
-    glyphpath->elemIsQueued = TRUE;
-    glyphpath->prevElemOp   = CF2_PathOpLineTo;
-    glyphpath->prevElemP0   = P0;
-    glyphpath->prevElemP1   = P1;
-
-    /* update current map */
-    if ( newHintMap )
-      cf2_hintmap_build( &glyphpath->hintMap,
-                         glyphpath->hStemHintArray,
-                         glyphpath->vStemHintArray,
-                         glyphpath->hintMask,
-                         glyphpath->hintOriginY,
-                         FALSE );
-
-    glyphpath->currentCS.x = x;     /* pre-offset current point */
-    glyphpath->currentCS.y = y;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,
-                         CF2_Fixed      x1,
-                         CF2_Fixed      y1,
-                         CF2_Fixed      x2,
-                         CF2_Fixed      y2,
-                         CF2_Fixed      x3,
-                         CF2_Fixed      y3 )
-  {
-    CF2_Fixed  xOffset1, yOffset1, xOffset3, yOffset3;
-    FT_Vector  P0, P1, P2, P3;
-
-
-    /* TODO: ignore zero length portions of curve?? */
-    cf2_glyphpath_computeOffset( glyphpath,
-                                 glyphpath->currentCS.x,
-                                 glyphpath->currentCS.y,
-                                 x1,
-                                 y1,
-                                 &xOffset1,
-                                 &yOffset1 );
-    cf2_glyphpath_computeOffset( glyphpath,
-                                 x2,
-                                 y2,
-                                 x3,
-                                 y3,
-                                 &xOffset3,
-                                 &yOffset3 );
-
-    /* add momentum from the middle segment */
-    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;
-    /* 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;
-
-    if ( glyphpath->moveIsPending )
-    {
-      /* emit offset 1st point as MoveTo */
-      cf2_glyphpath_pushMove( glyphpath, P0 );
-
-      glyphpath->moveIsPending = FALSE;
-      glyphpath->pathIsOpen    = TRUE;
-
-      glyphpath->offsetStart1 = P1;              /* record second point */
-    }
-
-    if ( glyphpath->elemIsQueued )
-    {
-      FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) ||
-                 glyphpath->hintMap.count == 0              );
-
-      cf2_glyphpath_pushPrevElem( glyphpath,
-                                  &glyphpath->hintMap,
-                                  &P0,
-                                  P1,
-                                  FALSE );
-    }
-
-    /* queue the current element with offset points */
-    glyphpath->elemIsQueued = TRUE;
-    glyphpath->prevElemOp   = CF2_PathOpCubeTo;
-    glyphpath->prevElemP0   = P0;
-    glyphpath->prevElemP1   = P1;
-    glyphpath->prevElemP2   = P2;
-    glyphpath->prevElemP3   = P3;
-
-    /* update current map */
-    if ( cf2_hintmask_isNew( glyphpath->hintMask ) )
-      cf2_hintmap_build( &glyphpath->hintMap,
-                         glyphpath->hStemHintArray,
-                         glyphpath->vStemHintArray,
-                         glyphpath->hintMask,
-                         glyphpath->hintOriginY,
-                         FALSE );
-
-    glyphpath->currentCS.x = x3;       /* pre-offset current point */
-    glyphpath->currentCS.y = y3;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath )
-  {
-    if ( glyphpath->pathIsOpen )
-    {
-      /*
-       * A closing line in Character Space line is always generated below
-       * with `cf2_glyphPath_lineTo'.  It may be ignored later if it turns
-       * out to be zero length in Device Space.
-       */
-      glyphpath->pathIsClosing = TRUE;
-
-      cf2_glyphpath_lineTo( glyphpath,
-                            glyphpath->start.x,
-                            glyphpath->start.y );
-
-      /* empty the final element from the queue and close the path */
-      if ( glyphpath->elemIsQueued )
-        cf2_glyphpath_pushPrevElem( glyphpath,
-                                    &glyphpath->hintMap,
-                                    &glyphpath->offsetStart0,
-                                    glyphpath->offsetStart1,
-                                    TRUE );
-
-      /* reset state machine */
-      glyphpath->moveIsPending = TRUE;
-      glyphpath->pathIsOpen    = FALSE;
-      glyphpath->pathIsClosing = FALSE;
-      glyphpath->elemIsQueued  = FALSE;
-    }
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2hints.h b/third_party/freetype/src/cff/cf2hints.h
deleted file mode 100644
index a898454..0000000
--- a/third_party/freetype/src/cff/cf2hints.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2hints.h                                                             */
-/*                                                                         */
-/*    Adobe's code for handling CFF hints (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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2HINTS_H_
-#define CF2HINTS_H_
-
-
-FT_BEGIN_HEADER
-
-
-  enum
-  {
-    CF2_MAX_HINTS = 96    /* maximum # of hints */
-  };
-
-
-  /*
-   * A HintMask object stores a bit mask that specifies which hints in the
-   * charstring are active at a given time.  Hints in CFF must be declared
-   * at the start, before any drawing operators, with horizontal hints
-   * preceding vertical hints.  The HintMask is ordered the same way, with
-   * horizontal hints immediately followed by vertical hints.  Clients are
-   * responsible for knowing how many of each type are present.
-   *
-   * The maximum total number of hints is 96, as specified by the CFF
-   * specification.
-   *
-   * A HintMask is built 0 or more times while interpreting a charstring, by
-   * the HintMask operator.  There is only one HintMask, but it is built or
-   * rebuilt each time there is a hint substitution (HintMask operator) in
-   * the charstring.  A default HintMask with all bits set is built if there
-   * has been no HintMask operator prior to the first drawing operator.
-   *
-   */
-
-  typedef struct  CF2_HintMaskRec_
-  {
-    FT_Error*  error;
-
-    FT_Bool  isValid;
-    FT_Bool  isNew;
-
-    size_t  bitCount;
-    size_t  byteCount;
-
-    FT_Byte  mask[( CF2_MAX_HINTS + 7 ) / 8];
-
-  } CF2_HintMaskRec, *CF2_HintMask;
-
-
-  typedef struct  CF2_StemHintRec_
-  {
-    FT_Bool  used;     /* DS positions are valid         */
-
-    CF2_Fixed  min;    /* original character space value */
-    CF2_Fixed  max;
-
-    CF2_Fixed  minDS;  /* DS position after first use    */
-    CF2_Fixed  maxDS;
-
-  } CF2_StemHintRec, *CF2_StemHint;
-
-
-  /*
-   * A HintMap object stores a piecewise linear function for mapping
-   * y-coordinates from character space to device space, providing
-   * appropriate pixel alignment to stem edges.
-   *
-   * The map is implemented as an array of `CF2_Hint' elements, each
-   * representing an edge.  When edges are paired, as from stem hints, the
-   * bottom edge must immediately precede the top edge in the array.
-   * Element character space AND device space positions must both increase
-   * monotonically in the array.  `CF2_Hint' elements are also used as
-   * parameters to `cf2_blues_capture'.
-   *
-   * The `cf2_hintmap_build' method must be called before any drawing
-   * operation (beginning with a Move operator) and at each hint
-   * substitution (HintMask operator).
-   *
-   * The `cf2_hintmap_map' method is called to transform y-coordinates at
-   * each drawing operation (move, line, curve).
-   *
-   */
-
-  /* TODO: make this a CF2_ArrStack and add a deep copy method */
-  enum
-  {
-    CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2
-  };
-
-
-  typedef struct  CF2_HintMapRec_
-  {
-    CF2_Font  font;
-
-    /* initial map based on blue zones */
-    struct CF2_HintMapRec_*  initialHintMap;
-
-    /* working storage for 2nd pass adjustHints */
-    CF2_ArrStack  hintMoves;
-
-    FT_Bool  isValid;
-    FT_Bool  hinted;
-
-    CF2_Fixed  scale;
-    CF2_UInt   count;
-
-    /* start search from this index */
-    CF2_UInt  lastIndex;
-
-    CF2_HintRec  edge[CF2_MAX_HINT_EDGES]; /* 192 */
-
-  } CF2_HintMapRec, *CF2_HintMap;
-
-
-  FT_LOCAL( FT_Bool )
-  cf2_hint_isValid( const CF2_Hint  hint );
-  FT_LOCAL( FT_Bool )
-  cf2_hint_isTop( const CF2_Hint  hint );
-  FT_LOCAL( FT_Bool )
-  cf2_hint_isBottom( const CF2_Hint  hint );
-  FT_LOCAL( void )
-  cf2_hint_lock( CF2_Hint  hint );
-
-
-  FT_LOCAL( void )
-  cf2_hintmap_init( CF2_HintMap   hintmap,
-                    CF2_Font      font,
-                    CF2_HintMap   initialMap,
-                    CF2_ArrStack  hintMoves,
-                    CF2_Fixed     scale );
-  FT_LOCAL( void )
-  cf2_hintmap_build( CF2_HintMap   hintmap,
-                     CF2_ArrStack  hStemHintArray,
-                     CF2_ArrStack  vStemHintArray,
-                     CF2_HintMask  hintMask,
-                     CF2_Fixed     hintOrigin,
-                     FT_Bool       initialMap );
-
-
-  /*
-   * GlyphPath is a wrapper for drawing operations that scales the
-   * coordinates according to the render matrix and HintMap.  It also tracks
-   * open paths to control ClosePath and to insert MoveTo for broken fonts.
-   *
-   */
-  typedef struct  CF2_GlyphPathRec_
-  {
-    /* TODO: gather some of these into a hinting context */
-
-    CF2_Font              font;           /* font instance    */
-    CF2_OutlineCallbacks  callbacks;      /* outline consumer */
-
-
-    CF2_HintMapRec  hintMap;        /* current hint map            */
-    CF2_HintMapRec  firstHintMap;   /* saved copy                  */
-    CF2_HintMapRec  initialHintMap; /* based on all captured hints */
-
-    CF2_ArrStackRec  hintMoves;  /* list of hint moves for 2nd pass */
-
-    CF2_Fixed  scaleX;         /* matrix a */
-    CF2_Fixed  scaleC;         /* matrix c */
-    CF2_Fixed  scaleY;         /* matrix d */
-
-    FT_Vector  fractionalTranslation;  /* including deviceXScale */
-#if 0
-    CF2_Fixed  hShift;    /* character space horizontal shift */
-                          /* (for fauxing)                    */
-#endif
-
-    FT_Bool  pathIsOpen;     /* true after MoveTo                     */
-    FT_Bool  pathIsClosing;  /* true when synthesizing closepath line */
-    FT_Bool  darken;         /* true if stem darkening                */
-    FT_Bool  moveIsPending;  /* true between MoveTo and offset MoveTo */
-
-    /* references used to call `cf2_hintmap_build', if necessary */
-    CF2_ArrStack         hStemHintArray;
-    CF2_ArrStack         vStemHintArray;
-    CF2_HintMask         hintMask;     /* ptr to the current mask */
-    CF2_Fixed            hintOriginY;  /* copy of current origin  */
-    const CF2_BluesRec*  blues;
-
-    CF2_Fixed  xOffset;        /* character space offsets */
-    CF2_Fixed  yOffset;
-
-    /* character space miter limit threshold */
-    CF2_Fixed  miterLimit;
-    /* vertical/horizontal snap distance in character space */
-    CF2_Fixed  snapThreshold;
-
-    FT_Vector  offsetStart0;  /* first and second points of first */
-    FT_Vector  offsetStart1;  /* element with offset applied      */
-
-    /* current point, character space, before offset */
-    FT_Vector  currentCS;
-    /* current point, device space */
-    FT_Vector  currentDS;
-    /* start point of subpath, character space */
-    FT_Vector  start;
-
-    /* the following members constitute the `queue' of one element */
-    FT_Bool  elemIsQueued;
-    CF2_Int  prevElemOp;
-
-    FT_Vector  prevElemP0;
-    FT_Vector  prevElemP1;
-    FT_Vector  prevElemP2;
-    FT_Vector  prevElemP3;
-
-  } CF2_GlyphPathRec, *CF2_GlyphPath;
-
-
-  FT_LOCAL( void )
-  cf2_glyphpath_init( CF2_GlyphPath         glyphpath,
-                      CF2_Font              font,
-                      CF2_OutlineCallbacks  callbacks,
-                      CF2_Fixed             scaleY,
-                      /* CF2_Fixed hShift, */
-                      CF2_ArrStack          hStemHintArray,
-                      CF2_ArrStack          vStemHintArray,
-                      CF2_HintMask          hintMask,
-                      CF2_Fixed             hintOrigin,
-                      const CF2_Blues       blues,
-                      const FT_Vector*      fractionalTranslation );
-  FT_LOCAL( void )
-  cf2_glyphpath_finalize( CF2_GlyphPath  glyphpath );
-
-  FT_LOCAL( void )
-  cf2_glyphpath_moveTo( CF2_GlyphPath  glyphpath,
-                        CF2_Fixed      x,
-                        CF2_Fixed      y );
-  FT_LOCAL( void )
-  cf2_glyphpath_lineTo( CF2_GlyphPath  glyphpath,
-                        CF2_Fixed      x,
-                        CF2_Fixed      y );
-  FT_LOCAL( void )
-  cf2_glyphpath_curveTo( CF2_GlyphPath  glyphpath,
-                         CF2_Fixed      x1,
-                         CF2_Fixed      y1,
-                         CF2_Fixed      x2,
-                         CF2_Fixed      y2,
-                         CF2_Fixed      x3,
-                         CF2_Fixed      y3 );
-  FT_LOCAL( void )
-  cf2_glyphpath_closeOpenPath( CF2_GlyphPath  glyphpath );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2HINTS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2intrp.c b/third_party/freetype/src/cff/cf2intrp.c
deleted file mode 100644
index 6bf298a..0000000
--- a/third_party/freetype/src/cff/cf2intrp.c
+++ /dev/null
@@ -1,1913 +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"
-
-#include "cffload.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_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_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 */
-    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 ( 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 = 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] += 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];
-  }
-
-
-  /* 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 += 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 */
-    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_UInt    stackSize;
-    FT_Byte    op1;                       /* first opcode byte */
-
-    CF2_F16Dot16  storage[CF2_STORAGE_SIZE];    /* for `put' and `get' */
-
-    /* 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 );
-
-    /* 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 ( 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;
-      }
-
-      /* 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_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 ( cff_blend_check_vector( &font->blend,
-                                       font->vsindex,
-                                       font->lenNDV,
-                                       font->NDV ) )
-          {
-            lastError = cff_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" ));
-
-        /* 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 = FT_BOOL( 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_Int  subrNum;
-
-
-          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 */
-          subrNum = cf2_stack_popInt( opStack );
-
-          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 reserved in both CFF & CFF2 */
-          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:
-            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
-              {
-                /* second switch for 2-byte operators handles just CFF */
-                switch ( op2 )
-                {
-
-                case cf2_escDOTSECTION:
-                  /* something about `flip type of locking' -- ignore it */
-                  FT_TRACE4(( " dotsection\n" ));
-
-                  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_escABS:
-                  {
-                    CF2_F16Dot16  arg;
-
-
-                    FT_TRACE4(( " abs\n" ));
-
-                    arg = cf2_stack_popFixed( opStack );
-
-                    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, 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, minuend - subtrahend );
-                  }
-                  continue; /* do not clear the stack */
-
-                case cf2_escDIV:
-                  {
-                    CF2_F16Dot16  dividend;
-                    CF2_F16Dot16  divisor;
-
-
-                    FT_TRACE4(( " div\n" ));
-
-                    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 );
-
-                    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_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 */
-                  FT_TRACE4(( " random\n" ));
-
-                  CF2_FIXME;
-                  break;
-
-                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 )
-                    {
-                      FT_Fixed  root = arg;
-                      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 */
-
-                } /* end of 2nd switch checking op2 */
-              }
-            }
-          } /* end of 1st switch 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 );
-
-        /* disable seac for CFF2 (charstring ending with args on stack) */
-        if ( !font->isCFF2 && 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 & ~2U;
-          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 & ~2U;
-          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 = 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;
-          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;
-
-          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         );
-
-            FT_TRACE4(( " %.5f", 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/third_party/freetype/src/cff/cf2intrp.h b/third_party/freetype/src/cff/cf2intrp.h
deleted file mode 100644
index ec030e8..0000000
--- a/third_party/freetype/src/cff/cf2intrp.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2font.h                                                              */
-/*                                                                         */
-/*    Adobe's CFF Interpreter (specification).                             */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2INTRP_H_
-#define CF2INTRP_H_
-
-
-#include "cf2ft.h"
-#include "cf2hints.h"
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( void )
-  cf2_hintmask_init( CF2_HintMask  hintmask,
-                     FT_Error*     error );
-  FT_LOCAL( FT_Bool )
-  cf2_hintmask_isValid( const CF2_HintMask  hintmask );
-  FT_LOCAL( FT_Bool )
-  cf2_hintmask_isNew( const CF2_HintMask  hintmask );
-  FT_LOCAL( void )
-  cf2_hintmask_setNew( CF2_HintMask  hintmask,
-                       FT_Bool       val );
-  FT_LOCAL( FT_Byte* )
-  cf2_hintmask_getMaskPtr( CF2_HintMask  hintmask );
-  FT_LOCAL( void )
-  cf2_hintmask_setAll( CF2_HintMask  hintmask,
-                       size_t        bitCount );
-
-  FT_LOCAL( void )
-  cf2_interpT2CharString( CF2_Font              font,
-                          CF2_Buffer            charstring,
-                          CF2_OutlineCallbacks  callbacks,
-                          const FT_Vector*      translation,
-                          FT_Bool               doingSeac,
-                          CF2_Fixed             curX,
-                          CF2_Fixed             curY,
-                          CF2_Fixed*            width );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2INTRP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2read.c b/third_party/freetype/src/cff/cf2read.c
deleted file mode 100644
index 2b429e3..0000000
--- a/third_party/freetype/src/cff/cf2read.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2read.c                                                              */
-/*                                                                         */
-/*    Adobe's code for stream handling (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 "cf2error.h"
-
-
-  /* Define CF2_IO_FAIL as 1 to enable random errors and random */
-  /* value errors in I/O.                                       */
-#define CF2_IO_FAIL  0
-
-
-#if CF2_IO_FAIL
-
-  /* set the .00 value to a nonzero probability */
-  static int
-  randomError2( void )
-  {
-    /* for region buffer ReadByte (interp) function */
-    return (double)rand() / RAND_MAX < .00;
-  }
-
-  /* set the .00 value to a nonzero probability */
-  static CF2_Int
-  randomValue()
-  {
-    return (double)rand() / RAND_MAX < .00 ? rand() : 0;
-  }
-
-#endif /* CF2_IO_FAIL */
-
-
-  /* Region Buffer                                      */
-  /*                                                    */
-  /* Can be constructed from a copied buffer managed by */
-  /* `FCM_getDatablock'.                                */
-  /* Reads bytes with check for end of buffer.          */
-
-  /* reading past the end of the buffer sets error and returns zero */
-  FT_LOCAL_DEF( CF2_Int )
-  cf2_buf_readByte( CF2_Buffer  buf )
-  {
-    if ( buf->ptr < buf->end )
-    {
-#if CF2_IO_FAIL
-      if ( randomError2() )
-      {
-        CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
-        return 0;
-      }
-
-      return *(buf->ptr)++ + randomValue();
-#else
-      return *(buf->ptr)++;
-#endif
-    }
-    else
-    {
-      CF2_SET_ERROR( buf->error, Invalid_Stream_Operation );
-      return 0;
-    }
-  }
-
-
-  /* note: end condition can occur without error */
-  FT_LOCAL_DEF( FT_Bool )
-  cf2_buf_isEnd( CF2_Buffer  buf )
-  {
-    return (FT_Bool)( buf->ptr >= buf->end );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2read.h b/third_party/freetype/src/cff/cf2read.h
deleted file mode 100644
index b0b0db8..0000000
--- a/third_party/freetype/src/cff/cf2read.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2read.h                                                              */
-/*                                                                         */
-/*    Adobe's code for stream handling (specification).                    */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2READ_H_
-#define CF2READ_H_
-
-
-FT_BEGIN_HEADER
-
-
-  typedef struct  CF2_BufferRec_
-  {
-    FT_Error*       error;
-    const FT_Byte*  start;
-    const FT_Byte*  end;
-    const FT_Byte*  ptr;
-
-  } CF2_BufferRec, *CF2_Buffer;
-
-
-  FT_LOCAL( CF2_Int )
-  cf2_buf_readByte( CF2_Buffer  buf );
-  FT_LOCAL( FT_Bool )
-  cf2_buf_isEnd( CF2_Buffer  buf );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2READ_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2stack.c b/third_party/freetype/src/cff/cf2stack.c
deleted file mode 100644
index 12a026d..0000000
--- a/third_party/freetype/src/cff/cf2stack.c
+++ /dev/null
@@ -1,328 +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_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/third_party/freetype/src/cff/cf2stack.h b/third_party/freetype/src/cff/cf2stack.h
deleted file mode 100644
index ef08eef..0000000
--- a/third_party/freetype/src/cff/cf2stack.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2stack.h                                                             */
-/*                                                                         */
-/*    Adobe's code for emulating a CFF stack (specification).              */
-/*                                                                         */
-/*  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.                                             */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef CF2STACK_H_
-#define CF2STACK_H_
-
-
-FT_BEGIN_HEADER
-
-
-  /* CFF operand stack; specified maximum of 48 or 192 values */
-  typedef struct  CF2_StackNumber_
-  {
-    union
-    {
-      CF2_Fixed  r;      /* 16.16 fixed point */
-      CF2_Frac   f;      /* 2.30 fixed point (for font matrix) */
-      CF2_Int    i;
-    } u;
-
-    CF2_NumberType  type;
-
-  } CF2_StackNumber;
-
-
-  typedef struct  CF2_StackRec_
-  {
-    FT_Memory         memory;
-    FT_Error*         error;
-    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_UInt    stackSize );
-  FT_LOCAL( void )
-  cf2_stack_free( CF2_Stack  stack );
-
-  FT_LOCAL( CF2_UInt )
-  cf2_stack_count( CF2_Stack  stack );
-
-  FT_LOCAL( void )
-  cf2_stack_pushInt( CF2_Stack  stack,
-                     CF2_Int    val );
-  FT_LOCAL( void )
-  cf2_stack_pushFixed( CF2_Stack  stack,
-                       CF2_Fixed  val );
-
-  FT_LOCAL( CF2_Int )
-  cf2_stack_popInt( CF2_Stack  stack );
-  FT_LOCAL( CF2_Fixed )
-  cf2_stack_popFixed( CF2_Stack  stack );
-
-  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 );
-
-
-FT_END_HEADER
-
-
-#endif /* CF2STACK_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cf2types.h b/third_party/freetype/src/cff/cf2types.h
deleted file mode 100644
index 5b7e123..0000000
--- a/third_party/freetype/src/cff/cf2types.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cf2types.h                                                             */
-/*                                                                         */
-/*    Adobe's code for defining data types (specification only).           */
-/*                                                                         */
-/*  Copyright 2011-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 CF2TYPES_H_
-#define CF2TYPES_H_
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*
-   * The data models that we expect to support are as follows:
-   *
-   *   name  char short int long long-long pointer example
-   *  -----------------------------------------------------
-   *   ILP32  8    16    32  32     64*      32    32-bit MacOS, x86
-   *   LLP64  8    16    32  32     64       64    x64
-   *   LP64   8    16    32  64     64       64    64-bit MacOS
-   *
-   *    *) type may be supported by emulation on a 32-bit architecture
-   *
-   */
-
-
-  /* integers at least 32 bits wide */
-#define CF2_UInt  FT_UFast
-#define CF2_Int   FT_Fast
-
-
-  /* fixed-float numbers */
-  typedef FT_Int32  CF2_F16Dot16;
-
-
-FT_END_HEADER
-
-
-#endif /* CF2TYPES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cff.c b/third_party/freetype/src/cff/cff.c
deleted file mode 100644
index 545fb20..0000000
--- a/third_party/freetype/src/cff/cff.c
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cff.c                                                                  */
-/*                                                                         */
-/*    FreeType OpenType driver component (body only).                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-
-#include "cffpic.c"
-#include "cffdrivr.c"
-#include "cffparse.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/third_party/freetype/src/cff/cffcmap.c b/third_party/freetype/src/cff/cffcmap.c
deleted file mode 100644
index 4adce7a..0000000
--- a/third_party/freetype/src/cff/cffcmap.c
+++ /dev/null
@@ -1,229 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffcmap.c                                                              */
-/*                                                                         */
-/*    CFF character mapping table (cmap) support (body).                   */
-/*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include "cffcmap.h"
-#include "cffload.h"
-
-#include "cfferrs.h"
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****           CFF STANDARD (AND EXPERT) ENCODING CMAPS            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_CALLBACK_DEF( FT_Error )
-  cff_cmap_encoding_init( CFF_CMapStd  cmap,
-                          FT_Pointer   pointer )
-  {
-    TT_Face       face     = (TT_Face)FT_CMAP_FACE( cmap );
-    CFF_Font      cff      = (CFF_Font)face->extra.data;
-    CFF_Encoding  encoding = &cff->encoding;
-
-    FT_UNUSED( pointer );
-
-
-    cmap->gids  = encoding->codes;
-
-    return 0;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  cff_cmap_encoding_done( CFF_CMapStd  cmap )
-  {
-    cmap->gids  = NULL;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  cff_cmap_encoding_char_index( CFF_CMapStd  cmap,
-                                FT_UInt32    char_code )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( char_code < 256 )
-      result = cmap->gids[char_code];
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  cff_cmap_encoding_char_next( CFF_CMapStd   cmap,
-                               FT_UInt32    *pchar_code )
-  {
-    FT_UInt    result    = 0;
-    FT_UInt32  char_code = *pchar_code;
-
-
-    *pchar_code = 0;
-
-    if ( char_code < 255 )
-    {
-      FT_UInt  code = (FT_UInt)(char_code + 1);
-
-
-      for (;;)
-      {
-        if ( code >= 256 )
-          break;
-
-        result = cmap->gids[code];
-        if ( result != 0 )
-        {
-          *pchar_code = code;
-          break;
-        }
-
-        code++;
-      }
-    }
-    return result;
-  }
-
-
-  FT_DEFINE_CMAP_CLASS(
-    cff_cmap_encoding_class_rec,
-
-    sizeof ( CFF_CMapStdRec ),
-
-    (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  */
-
-    (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 */
-  )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****              CFF SYNTHETIC UNICODE ENCODING CMAP              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_CALLBACK_DEF( const char* )
-  cff_sid_to_glyph_name( TT_Face  face,
-                         FT_UInt  idx )
-  {
-    CFF_Font     cff     = (CFF_Font)face->extra.data;
-    CFF_Charset  charset = &cff->charset;
-    FT_UInt      sid     = charset->sids[idx];
-
-
-    return cff_index_get_sid_string( cff, sid );
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  cff_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 );
-    CFF_Font            cff     = (CFF_Font)face->extra.data;
-    CFF_Charset         charset = &cff->charset;
-    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
-
-    FT_UNUSED( pointer );
-
-
-    /* can't build Unicode map for CID-keyed font */
-    /* because we don't know glyph names.         */
-    if ( !charset->sids )
-      return FT_THROW( No_Unicode_Glyph_Name );
-
-    return psnames->unicodes_init( memory,
-                                   unicodes,
-                                   cff->num_glyphs,
-                                   (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name,
-                                   (PS_FreeGlyphNameFunc)NULL,
-                                   (FT_Pointer)face );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  cff_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 )
-  cff_cmap_unicode_char_index( PS_Unicodes  unicodes,
-                               FT_UInt32    char_code )
-  {
-    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
-    CFF_Font            cff     = (CFF_Font)face->extra.data;
-    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
-
-
-    return psnames->unicodes_char_index( unicodes, char_code );
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  cff_cmap_unicode_char_next( PS_Unicodes  unicodes,
-                              FT_UInt32   *pchar_code )
-  {
-    TT_Face             face    = (TT_Face)FT_CMAP_FACE( unicodes );
-    CFF_Font            cff     = (CFF_Font)face->extra.data;
-    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)cff->psnames;
-
-
-    return psnames->unicodes_char_next( unicodes, pchar_code );
-  }
-
-
-  FT_DEFINE_CMAP_CLASS(
-    cff_cmap_unicode_class_rec,
-
-    sizeof ( PS_UnicodesRec ),
-
-    (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  */
-
-    (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/third_party/freetype/src/cff/cffcmap.h b/third_party/freetype/src/cff/cffcmap.h
deleted file mode 100644
index 7792e04..0000000
--- a/third_party/freetype/src/cff/cffcmap.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffcmap.h                                                              */
-/*                                                                         */
-/*    CFF character mapping table (cmap) support (specification).          */
-/*                                                                         */
-/*  Copyright 2002-2017 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 CFFCMAP_H_
-#define CFFCMAP_H_
-
-#include "cffobjs.h"
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* standard (and expert) encoding cmaps */
-  typedef struct CFF_CMapStdRec_*  CFF_CMapStd;
-
-  typedef struct  CFF_CMapStdRec_
-  {
-    FT_CMapRec  cmap;
-    FT_UShort*  gids;   /* up to 256 elements */
-
-  } CFF_CMapStdRec;
-
-
-  FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec)
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****               CFF SYNTHETIC UNICODE ENCODING CMAP             *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* unicode (synthetic) cmaps */
-
-  FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec)
-
-
-FT_END_HEADER
-
-#endif /* CFFCMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffdrivr.c b/third_party/freetype/src/cff/cffdrivr.c
deleted file mode 100644
index 467b3ed..0000000
--- a/third_party/freetype/src/cff/cffdrivr.c
+++ /dev/null
@@ -1,1175 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffdrivr.c                                                             */
-/*                                                                         */
-/*    OpenType font driver implementation (body).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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_STREAM_H
-#include FT_INTERNAL_SFNT_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 "cffdrivr.h"
-#include "cffgload.h"
-#include "cffload.h"
-#include "cffcmap.h"
-#include "cffparse.h"
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include FT_SERVICE_MULTIPLE_MASTERS_H
-#endif
-
-#include "cfferrs.h"
-#include "cffpic.h"
-
-#include FT_SERVICE_FONT_FORMAT_H
-#include FT_SERVICE_GLYPH_DICT_H
-#include FT_SERVICE_PROPERTIES_H
-#include FT_CFF_DRIVER_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_cffdriver
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                          F A C E S                              ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_get_kerning                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to return the kerning vector between two      */
-  /*    glyphs of the same face.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to the source face object.                 */
-  /*                                                                       */
-  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
-  /*                                                                       */
-  /*    right_glyph :: The index of the right glyph in the kern pair.      */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    kerning     :: The kerning vector.  This is in font units for      */
-  /*                   scalable formats, and in pixels for fixed-sizes     */
-  /*                   formats.                                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
-  /*    supported by this function.  Other layouts, or more sophisticated  */
-  /*    kernings, are out of scope of this method (the basic driver        */
-  /*    interface is meant to be simple).                                  */
-  /*                                                                       */
-  /*    They can be implemented by format-specific interfaces.             */
-  /*                                                                       */
-  FT_CALLBACK_DEF( FT_Error )
-  cff_get_kerning( FT_Face     ttface,          /* TT_Face */
-                   FT_UInt     left_glyph,
-                   FT_UInt     right_glyph,
-                   FT_Vector*  kerning )
-  {
-    TT_Face       face = (TT_Face)ttface;
-    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
-
-
-    kerning->x = 0;
-    kerning->y = 0;
-
-    if ( sfnt )
-      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cff_glyph_load                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to load a glyph within a given glyph slot.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    slot        :: A handle to the target slot object where the glyph  */
-  /*                   will be loaded.                                     */
-  /*                                                                       */
-  /*    size        :: A handle to the source face size at which the glyph */
-  /*                   must be scaled, loaded, etc.                        */
-  /*                                                                       */
-  /*    glyph_index :: The index of the glyph in the font file.            */
-  /*                                                                       */
-  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
-  /*                   FT_LOAD_??? constants can be used to control the    */
-  /*                   glyph loading process (e.g., whether the outline    */
-  /*                   should be scaled, whether to load bitmaps or not,   */
-  /*                   whether to hint the outline, etc).                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_CALLBACK_DEF( FT_Error )
-  cff_glyph_load( FT_GlyphSlot  cffslot,      /* CFF_GlyphSlot */
-                  FT_Size       cffsize,      /* CFF_Size      */
-                  FT_UInt       glyph_index,
-                  FT_Int32      load_flags )
-  {
-    FT_Error       error;
-    CFF_GlyphSlot  slot = (CFF_GlyphSlot)cffslot;
-    CFF_Size       size = (CFF_Size)cffsize;
-
-
-    if ( !slot )
-      return FT_THROW( Invalid_Slot_Handle );
-
-    FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index ));
-
-    /* check whether we want a scaled outline or bitmap */
-    if ( !size )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    /* reset the size object if necessary */
-    if ( load_flags & FT_LOAD_NO_SCALE )
-      size = NULL;
-
-    if ( size )
-    {
-      /* these two objects must have the same parent */
-      if ( cffsize->face != cffslot->face )
-        return FT_THROW( Invalid_Face_Handle );
-    }
-
-    /* now load the glyph outline if necessary */
-    error = cff_slot_load( slot, size, glyph_index, load_flags );
-
-    /* force drop-out mode to 2 - irrelevant now */
-    /* slot->outline.dropout_mode = 2; */
-
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  cff_get_advances( FT_Face    face,
-                    FT_UInt    start,
-                    FT_UInt    count,
-                    FT_Int32   flags,
-                    FT_Fixed*  advances )
-  {
-    FT_UInt       nn;
-    FT_Error      error = FT_Err_Ok;
-    FT_GlyphSlot  slot  = face->glyph;
-
-
-    if ( FT_IS_SFNT( face ) )
-    {
-      /* OpenType 1.7 mandates that the data from `hmtx' table be used; */
-      /* it is no longer necessary that those values are identical to   */
-      /* the values in the `CFF' table                                  */
-
-      TT_Face   ttface = (TT_Face)face;
-      FT_Short  dummy;
-
-
-      if ( flags & FT_LOAD_VERTICAL_LAYOUT )
-      {
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-        /* no fast retrieval for blended MM fonts without VVAR table */
-        if ( !ttface->is_default_instance                               &&
-             !( 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' */
-        /* table)                                                   */
-        if ( !ttface->vertical_info )
-          goto Missing_Table;
-
-        for ( nn = 0; nn < count; nn++ )
-        {
-          FT_UShort  ah;
-
-
-          ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
-                                                       1,
-                                                       start + nn,
-                                                       &dummy,
-                                                       &ah );
-
-          FT_TRACE5(( "  idx %d: advance height %d font units\n",
-                      start + nn, ah ));
-          advances[nn] = ah;
-        }
-      }
-      else
-      {
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-        /* no fast retrieval for blended MM fonts without HVAR table */
-        if ( !ttface->is_default_instance                               &&
-             !( 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;
-
-        for ( nn = 0; nn < count; nn++ )
-        {
-          FT_UShort  aw;
-
-
-          ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface,
-                                                       0,
-                                                       start + nn,
-                                                       &dummy,
-                                                       &aw );
-
-          FT_TRACE5(( "  idx %d: advance width %d font units\n",
-                      start + nn, aw ));
-          advances[nn] = aw;
-        }
-      }
-
-      return error;
-    }
-
-  Missing_Table:
-    flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY;
-
-    for ( nn = 0; nn < count; nn++ )
-    {
-      error = cff_glyph_load( slot, face->size, start + nn, flags );
-      if ( error )
-        break;
-
-      advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT )
-                     ? slot->linearVertAdvance
-                     : slot->linearHoriAdvance;
-    }
-
-    return error;
-  }
-
-
-  /*
-   *  GLYPH DICT SERVICE
-   *
-   */
-
-  static FT_Error
-  cff_get_glyph_name( CFF_Face    face,
-                      FT_UInt     glyph_index,
-                      FT_Pointer  buffer,
-                      FT_UInt     buffer_max )
-  {
-    CFF_Font    font   = (CFF_Font)face->extra.data;
-    FT_String*  gname;
-    FT_UShort   sid;
-    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:"
-                 " cannot get glyph name from CFF & CEF fonts\n"
-                 "                   "
-                 " without the `PSNames' module\n" ));
-      error = FT_THROW( Missing_Module );
-      goto Exit;
-    }
-
-    /* first, locate the sid in the charset table */
-    sid = font->charset.sids[glyph_index];
-
-    /* now, lookup the name itself */
-    gname = cff_index_get_sid_string( font, sid );
-
-    if ( gname )
-      FT_STRCPYN( buffer, gname, buffer_max );
-
-    error = FT_Err_Ok;
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_UInt
-  cff_get_name_index( CFF_Face    face,
-                      FT_String*  glyph_name )
-  {
-    CFF_Font            cff;
-    CFF_Charset         charset;
-    FT_Service_PsCMaps  psnames;
-    FT_String*          name;
-    FT_UShort           sid;
-    FT_UInt             i;
-
-
-    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;
-
-    for ( i = 0; i < cff->num_glyphs; i++ )
-    {
-      sid = charset->sids[i];
-
-      if ( sid > 390 )
-        name = cff_index_get_string( cff, sid - 391 );
-      else
-        name = (FT_String *)psnames->adobe_std_strings( sid );
-
-      if ( !name )
-        continue;
-
-      if ( !ft_strcmp( glyph_name, name ) )
-        return i;
-    }
-
-    return 0;
-  }
-
-
-  FT_DEFINE_SERVICE_GLYPHDICTREC(
-    cff_service_glyph_dict,
-
-    (FT_GlyphDict_GetNameFunc)  cff_get_glyph_name,      /* get_name   */
-    (FT_GlyphDict_NameIndexFunc)cff_get_name_index       /* name_index */
-  )
-
-
-  /*
-   *  POSTSCRIPT INFO SERVICE
-   *
-   */
-
-  static FT_Int
-  cff_ps_has_glyph_names( FT_Face  face )
-  {
-    return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0;
-  }
-
-
-  static FT_Error
-  cff_ps_get_font_info( CFF_Face         face,
-                        PS_FontInfoRec*  afont_info )
-  {
-    CFF_Font  cff   = (CFF_Font)face->extra.data;
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( cff && !cff->font_info )
-    {
-      CFF_FontRecDict  dict      = &cff->top_font.font_dict;
-      PS_FontInfoRec  *font_info = NULL;
-      FT_Memory        memory    = face->root.memory;
-
-
-      if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) )
-        goto Fail;
-
-      font_info->version     = cff_index_get_sid_string( cff,
-                                                         dict->version );
-      font_info->notice      = cff_index_get_sid_string( cff,
-                                                         dict->notice );
-      font_info->full_name   = cff_index_get_sid_string( cff,
-                                                         dict->full_name );
-      font_info->family_name = cff_index_get_sid_string( cff,
-                                                         dict->family_name );
-      font_info->weight      = cff_index_get_sid_string( cff,
-                                                         dict->weight );
-      font_info->italic_angle        = dict->italic_angle;
-      font_info->is_fixed_pitch      = dict->is_fixed_pitch;
-      font_info->underline_position  = (FT_Short)dict->underline_position;
-      font_info->underline_thickness = (FT_UShort)dict->underline_thickness;
-
-      cff->font_info = font_info;
-    }
-
-    if ( cff )
-      *afont_info = *cff->font_info;
-
-  Fail:
-    return error;
-  }
-
-
-  FT_DEFINE_SERVICE_PSINFOREC(
-    cff_service_ps_info,
-
-    (PS_GetFontInfoFunc)   cff_ps_get_font_info,    /* ps_get_font_info    */
-    (PS_GetFontExtraFunc)  NULL,                    /* 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   */
-  )
-
-
-  /*
-   *  POSTSCRIPT NAME SERVICE
-   *
-   */
-
-  static const char*
-  cff_get_ps_name( CFF_Face  face )
-  {
-    CFF_Font      cff  = (CFF_Font)face->extra.data;
-    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
-
-
-    /* following the OpenType specification 1.7, we return the name stored */
-    /* in the `name' table for a CFF wrapped into an SFNT container        */
-
-    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,
-                                 0 );
-
-
-      if ( service && service->get_ps_font_name )
-        return service->get_ps_font_name( FT_FACE( face ) );
-    }
-
-    return (const char*)cff->font_name;
-  }
-
-
-  FT_DEFINE_SERVICE_PSFONTNAMEREC(
-    cff_service_ps_name,
-
-    (FT_PsName_GetFunc)cff_get_ps_name      /* get_ps_font_name */
-  )
-
-
-  /*
-   * TT CMAP INFO
-   *
-   * If the charmap is a synthetic Unicode encoding cmap or
-   * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO
-   * service defined in SFNT module.
-   *
-   * Otherwise call the service function in the sfnt module.
-   *
-   */
-  static FT_Error
-  cff_get_cmap_info( FT_CharMap    charmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_CMap   cmap  = FT_CMAP( charmap );
-    FT_Error  error = FT_Err_Ok;
-
-    FT_Face     face    = FT_CMAP_FACE( cmap );
-    FT_Library  library = FT_FACE_LIBRARY( face );
-
-
-    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,
-                                                   0 );
-
-
-      if ( service && service->get_cmap_info )
-        error = service->get_cmap_info( charmap, cmap_info );
-    }
-    else
-      error = FT_THROW( Invalid_CharMap_Format );
-
-    return error;
-  }
-
-
-  FT_DEFINE_SERVICE_TTCMAPSREC(
-    cff_service_get_cmap_info,
-
-    (TT_CMap_Info_GetFunc)cff_get_cmap_info    /* get_cmap_info */
-  )
-
-
-  /*
-   *  CID INFO SERVICE
-   *
-   */
-  static FT_Error
-  cff_get_ros( CFF_Face      face,
-               const char*  *registry,
-               const char*  *ordering,
-               FT_Int       *supplement )
-  {
-    FT_Error  error = FT_Err_Ok;
-    CFF_Font  cff   = (CFF_Font)face->extra.data;
-
-
-    if ( cff )
-    {
-      CFF_FontRecDict  dict = &cff->top_font.font_dict;
-
-
-      if ( dict->cid_registry == 0xFFFFU )
-      {
-        error = FT_THROW( Invalid_Argument );
-        goto Fail;
-      }
-
-      if ( registry )
-      {
-        if ( !cff->registry )
-          cff->registry = cff_index_get_sid_string( cff,
-                                                    dict->cid_registry );
-        *registry = cff->registry;
-      }
-
-      if ( ordering )
-      {
-        if ( !cff->ordering )
-          cff->ordering = cff_index_get_sid_string( cff,
-                                                    dict->cid_ordering );
-        *ordering = cff->ordering;
-      }
-
-      /*
-       * XXX: According to Adobe TechNote #5176, the supplement in CFF
-       *      can be a real number. We truncate it to fit public API
-       *      since freetype-2.3.6.
-       */
-      if ( supplement )
-      {
-        if ( dict->cid_supplement < FT_INT_MIN ||
-             dict->cid_supplement > FT_INT_MAX )
-          FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n",
-                      dict->cid_supplement ));
-        *supplement = (FT_Int)dict->cid_supplement;
-      }
-    }
-
-  Fail:
-    return error;
-  }
-
-
-  static FT_Error
-  cff_get_is_cid( CFF_Face  face,
-                  FT_Bool  *is_cid )
-  {
-    FT_Error  error = FT_Err_Ok;
-    CFF_Font  cff   = (CFF_Font)face->extra.data;
-
-
-    *is_cid = 0;
-
-    if ( cff )
-    {
-      CFF_FontRecDict  dict = &cff->top_font.font_dict;
-
-
-      if ( dict->cid_registry != 0xFFFFU )
-        *is_cid = 1;
-    }
-
-    return error;
-  }
-
-
-  static FT_Error
-  cff_get_cid_from_glyph_index( CFF_Face  face,
-                                FT_UInt   glyph_index,
-                                FT_UInt  *cid )
-  {
-    FT_Error  error = FT_Err_Ok;
-    CFF_Font  cff;
-
-
-    cff = (CFF_Font)face->extra.data;
-
-    if ( cff )
-    {
-      FT_UInt          c;
-      CFF_FontRecDict  dict = &cff->top_font.font_dict;
-
-
-      if ( dict->cid_registry == 0xFFFFU )
-      {
-        error = FT_THROW( Invalid_Argument );
-        goto Fail;
-      }
-
-      if ( glyph_index > cff->num_glyphs )
-      {
-        error = FT_THROW( Invalid_Argument );
-        goto Fail;
-      }
-
-      c = cff->charset.sids[glyph_index];
-
-      if ( cid )
-        *cid = c;
-    }
-
-  Fail:
-    return error;
-  }
-
-
-  FT_DEFINE_SERVICE_CIDREC(
-    cff_service_cid_info,
-
-    (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 */
-  )
-
-
-  /*
-   *  PROPERTY SERVICE
-   *
-   */
-  static FT_Error
-  cff_property_set( FT_Module    module,         /* CFF_Driver */
-                    const char*  property_name,
-                    const void*  value,
-                    FT_Bool      value_is_string )
-  {
-    FT_Error    error  = FT_Err_Ok;
-    CFF_Driver  driver = (CFF_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" ) )
-    {
-#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_CFF_HINTING_ADOBE;
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-        else if ( !ft_strcmp( s, "freetype" ) )
-          driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
-#endif
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        FT_UInt*  hinting_engine = (FT_UInt*)value;
-
-        if ( *hinting_engine == FT_CFF_HINTING_ADOBE
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-             || *hinting_engine == FT_CFF_HINTING_FREETYPE
-#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 == 0 )
-          driver->no_stem_darkening = 0;
-        else if ( nsd == 1 )
-          driver->no_stem_darkening = 1;
-        else
-          return FT_THROW( Invalid_Argument );
-      }
-      else
-#endif
-      {
-        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,      /* set_property */
-    (FT_Properties_GetFunc)cff_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 );
-  }
-
-
-  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_Get_Var_Blend_Func) cff_get_var_blend,      /* get_var_blend  */
-    (FT_Done_Blend_Func)    cff_done_blend          /* done_blend     */
-  )
-#endif
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                D R I V E R  I N T E R F A C E                   ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \
-     defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC8(
-    cff_services,
-
-    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
-    FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_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
-  )
-#elif !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES
-  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_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
-  )
-#elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  FT_DEFINE_SERVICEDESCREC7(
-    cff_services,
-
-    FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CFF,
-    FT_SERVICE_ID_MULTI_MASTERS,        &CFF_SERVICE_MULTI_MASTERS_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
-  )
-#else
-  FT_DEFINE_SERVICEDESCREC6(
-    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
-  )
-#endif
-
-
-  FT_CALLBACK_DEF( FT_Module_Interface )
-  cff_get_interface( FT_Module    driver,       /* CFF_Driver */
-                     const char*  module_interface )
-  {
-    FT_Library           library;
-    FT_Module            sfnt;
-    FT_Module_Interface  result;
-
-
-    /* CFF_SERVICES_GET dereferences `library' in PIC mode */
-#ifdef FT_CONFIG_OPTION_PIC
-    if ( !driver )
-      return NULL;
-    library = driver->library;
-    if ( !library )
-      return NULL;
-#endif
-
-    result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface );
-    if ( result )
-      return result;
-
-    /* `driver' is not yet evaluated in non-PIC mode */
-#ifndef FT_CONFIG_OPTION_PIC
-    if ( !driver )
-      return NULL;
-    library = driver->library;
-    if ( !library )
-      return NULL;
-#endif
-
-    /* we pass our request to the `sfnt' module */
-    sfnt = FT_Get_Module( library, "sfnt" );
-
-    return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0;
-  }
-
-
-  /* The FT_DriverInterface structure is defined in ftdriver.h. */
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-#define CFF_SIZE_SELECT cff_size_select
-#else
-#define CFF_SIZE_SELECT 0
-#endif
-
-  FT_DEFINE_DRIVER(
-    cff_driver_class,
-
-      FT_MODULE_FONT_DRIVER          |
-      FT_MODULE_DRIVER_SCALABLE      |
-      FT_MODULE_DRIVER_HAS_HINTER    |
-      FT_MODULE_DRIVER_HINTS_LIGHTLY,
-
-      sizeof ( CFF_DriverRec ),
-      "cff",
-      0x10000L,
-      0x20000L,
-
-      NULL,   /* module-specific 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 */
-
-    sizeof ( TT_FaceRec ),
-    sizeof ( CFF_SizeRec ),
-    sizeof ( CFF_GlyphSlotRec ),
-
-    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,             /* FT_Slot_LoadFunc  load_glyph */
-
-    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,           /* FT_Size_RequestFunc  request_size */
-    CFF_SIZE_SELECT             /* FT_Size_SelectFunc   select_size  */
-  )
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffdrivr.h b/third_party/freetype/src/cff/cffdrivr.h
deleted file mode 100644
index 05381e6..0000000
--- a/third_party/freetype/src/cff/cffdrivr.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffdrivr.h                                                             */
-/*                                                                         */
-/*    High-level OpenType driver interface (specification).                */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CFFDRIVER_H_
-#define CFFDRIVER_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_DRIVER( cff_driver_class )
-
-
-FT_END_HEADER
-
-#endif /* CFFDRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cfferrs.h b/third_party/freetype/src/cff/cfferrs.h
deleted file mode 100644
index 40808c1..0000000
--- a/third_party/freetype/src/cff/cfferrs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cfferrs.h                                                              */
-/*                                                                         */
-/*    CFF error codes (specification only).                                */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the CFF error enumeration constants.      */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef CFFERRS_H_
-#define CFFERRS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  CFF_Err_
-#define FT_ERR_BASE    FT_Mod_Err_CFF
-
-
-#include FT_ERRORS_H
-
-#endif /* CFFERRS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffgload.c b/third_party/freetype/src/cff/cffgload.c
deleted file mode 100644
index f8e80c1..0000000
--- a/third_party/freetype/src/cff/cffgload.c
+++ /dev/null
@@ -1,3214 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffgload.c                                                             */
-/*                                                                         */
-/*    OpenType Glyph Loader (body).                                        */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H
-#include FT_OUTLINE_H
-#include FT_CFF_DRIVER_H
-
-#include "cffobjs.h"
-#include "cffload.h"
-#include "cffgload.h"
-#include "cf2ft.h"      /* for cf2_decoder_parse_charstrings */
-
-#include "cfferrs.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_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_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;
-  }
-
-
-  /* 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,
-                      FT_Byte**  pointer,
-                      FT_ULong*  length )
-  {
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    /* For incremental fonts get the character data using the */
-    /* callback function.                                     */
-    if ( face->root.internal->incremental_interface )
-    {
-      FT_Data   data;
-      FT_Error  error =
-                  face->root.internal->incremental_interface->funcs->get_glyph_data(
-                    face->root.internal->incremental_interface->object,
-                    glyph_index, &data );
-
-
-      *pointer = (FT_Byte*)data.pointer;
-      *length  = (FT_ULong)data.length;
-
-      return error;
-    }
-    else
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    {
-      CFF_Font  cff = (CFF_Font)(face->extra.data);
-
-
-      return cff_index_access_element( &cff->charstrings_index, glyph_index,
-                                       pointer, length );
-    }
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_free_glyph_data( TT_Face    face,
-                       FT_Byte**  pointer,
-                       FT_ULong   length )
-  {
-#ifndef FT_CONFIG_OPTION_INCREMENTAL
-    FT_UNUSED( length );
-#endif
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    /* For incremental fonts get the character data using the */
-    /* callback function.                                     */
-    if ( face->root.internal->incremental_interface )
-    {
-      FT_Data  data;
-
-
-      data.pointer = *pointer;
-      data.length  = (FT_Int)length;
-
-      face->root.internal->incremental_interface->funcs->free_glyph_data(
-        face->root.internal->incremental_interface->object, &data );
-    }
-    else
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    {
-      CFF_Font  cff = (CFF_Font)(face->extra.data);
-
-
-      cff_index_forget_element( &cff->charstrings_index, pointer );
-    }
-  }
-
-
-#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, 0 );
-      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, 0 );
-      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.   */
-  /*                                                                       */
-  /*    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           seed;
-    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;
-
-    /* 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(( " %.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   += 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:
-          /* 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 )
-            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_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 = 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_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 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /**********                                                      *********/
-  /**********                                                      *********/
-  /**********            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.                                         *********/
-  /**********                                                      *********/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-#if 0 /* unused until we support pure CFF fonts */
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_compute_max_advance( TT_Face  face,
-                           FT_Int*  max_advance )
-  {
-    FT_Error     error = FT_Err_Ok;
-    CFF_Decoder  decoder;
-    FT_Int       glyph_index;
-    CFF_Font     cff = (CFF_Font)face->other;
-
-
-    *max_advance = 0;
-
-    /* Initialize load decoder */
-    cff_decoder_init( &decoder, face, 0, 0, 0, 0 );
-
-    decoder.builder.metrics_only = 1;
-    decoder.builder.load_points  = 0;
-
-    /* For each glyph, parse the glyph charstring and extract */
-    /* the advance width.                                     */
-    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
-          glyph_index++ )
-    {
-      FT_Byte*  charstring;
-      FT_ULong  charstring_len;
-
-
-      /* now get load the unscaled outline */
-      error = cff_get_glyph_data( face, glyph_index,
-                                  &charstring, &charstring_len );
-      if ( !error )
-      {
-        error = cff_decoder_prepare( &decoder, size, glyph_index );
-        if ( !error )
-          error = cff_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len,
-                                                 0 );
-
-        cff_free_glyph_data( face, &charstring, &charstring_len );
-      }
-
-      /* ignore the error if one has occurred -- skip to next glyph */
-      error = FT_Err_Ok;
-    }
-
-    *max_advance = decoder.builder.advance.x;
-
-    return FT_Err_Ok;
-  }
-
-
-#endif /* 0 */
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_slot_load( CFF_GlyphSlot  glyph,
-                 CFF_Size       size,
-                 FT_UInt        glyph_index,
-                 FT_Int32       load_flags )
-  {
-    FT_Error     error;
-    CFF_Decoder  decoder;
-    TT_Face      face = (TT_Face)glyph->root.face;
-    FT_Bool      hinting, scaled, force_scaling;
-    CFF_Font     cff  = (CFF_Font)face->extra.data;
-
-    FT_Matrix    font_matrix;
-    FT_Vector    font_offset;
-
-
-    force_scaling = FALSE;
-
-    /* in a CID-keyed font, consider `glyph_index' as a CID and map */
-    /* it immediately to the real glyph_index -- if it isn't a      */
-    /* subsetted font, glyph_indices and CIDs are identical, though */
-    if ( cff->top_font.font_dict.cid_registry != 0xFFFFU &&
-         cff->charset.cids                               )
-    {
-      /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */
-      if ( glyph_index != 0 )
-      {
-        glyph_index = cff_charset_cid_to_gindex( &cff->charset,
-                                                 glyph_index );
-        if ( glyph_index == 0 )
-          return FT_THROW( Invalid_Argument );
-      }
-    }
-    else if ( glyph_index >= cff->num_glyphs )
-      return FT_THROW( Invalid_Argument );
-
-    if ( load_flags & FT_LOAD_NO_RECURSE )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    glyph->x_scale = 0x10000L;
-    glyph->y_scale = 0x10000L;
-    if ( size )
-    {
-      glyph->x_scale = size->root.metrics.x_scale;
-      glyph->y_scale = size->root.metrics.y_scale;
-    }
-
-#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. */
-    if ( size )
-    {
-      CFF_Face      cff_face = (CFF_Face)size->root.face;
-      SFNT_Service  sfnt     = (SFNT_Service)cff_face->sfnt;
-      FT_Stream     stream   = cff_face->root.stream;
-
-
-      if ( size->strike_index != 0xFFFFFFFFUL      &&
-           sfnt->load_eblc                         &&
-           ( load_flags & FT_LOAD_NO_BITMAP ) == 0 )
-      {
-        TT_SBit_MetricsRec  metrics;
-
-
-        error = sfnt->load_sbit_image( face,
-                                       size->strike_index,
-                                       glyph_index,
-                                       (FT_UInt)load_flags,
-                                       stream,
-                                       &glyph->root.bitmap,
-                                       &metrics );
-
-        if ( !error )
-        {
-          FT_Bool    has_vertical_info;
-          FT_UShort  advance;
-          FT_Short   dummy;
-
-
-          glyph->root.outline.n_points   = 0;
-          glyph->root.outline.n_contours = 0;
-
-          glyph->root.metrics.width  = (FT_Pos)metrics.width  << 6;
-          glyph->root.metrics.height = (FT_Pos)metrics.height << 6;
-
-          glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6;
-          glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6;
-          glyph->root.metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  << 6;
-
-          glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6;
-          glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6;
-          glyph->root.metrics.vertAdvance  = (FT_Pos)metrics.vertAdvance  << 6;
-
-          glyph->root.format = FT_GLYPH_FORMAT_BITMAP;
-
-          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-          {
-            glyph->root.bitmap_left = metrics.vertBearingX;
-            glyph->root.bitmap_top  = metrics.vertBearingY;
-          }
-          else
-          {
-            glyph->root.bitmap_left = metrics.horiBearingX;
-            glyph->root.bitmap_top  = metrics.horiBearingY;
-          }
-
-          /* compute linear advance widths */
-
-          (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
-                                                           glyph_index,
-                                                           &dummy,
-                                                           &advance );
-          glyph->root.linearHoriAdvance = advance;
-
-          has_vertical_info = FT_BOOL(
-                                face->vertical_info                   &&
-                                face->vertical.number_Of_VMetrics > 0 );
-
-          /* get the vertical metrics from the vmtx table if we have one */
-          if ( has_vertical_info )
-          {
-            (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
-                                                             glyph_index,
-                                                             &dummy,
-                                                             &advance );
-            glyph->root.linearVertAdvance = advance;
-          }
-          else
-          {
-            /* make up vertical ones */
-            if ( face->os2.version != 0xFFFFU )
-              glyph->root.linearVertAdvance = (FT_Pos)
-                ( face->os2.sTypoAscender - face->os2.sTypoDescender );
-            else
-              glyph->root.linearVertAdvance = (FT_Pos)
-                ( face->horizontal.Ascender - face->horizontal.Descender );
-          }
-
-          return error;
-        }
-      }
-    }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-    /* return immediately if we only want the embedded bitmaps */
-    if ( load_flags & FT_LOAD_SBITS_ONLY )
-      return FT_THROW( Invalid_Argument );
-
-    /* if we have a CID subfont, use its matrix (which has already */
-    /* been multiplied with the root matrix)                       */
-
-    /* this scaling is only relevant if the PS hinter isn't active */
-    if ( cff->num_subfonts )
-    {
-      FT_Long  top_upm, sub_upm;
-      FT_Byte  fd_index = cff_fd_select_get( &cff->fd_select,
-                                             glyph_index );
-
-
-      if ( fd_index >= cff->num_subfonts )
-        fd_index = (FT_Byte)( cff->num_subfonts - 1 );
-
-      top_upm = (FT_Long)cff->top_font.font_dict.units_per_em;
-      sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em;
-
-
-      font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix;
-      font_offset = cff->subfonts[fd_index]->font_dict.font_offset;
-
-      if ( top_upm != sub_upm )
-      {
-        glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm );
-        glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm );
-
-        force_scaling = TRUE;
-      }
-    }
-    else
-    {
-      font_matrix = cff->top_font.font_dict.font_matrix;
-      font_offset = cff->top_font.font_dict.font_offset;
-    }
-
-    glyph->root.outline.n_points   = 0;
-    glyph->root.outline.n_contours = 0;
-
-    /* top-level code ensures that FT_LOAD_NO_HINTING is set */
-    /* if FT_LOAD_NO_SCALE is active                         */
-    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
-    scaled  = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 );
-
-    glyph->hint        = hinting;
-    glyph->scaled      = scaled;
-    glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;  /* by default */
-
-    {
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-      CFF_Driver  driver = (CFF_Driver)FT_FACE_DRIVER( face );
-#endif
-
-
-      FT_Byte*  charstring;
-      FT_ULong  charstring_len;
-
-
-      cff_decoder_init( &decoder, face, size, glyph, hinting,
-                        FT_LOAD_TARGET_MODE( load_flags ) );
-
-      /* this is for pure CFFs */
-      if ( load_flags & FT_LOAD_ADVANCE_ONLY )
-        decoder.width_only = TRUE;
-
-      decoder.builder.no_recurse =
-        (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE );
-
-      /* now load the unscaled outline */
-      error = cff_get_glyph_data( face, glyph_index,
-                                  &charstring, &charstring_len );
-      if ( error )
-        goto Glyph_Build_Finished;
-
-      error = cff_decoder_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,
-                                               0 );
-      else
-#endif
-      {
-        error = cf2_decoder_parse_charstrings( &decoder,
-                                               charstring,
-                                               charstring_len );
-
-        /* 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)         */
-          hinting       = FALSE;
-          force_scaling = TRUE;
-          glyph->hint   = hinting;
-
-          error = cf2_decoder_parse_charstrings( &decoder,
-                                                 charstring,
-                                                 charstring_len );
-        }
-      }
-
-      cff_free_glyph_data( face, &charstring, charstring_len );
-
-      if ( error )
-        goto Glyph_Build_Finished;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-      /* Control data and length may not be available for incremental */
-      /* fonts.                                                       */
-      if ( face->root.internal->incremental_interface )
-      {
-        glyph->root.control_data = NULL;
-        glyph->root.control_len = 0;
-      }
-      else
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-      /* We set control_data and control_len if charstrings is loaded. */
-      /* See how charstring loads at cff_index_access_element() in     */
-      /* cffload.c.                                                    */
-      {
-        CFF_Index  csindex = &cff->charstrings_index;
-
-
-        if ( csindex->offsets )
-        {
-          glyph->root.control_data = csindex->bytes +
-                                     csindex->offsets[glyph_index] - 1;
-          glyph->root.control_len  = (FT_Long)charstring_len;
-        }
-      }
-
-  Glyph_Build_Finished:
-      /* save new glyph tables, if no error */
-      if ( !error )
-        cff_builder_done( &decoder.builder );
-      /* XXX: anything to do for broken glyph entry? */
-    }
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* Incremental fonts can optionally override the metrics. */
-    if ( !error                                                               &&
-         face->root.internal->incremental_interface                           &&
-         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
-    {
-      FT_Incremental_MetricsRec  metrics;
-
-
-      metrics.bearing_x = decoder.builder.left_bearing.x;
-      metrics.bearing_y = 0;
-      metrics.advance   = decoder.builder.advance.x;
-      metrics.advance_v = decoder.builder.advance.y;
-
-      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
-                face->root.internal->incremental_interface->object,
-                glyph_index, FALSE, &metrics );
-
-      decoder.builder.left_bearing.x = metrics.bearing_x;
-      decoder.builder.advance.x      = metrics.advance;
-      decoder.builder.advance.y      = metrics.advance_v;
-    }
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    if ( !error )
-    {
-      /* Now, set the metrics -- this is rather simple, as   */
-      /* the left side bearing is the xMin, and the top side */
-      /* bearing the yMax.                                   */
-
-      /* For composite glyphs, return only left side bearing and */
-      /* advance width.                                          */
-      if ( load_flags & FT_LOAD_NO_RECURSE )
-      {
-        FT_Slot_Internal  internal = glyph->root.internal;
-
-
-        glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x;
-        glyph->root.metrics.horiAdvance  = decoder.glyph_width;
-        internal->glyph_matrix           = font_matrix;
-        internal->glyph_delta            = font_offset;
-        internal->glyph_transformed      = 1;
-      }
-      else
-      {
-        FT_BBox            cbox;
-        FT_Glyph_Metrics*  metrics = &glyph->root.metrics;
-        FT_Bool            has_vertical_info;
-
-
-        if ( face->horizontal.number_Of_HMetrics )
-        {
-          FT_Short   horiBearingX = 0;
-          FT_UShort  horiAdvance  = 0;
-
-
-          ( (SFNT_Service)face->sfnt )->get_metrics( face, 0,
-                                                     glyph_index,
-                                                     &horiBearingX,
-                                                     &horiAdvance );
-          metrics->horiAdvance          = horiAdvance;
-          metrics->horiBearingX         = horiBearingX;
-          glyph->root.linearHoriAdvance = horiAdvance;
-        }
-        else
-        {
-          /* copy the _unscaled_ advance width */
-          metrics->horiAdvance          = decoder.glyph_width;
-          glyph->root.linearHoriAdvance = decoder.glyph_width;
-        }
-
-        glyph->root.internal->glyph_transformed = 0;
-
-        has_vertical_info = FT_BOOL( face->vertical_info                   &&
-                                     face->vertical.number_Of_VMetrics > 0 );
-
-        /* get the vertical metrics from the vmtx table if we have one */
-        if ( has_vertical_info )
-        {
-          FT_Short   vertBearingY = 0;
-          FT_UShort  vertAdvance  = 0;
-
-
-          ( (SFNT_Service)face->sfnt )->get_metrics( face, 1,
-                                                     glyph_index,
-                                                     &vertBearingY,
-                                                     &vertAdvance );
-          metrics->vertBearingY = vertBearingY;
-          metrics->vertAdvance  = vertAdvance;
-        }
-        else
-        {
-          /* make up vertical ones */
-          if ( face->os2.version != 0xFFFFU )
-            metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender -
-                                             face->os2.sTypoDescender );
-          else
-            metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender -
-                                             face->horizontal.Descender );
-        }
-
-        glyph->root.linearVertAdvance = metrics->vertAdvance;
-
-        glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
-
-        glyph->root.outline.flags = 0;
-        if ( size && size->root.metrics.y_ppem < 24 )
-          glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
-        glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
-        /* 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 );
-
-          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 );
-
-          metrics->horiAdvance += font_offset.x;
-          metrics->vertAdvance += font_offset.y;
-        }
-
-        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling )
-        {
-          /* scale the outline and the metrics */
-          FT_Int       n;
-          FT_Outline*  cur     = &glyph->root.outline;
-          FT_Vector*   vec     = cur->points;
-          FT_Fixed     x_scale = glyph->x_scale;
-          FT_Fixed     y_scale = glyph->y_scale;
-
-
-          /* First of all, scale the points */
-          if ( !hinting || !decoder.builder.hints_funcs )
-            for ( n = cur->n_points; n > 0; n--, vec++ )
-            {
-              vec->x = FT_MulFix( vec->x, x_scale );
-              vec->y = FT_MulFix( vec->y, y_scale );
-            }
-
-          /* Then scale the metrics */
-          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
-          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
-        }
-
-        /* compute the other metrics */
-        FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
-
-        metrics->width  = cbox.xMax - cbox.xMin;
-        metrics->height = cbox.yMax - cbox.yMin;
-
-        metrics->horiBearingX = cbox.xMin;
-        metrics->horiBearingY = cbox.yMax;
-
-        if ( has_vertical_info )
-          metrics->vertBearingX = metrics->horiBearingX -
-                                    metrics->horiAdvance / 2;
-        else
-        {
-          if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-            ft_synthesize_vertical_metrics( metrics,
-                                            metrics->vertAdvance );
-        }
-      }
-    }
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffgload.h b/third_party/freetype/src/cff/cffgload.h
deleted file mode 100644
index 0fa93b4..0000000
--- a/third_party/freetype/src/cff/cffgload.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffgload.h                                                             */
-/*                                                                         */
-/*    OpenType Glyph Loader (specification).                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CFFGLOAD_H_
-#define CFFGLOAD_H_
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include "cffobjs.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,
-                      FT_Byte**  pointer,
-                      FT_ULong*  length );
-  FT_LOCAL( void )
-  cff_free_glyph_data( TT_Face    face,
-                       FT_Byte**  pointer,
-                       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 */
-  FT_LOCAL( FT_Error )
-  cff_compute_max_advance( TT_Face  face,
-                           FT_Int*  max_advance );
-
-#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,
-                                 FT_Bool       in_dict );
-#endif
-
-  FT_LOCAL( FT_Error )
-  cff_slot_load( CFF_GlyphSlot  glyph,
-                 CFF_Size       size,
-                 FT_UInt        glyph_index,
-                 FT_Int32       load_flags );
-
-
-FT_END_HEADER
-
-#endif /* CFFGLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffload.c b/third_party/freetype/src/cff/cffload.c
deleted file mode 100644
index 935e612..0000000
--- a/third_party/freetype/src/cff/cffload.c
+++ /dev/null
@@ -1,2466 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffload.c                                                              */
-/*                                                                         */
-/*    OpenType and CFF data/program tables loader (body).                  */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_TYPE1_TABLES_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"
-
-#include "cfferrs.h"
-
-
-#define FT_FIXED_ONE  ( (FT_Fixed)0x10000 )
-
-
-#if 1
-
-  static const FT_UShort  cff_isoadobe_charset[229] =
-  {
-      0,   1,   2,   3,   4,   5,   6,   7,
-      8,   9,  10,  11,  12,  13,  14,  15,
-     16,  17,  18,  19,  20,  21,  22,  23,
-     24,  25,  26,  27,  28,  29,  30,  31,
-     32,  33,  34,  35,  36,  37,  38,  39,
-     40,  41,  42,  43,  44,  45,  46,  47,
-     48,  49,  50,  51,  52,  53,  54,  55,
-     56,  57,  58,  59,  60,  61,  62,  63,
-     64,  65,  66,  67,  68,  69,  70,  71,
-     72,  73,  74,  75,  76,  77,  78,  79,
-     80,  81,  82,  83,  84,  85,  86,  87,
-     88,  89,  90,  91,  92,  93,  94,  95,
-     96,  97,  98,  99, 100, 101, 102, 103,
-    104, 105, 106, 107, 108, 109, 110, 111,
-    112, 113, 114, 115, 116, 117, 118, 119,
-    120, 121, 122, 123, 124, 125, 126, 127,
-    128, 129, 130, 131, 132, 133, 134, 135,
-    136, 137, 138, 139, 140, 141, 142, 143,
-    144, 145, 146, 147, 148, 149, 150, 151,
-    152, 153, 154, 155, 156, 157, 158, 159,
-    160, 161, 162, 163, 164, 165, 166, 167,
-    168, 169, 170, 171, 172, 173, 174, 175,
-    176, 177, 178, 179, 180, 181, 182, 183,
-    184, 185, 186, 187, 188, 189, 190, 191,
-    192, 193, 194, 195, 196, 197, 198, 199,
-    200, 201, 202, 203, 204, 205, 206, 207,
-    208, 209, 210, 211, 212, 213, 214, 215,
-    216, 217, 218, 219, 220, 221, 222, 223,
-    224, 225, 226, 227, 228
-  };
-
-  static const FT_UShort  cff_expert_charset[166] =
-  {
-      0,   1, 229, 230, 231, 232, 233, 234,
-    235, 236, 237, 238,  13,  14,  15,  99,
-    239, 240, 241, 242, 243, 244, 245, 246,
-    247, 248,  27,  28, 249, 250, 251, 252,
-    253, 254, 255, 256, 257, 258, 259, 260,
-    261, 262, 263, 264, 265, 266, 109, 110,
-    267, 268, 269, 270, 271, 272, 273, 274,
-    275, 276, 277, 278, 279, 280, 281, 282,
-    283, 284, 285, 286, 287, 288, 289, 290,
-    291, 292, 293, 294, 295, 296, 297, 298,
-    299, 300, 301, 302, 303, 304, 305, 306,
-    307, 308, 309, 310, 311, 312, 313, 314,
-    315, 316, 317, 318, 158, 155, 163, 319,
-    320, 321, 322, 323, 324, 325, 326, 150,
-    164, 169, 327, 328, 329, 330, 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
-  };
-
-  static const FT_UShort  cff_expertsubset_charset[87] =
-  {
-      0,   1, 231, 232, 235, 236, 237, 238,
-     13,  14,  15,  99, 239, 240, 241, 242,
-    243, 244, 245, 246, 247, 248,  27,  28,
-    249, 250, 251, 253, 254, 255, 256, 257,
-    258, 259, 260, 261, 262, 263, 264, 265,
-    266, 109, 110, 267, 268, 269, 270, 272,
-    300, 301, 302, 305, 314, 315, 158, 155,
-    163, 320, 321, 322, 323, 324, 325, 326,
-    150, 164, 169, 327, 328, 329, 330, 331,
-    332, 333, 334, 335, 336, 337, 338, 339,
-    340, 341, 342, 343, 344, 345, 346
-  };
-
-  static const FT_UShort  cff_standard_encoding[256] =
-  {
-      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,
-      1,   2,   3,   4,   5,   6,   7,   8,
-      9,  10,  11,  12,  13,  14,  15,  16,
-     17,  18,  19,  20,  21,  22,  23,  24,
-     25,  26,  27,  28,  29,  30,  31,  32,
-     33,  34,  35,  36,  37,  38,  39,  40,
-     41,  42,  43,  44,  45,  46,  47,  48,
-     49,  50,  51,  52,  53,  54,  55,  56,
-     57,  58,  59,  60,  61,  62,  63,  64,
-     65,  66,  67,  68,  69,  70,  71,  72,
-     73,  74,  75,  76,  77,  78,  79,  80,
-     81,  82,  83,  84,  85,  86,  87,  88,
-     89,  90,  91,  92,  93,  94,  95,   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,   0,
-      0,  96,  97,  98,  99, 100, 101, 102,
-    103, 104, 105, 106, 107, 108, 109, 110,
-      0, 111, 112, 113, 114,   0, 115, 116,
-    117, 118, 119, 120, 121, 122,   0, 123,
-      0, 124, 125, 126, 127, 128, 129, 130,
-    131,   0, 132, 133,   0, 134, 135, 136,
-    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
-  };
-
-  static const FT_UShort  cff_expert_encoding[256] =
-  {
-      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,
-      1, 229, 230,   0, 231, 232, 233, 234,
-    235, 236, 237, 238,  13,  14,  15,  99,
-    239, 240, 241, 242, 243, 244, 245, 246,
-    247, 248,  27,  28, 249, 250, 251, 252,
-      0, 253, 254, 255, 256, 257,   0,   0,
-      0, 258,   0,   0, 259, 260, 261, 262,
-      0,   0, 263, 264, 265,   0, 266, 109,
-    110, 267, 268, 269,   0, 270, 271, 272,
-    273, 274, 275, 276, 277, 278, 279, 280,
-    281, 282, 283, 284, 285, 286, 287, 288,
-    289, 290, 291, 292, 293, 294, 295, 296,
-    297, 298, 299, 300, 301, 302, 303,   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,   0,
-      0, 304, 305, 306,   0,   0, 307, 308,
-    309, 310, 311,   0, 312,   0,   0, 312,
-      0,   0, 314, 315,   0,   0, 316, 317,
-    318,   0,   0,   0, 158, 155, 163, 319,
-    320, 321, 322, 323, 324, 325,   0,   0,
-    326, 150, 164, 169, 327, 328, 329, 330,
-    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 /* 1 */
-
-
-  FT_LOCAL_DEF( FT_UShort )
-  cff_get_standard_encoding( FT_UInt  charcode )
-  {
-    return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode]
-                                       : 0 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_cffload
-
-
-  /* read an offset from the index's stream current position */
-  static FT_ULong
-  cff_index_read_offset( CFF_Index  idx,
-                         FT_Error  *errorp )
-  {
-    FT_Error   error;
-    FT_Stream  stream = idx->stream;
-    FT_Byte    tmp[4];
-    FT_ULong   result = 0;
-
-
-    if ( !FT_STREAM_READ( tmp, idx->off_size ) )
-    {
-      FT_Int  nn;
-
-
-      for ( nn = 0; nn < idx->off_size; nn++ )
-        result = ( result << 8 ) | tmp[nn];
-    }
-
-    *errorp = error;
-    return result;
-  }
-
-
-  static FT_Error
-  cff_index_init( CFF_Index  idx,
-                  FT_Stream  stream,
-                  FT_Bool    load,
-                  FT_Bool    cff2 )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-    FT_UInt    count;
-
-
-    FT_ZERO( idx );
-
-    idx->stream = stream;
-    idx->start  = FT_STREAM_POS();
-
-    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;
-
-
-      /* there is at least one element; read the offset size,           */
-      /* then access the offset table to compute the index's total size */
-      if ( FT_READ_BYTE( offsize ) )
-        goto Exit;
-
-      if ( offsize < 1 || offsize > 4 )
-      {
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
-      }
-
-      idx->count    = count;
-      idx->off_size = offsize;
-      size          = (FT_ULong)( count + 1 ) * offsize;
-
-      idx->data_offset = idx->start + idx->hdr_size + size;
-
-      if ( FT_STREAM_SKIP( size - offsize ) )
-        goto Exit;
-
-      size = cff_index_read_offset( idx, &error );
-      if ( error )
-        goto Exit;
-
-      if ( size == 0 )
-      {
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
-      }
-
-      idx->data_size = --size;
-
-      if ( load )
-      {
-        /* load the data */
-        if ( FT_FRAME_EXTRACT( size, idx->bytes ) )
-          goto Exit;
-      }
-      else
-      {
-        /* skip the data */
-        if ( FT_STREAM_SKIP( size ) )
-          goto Exit;
-      }
-    }
-
-  Exit:
-    if ( error )
-      FT_FREE( idx->offsets );
-
-    return error;
-  }
-
-
-  static void
-  cff_index_done( CFF_Index  idx )
-  {
-    if ( idx->stream )
-    {
-      FT_Stream  stream = idx->stream;
-      FT_Memory  memory = stream->memory;
-
-
-      if ( idx->bytes )
-        FT_FRAME_RELEASE( idx->bytes );
-
-      FT_FREE( idx->offsets );
-      FT_ZERO( idx );
-    }
-  }
-
-
-  static FT_Error
-  cff_index_load_offsets( CFF_Index  idx )
-  {
-    FT_Error   error  = FT_Err_Ok;
-    FT_Stream  stream = idx->stream;
-    FT_Memory  memory = stream->memory;
-
-
-    if ( idx->count > 0 && !idx->offsets )
-    {
-      FT_Byte    offsize = idx->off_size;
-      FT_ULong   data_size;
-      FT_Byte*   p;
-      FT_Byte*   p_end;
-      FT_ULong*  poff;
-
-
-      data_size = (FT_ULong)( idx->count + 1 ) * offsize;
-
-      if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) ||
-           FT_STREAM_SEEK( idx->start + idx->hdr_size ) ||
-           FT_FRAME_ENTER( data_size )                  )
-        goto Exit;
-
-      poff   = idx->offsets;
-      p      = (FT_Byte*)stream->cursor;
-      p_end  = p + data_size;
-
-      switch ( offsize )
-      {
-      case 1:
-        for ( ; p < p_end; p++, poff++ )
-          poff[0] = p[0];
-        break;
-
-      case 2:
-        for ( ; p < p_end; p += 2, poff++ )
-          poff[0] = FT_PEEK_USHORT( p );
-        break;
-
-      case 3:
-        for ( ; p < p_end; p += 3, poff++ )
-          poff[0] = FT_PEEK_UOFF3( p );
-        break;
-
-      default:
-        for ( ; p < p_end; p += 4, poff++ )
-          poff[0] = FT_PEEK_ULONG( p );
-      }
-
-      FT_FRAME_EXIT();
-    }
-
-  Exit:
-    if ( error )
-      FT_FREE( idx->offsets );
-
-    return error;
-  }
-
-
-  /* Allocate a table containing pointers to an index's elements. */
-  /* The `pool' argument makes this function convert the index    */
-  /* entries to C-style strings (this is, NULL-terminated).       */
-  static FT_Error
-  cff_index_get_pointers( CFF_Index   idx,
-                          FT_Byte***  table,
-                          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 )
-    {
-      error = cff_index_load_offsets( idx );
-      if ( error )
-        goto Exit;
-    }
-
-    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;
-      FT_Byte*  org_bytes = idx->bytes;
-
-
-      /* at this point, `idx->offsets' can't be NULL */
-      cur_offset = idx->offsets[0] - 1;
-
-      /* sanity check */
-      if ( cur_offset != 0 )
-      {
-        FT_TRACE0(( "cff_index_get_pointers:"
-                    " invalid first offset value %d set to zero\n",
-                    cur_offset ));
-        cur_offset = 0;
-      }
-
-      if ( !pool )
-        t[0] = org_bytes + cur_offset;
-      else
-        t[0] = new_bytes + cur_offset;
-
-      for ( n = 1; n <= idx->count; n++ )
-      {
-        FT_ULong  next_offset = idx->offsets[n] - 1;
-
-
-        /* two sanity checks for invalid offset tables */
-        if ( next_offset < cur_offset )
-          next_offset = cur_offset;
-        else if ( next_offset > idx->data_size )
-          next_offset = idx->data_size;
-
-        if ( !pool )
-          t[n] = org_bytes + next_offset;
-        else
-        {
-          t[n] = new_bytes + next_offset + extra;
-
-          if ( next_offset != cur_offset )
-          {
-            FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] );
-            t[n][0] = '\0';
-            t[n]   += 1;
-            extra++;
-          }
-        }
-
-        cur_offset = next_offset;
-      }
-      *table = t;
-
-      if ( pool )
-        *pool = new_bytes;
-      if ( pool_size )
-        *pool_size = new_size;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_index_access_element( CFF_Index  idx,
-                            FT_UInt    element,
-                            FT_Byte**  pbytes,
-                            FT_ULong*  pbyte_len )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( idx && idx->count > element )
-    {
-      /* compute start and end offsets */
-      FT_Stream  stream = idx->stream;
-      FT_ULong   off1, off2 = 0;
-
-
-      /* load offsets from file or the offset table */
-      if ( !idx->offsets )
-      {
-        FT_ULong  pos = element * idx->off_size;
-
-
-        if ( FT_STREAM_SEEK( idx->start + idx->hdr_size + pos ) )
-          goto Exit;
-
-        off1 = cff_index_read_offset( idx, &error );
-        if ( error )
-          goto Exit;
-
-        if ( off1 != 0 )
-        {
-          do
-          {
-            element++;
-            off2 = cff_index_read_offset( idx, &error );
-
-          } while ( off2 == 0 && element < idx->count );
-        }
-      }
-      else   /* use offsets table */
-      {
-        off1 = idx->offsets[element];
-        if ( off1 )
-        {
-          do
-          {
-            element++;
-            off2 = idx->offsets[element];
-
-          } while ( off2 == 0 && element < idx->count );
-        }
-      }
-
-      /* XXX: should check off2 does not exceed the end of this entry; */
-      /*      at present, only truncate off2 at the end of this stream */
-      if ( off2 > stream->size + 1                    ||
-           idx->data_offset > stream->size - off2 + 1 )
-      {
-        FT_ERROR(( "cff_index_access_element:"
-                   " offset to next entry (%d)"
-                   " exceeds the end of stream (%d)\n",
-                   off2, stream->size - idx->data_offset + 1 ));
-        off2 = stream->size - idx->data_offset + 1;
-      }
-
-      /* access element */
-      if ( off1 && off2 > off1 )
-      {
-        *pbyte_len = off2 - off1;
-
-        if ( idx->bytes )
-        {
-          /* this index was completely loaded in memory, that's easy */
-          *pbytes = idx->bytes + off1 - 1;
-        }
-        else
-        {
-          /* this index is still on disk/file, access it through a frame */
-          if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) ||
-               FT_FRAME_EXTRACT( off2 - off1, *pbytes )      )
-            goto Exit;
-        }
-      }
-      else
-      {
-        /* empty index element */
-        *pbytes    = 0;
-        *pbyte_len = 0;
-      }
-    }
-    else
-      error = FT_THROW( Invalid_Argument );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_index_forget_element( CFF_Index  idx,
-                            FT_Byte**  pbytes )
-  {
-    if ( idx->bytes == 0 )
-    {
-      FT_Stream  stream = idx->stream;
-
-
-      FT_FRAME_RELEASE( *pbytes );
-    }
-  }
-
-
-  /* get an entry from Name INDEX */
-  FT_LOCAL_DEF( FT_String* )
-  cff_index_get_name( CFF_Font  font,
-                      FT_UInt   element )
-  {
-    CFF_Index   idx = &font->name_index;
-    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 ) )
-    {
-      if ( byte_len )
-        FT_MEM_COPY( name, bytes, byte_len );
-      name[byte_len] = 0;
-    }
-    cff_index_forget_element( idx, &bytes );
-
-  Exit:
-    return name;
-  }
-
-
-  /* get an entry from String INDEX */
-  FT_LOCAL_DEF( FT_String* )
-  cff_index_get_string( CFF_Font  font,
-                        FT_UInt   element )
-  {
-    return ( element < font->num_strings )
-             ? (FT_String*)font->strings[element]
-             : NULL;
-  }
-
-
-  FT_LOCAL_DEF( FT_String* )
-  cff_index_get_sid_string( CFF_Font  font,
-                            FT_UInt   sid )
-  {
-    /* value 0xFFFFU indicates a missing dictionary entry */
-    if ( sid == 0xFFFFU )
-      return NULL;
-
-    /* if it is not a standard string, return it */
-    if ( sid > 390 )
-      return cff_index_get_string( font, sid - 391 );
-
-    /* CID-keyed CFF fonts don't have glyph names */
-    if ( !font->psnames )
-      return NULL;
-
-    /* this is a standard string */
-    return (FT_String *)font->psnames->adobe_std_strings( sid );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***   FD Select table support                                         ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  static void
-  CFF_Done_FD_Select( CFF_FDSelect  fdselect,
-                      FT_Stream     stream )
-  {
-    if ( fdselect->data )
-      FT_FRAME_RELEASE( fdselect->data );
-
-    fdselect->data_size   = 0;
-    fdselect->format      = 0;
-    fdselect->range_count = 0;
-  }
-
-
-  static FT_Error
-  CFF_Load_FD_Select( CFF_FDSelect  fdselect,
-                      FT_UInt       num_glyphs,
-                      FT_Stream     stream,
-                      FT_ULong      offset )
-  {
-    FT_Error  error;
-    FT_Byte   format;
-    FT_UInt   num_ranges;
-
-
-    /* read format */
-    if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) )
-      goto Exit;
-
-    fdselect->format      = format;
-    fdselect->cache_count = 0;   /* clear cache */
-
-    switch ( format )
-    {
-    case 0:     /* format 0, that's simple */
-      fdselect->data_size = num_glyphs;
-      goto Load_Data;
-
-    case 3:     /* format 3, a tad more complex */
-      if ( FT_READ_USHORT( num_ranges ) )
-        goto Exit;
-
-      if ( !num_ranges )
-      {
-        FT_TRACE0(( "CFF_Load_FD_Select: empty FDSelect array\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      fdselect->data_size = num_ranges * 3 + 2;
-
-    Load_Data:
-      if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) )
-        goto Exit;
-      break;
-
-    default:    /* hmm... that's wrong */
-      error = FT_THROW( Invalid_File_Format );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Byte )
-  cff_fd_select_get( CFF_FDSelect  fdselect,
-                     FT_UInt       glyph_index )
-  {
-    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:
-      fd = fdselect->data[glyph_index];
-      break;
-
-    case 3:
-      /* first, compare to the cache */
-      if ( (FT_UInt)( glyph_index - fdselect->cache_first ) <
-                        fdselect->cache_count )
-      {
-        fd = fdselect->cache_fd;
-        break;
-      }
-
-      /* then, look up the ranges array */
-      {
-        FT_Byte*  p       = fdselect->data;
-        FT_Byte*  p_limit = p + fdselect->data_size;
-        FT_Byte   fd2;
-        FT_UInt   first, limit;
-
-
-        first = FT_NEXT_USHORT( p );
-        do
-        {
-          if ( glyph_index < first )
-            break;
-
-          fd2   = *p++;
-          limit = FT_NEXT_USHORT( p );
-
-          if ( glyph_index < limit )
-          {
-            fd = fd2;
-
-            /* update cache */
-            fdselect->cache_first = first;
-            fdselect->cache_count = limit - first;
-            fdselect->cache_fd    = fd2;
-            break;
-          }
-          first = limit;
-
-        } while ( p < p_limit );
-      }
-      break;
-
-    default:
-      ;
-    }
-
-  Exit:
-    return fd;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /***                                                                   ***/
-  /***   CFF font support                                                ***/
-  /***                                                                   ***/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static FT_Error
-  cff_charset_compute_cids( CFF_Charset  charset,
-                            FT_UInt      num_glyphs,
-                            FT_Memory    memory )
-  {
-    FT_Error   error   = FT_Err_Ok;
-    FT_UInt    i;
-    FT_Long    j;
-    FT_UShort  max_cid = 0;
-
-
-    if ( charset->max_cid > 0 )
-      goto Exit;
-
-    for ( i = 0; i < num_glyphs; i++ )
-    {
-      if ( charset->sids[i] > max_cid )
-        max_cid = charset->sids[i];
-    }
-
-    if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) )
-      goto Exit;
-
-    /* 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-- )
-      charset->cids[charset->sids[j]] = (FT_UShort)j;
-
-    charset->max_cid    = max_cid;
-    charset->num_glyphs = num_glyphs;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  cff_charset_cid_to_gindex( CFF_Charset  charset,
-                             FT_UInt      cid )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( cid <= charset->max_cid )
-      result = charset->cids[cid];
-
-    return result;
-  }
-
-
-  static void
-  cff_charset_free_cids( CFF_Charset  charset,
-                         FT_Memory    memory )
-  {
-    FT_FREE( charset->cids );
-    charset->max_cid = 0;
-  }
-
-
-  static void
-  cff_charset_done( CFF_Charset  charset,
-                    FT_Stream    stream )
-  {
-    FT_Memory  memory = stream->memory;
-
-
-    cff_charset_free_cids( charset, memory );
-
-    FT_FREE( charset->sids );
-    charset->format = 0;
-    charset->offset = 0;
-  }
-
-
-  static FT_Error
-  cff_charset_load( CFF_Charset  charset,
-                    FT_UInt      num_glyphs,
-                    FT_Stream    stream,
-                    FT_ULong     base_offset,
-                    FT_ULong     offset,
-                    FT_Bool      invert )
-  {
-    FT_Memory  memory = stream->memory;
-    FT_Error   error  = FT_Err_Ok;
-    FT_UShort  glyph_sid;
-
-
-    /* If the offset is greater than 2, we have to parse the charset */
-    /* table.                                                        */
-    if ( offset > 2 )
-    {
-      FT_UInt  j;
-
-
-      charset->offset = base_offset + offset;
-
-      /* Get the format of the table. */
-      if ( FT_STREAM_SEEK( charset->offset ) ||
-           FT_READ_BYTE( charset->format )   )
-        goto Exit;
-
-      /* Allocate memory for sids. */
-      if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
-        goto Exit;
-
-      /* assign the .notdef glyph */
-      charset->sids[0] = 0;
-
-      switch ( charset->format )
-      {
-      case 0:
-        if ( num_glyphs > 0 )
-        {
-          if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) )
-            goto Exit;
-
-          for ( j = 1; j < num_glyphs; j++ )
-            charset->sids[j] = FT_GET_USHORT();
-
-          FT_FRAME_EXIT();
-        }
-        break;
-
-      case 1:
-      case 2:
-        {
-          FT_UInt  nleft;
-          FT_UInt  i;
-
-
-          j = 1;
-
-          while ( j < num_glyphs )
-          {
-            /* Read the first glyph sid of the range. */
-            if ( FT_READ_USHORT( glyph_sid ) )
-              goto Exit;
-
-            /* Read the number of glyphs in the range.  */
-            if ( charset->format == 2 )
-            {
-              if ( FT_READ_USHORT( nleft ) )
-                goto Exit;
-            }
-            else
-            {
-              if ( FT_READ_BYTE( nleft ) )
-                goto Exit;
-            }
-
-            /* try to rescue some of the SIDs if `nleft' is too large */
-            if ( glyph_sid > 0xFFFFL - nleft )
-            {
-              FT_ERROR(( "cff_charset_load: invalid SID range trimmed"
-                         " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid ));
-              nleft = ( FT_UInt )( 0xFFFFL - glyph_sid );
-            }
-
-            /* Fill in the range of sids -- `nleft + 1' glyphs. */
-            for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ )
-              charset->sids[j] = glyph_sid;
-          }
-        }
-        break;
-
-      default:
-        FT_ERROR(( "cff_charset_load: invalid table format\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-    }
-    else
-    {
-      /* Parse default tables corresponding to offset == 0, 1, or 2.  */
-      /* CFF specification intimates the following:                   */
-      /*                                                              */
-      /* In order to use a predefined charset, the following must be  */
-      /* true: The charset constructed for the glyphs in the font's   */
-      /* charstrings dictionary must match the predefined charset in  */
-      /* the first num_glyphs.                                        */
-
-      charset->offset = offset;  /* record charset type */
-
-      switch ( (FT_UInt)offset )
-      {
-      case 0:
-        if ( num_glyphs > 229 )
-        {
-          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
-                     "predefined charset (Adobe ISO-Latin)\n" ));
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /* Allocate memory for sids. */
-        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
-          goto Exit;
-
-        /* Copy the predefined charset into the allocated memory. */
-        FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs );
-
-        break;
-
-      case 1:
-        if ( num_glyphs > 166 )
-        {
-          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
-                     "predefined charset (Adobe Expert)\n" ));
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /* Allocate memory for sids. */
-        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
-          goto Exit;
-
-        /* Copy the predefined charset into the allocated memory.     */
-        FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs );
-
-        break;
-
-      case 2:
-        if ( num_glyphs > 87 )
-        {
-          FT_ERROR(( "cff_charset_load: implicit charset larger than\n"
-                     "predefined charset (Adobe Expert Subset)\n" ));
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /* Allocate memory for sids. */
-        if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) )
-          goto Exit;
-
-        /* Copy the predefined charset into the allocated memory.     */
-        FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs );
-
-        break;
-
-      default:
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-    }
-
-    /* we have to invert the `sids' array for subsetted CID-keyed fonts */
-    if ( invert )
-      error = cff_charset_compute_cids( charset, num_glyphs, memory );
-
-  Exit:
-    /* Clean up if there was an error. */
-    if ( error )
-    {
-      FT_FREE( charset->sids );
-      FT_FREE( charset->cids );
-      charset->format = 0;
-      charset->offset = 0;
-      charset->sids   = 0;
-    }
-
-    return error;
-  }
-
-
-  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 args\n", count ));
-
-      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_Int32         sum;
-
-
-      /* convert inputs to 16.16 fixed point */
-      sum = cff_parse_num( parser, &parser->stack[i + base] ) * 65536;
-
-      for ( j = 1; j < blend->lenBV; j++ )
-        sum += FT_MulFix( *weight++,
-                          cff_parse_num( parser,
-                                         &parser->stack[delta++] ) * 65536 );
-
-      /* 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_UInt32)sum & 0xFF000000U ) >> 24;
-      *subFont->blend_top++ = ( (FT_UInt32)sum & 0x00FF0000U ) >> 16;
-      *subFont->blend_top++ = ( (FT_UInt32)sum & 0x0000FF00U ) >>  8;
-      *subFont->blend_top++ =   (FT_UInt32)sum & 0x000000FFU;
-    }
-
-    /* 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...). */
-      /*       In the normal case, initialize each component to 1   */
-      /*       before inner loop.                                   */
-      if ( lenNDV != 0 )
-        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;
-
-      blend->lenNDV = lenNDV;
-      FT_MEM_COPY( blend->lastNDV,
-                   NDV,
-                   lenNDV * sizeof ( *NDV ) );
-    }
-
-    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                                  &&
-           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_MM_Var*  *mm_var )
-  {
-    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->mm;
-
-
-    return mm->get_var_blend( FT_FACE( face ), num_coords, coords, mm_var );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_done_blend( CFF_Face  face )
-  {
-    FT_Service_MultiMasters  mm = (FT_Service_MultiMasters)face->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;
-    encoding->offset = 0;
-    encoding->count  = 0;
-  }
-
-
-  static FT_Error
-  cff_encoding_load( CFF_Encoding  encoding,
-                     CFF_Charset   charset,
-                     FT_UInt       num_glyphs,
-                     FT_Stream     stream,
-                     FT_ULong      base_offset,
-                     FT_ULong      offset )
-  {
-    FT_Error   error = FT_Err_Ok;
-    FT_UInt    count;
-    FT_UInt    j;
-    FT_UShort  glyph_sid;
-    FT_UInt    glyph_code;
-
-
-    /* Check for charset->sids.  If we do not have this, we fail. */
-    if ( !charset->sids )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    /* Zero out the code to gid/sid mappings. */
-    for ( j = 0; j < 256; j++ )
-    {
-      encoding->sids [j] = 0;
-      encoding->codes[j] = 0;
-    }
-
-    /* Note: The encoding table in a CFF font is indexed by glyph index;  */
-    /* the first encoded glyph index is 1.  Hence, we read the character  */
-    /* code (`glyph_code') at index j and make the assignment:            */
-    /*                                                                    */
-    /*    encoding->codes[glyph_code] = j + 1                             */
-    /*                                                                    */
-    /* We also make the assignment:                                       */
-    /*                                                                    */
-    /*    encoding->sids[glyph_code] = charset->sids[j + 1]               */
-    /*                                                                    */
-    /* This gives us both a code to GID and a code to SID mapping.        */
-
-    if ( offset > 1 )
-    {
-      encoding->offset = base_offset + offset;
-
-      /* we need to parse the table to determine its size */
-      if ( FT_STREAM_SEEK( encoding->offset ) ||
-           FT_READ_BYTE( encoding->format )   ||
-           FT_READ_BYTE( count )              )
-        goto Exit;
-
-      switch ( encoding->format & 0x7F )
-      {
-      case 0:
-        {
-          FT_Byte*  p;
-
-
-          /* By convention, GID 0 is always ".notdef" and is never */
-          /* coded in the font.  Hence, the number of codes found  */
-          /* in the table is `count+1'.                            */
-          /*                                                       */
-          encoding->count = count + 1;
-
-          if ( FT_FRAME_ENTER( count ) )
-            goto Exit;
-
-          p = (FT_Byte*)stream->cursor;
-
-          for ( j = 1; j <= count; j++ )
-          {
-            glyph_code = *p++;
-
-            /* Make sure j is not too big. */
-            if ( j < num_glyphs )
-            {
-              /* Assign code to GID mapping. */
-              encoding->codes[glyph_code] = (FT_UShort)j;
-
-              /* Assign code to SID mapping. */
-              encoding->sids[glyph_code] = charset->sids[j];
-            }
-          }
-
-          FT_FRAME_EXIT();
-        }
-        break;
-
-      case 1:
-        {
-          FT_UInt  nleft;
-          FT_UInt  i = 1;
-          FT_UInt  k;
-
-
-          encoding->count = 0;
-
-          /* Parse the Format1 ranges. */
-          for ( j = 0;  j < count; j++, i += nleft )
-          {
-            /* Read the first glyph code of the range. */
-            if ( FT_READ_BYTE( glyph_code ) )
-              goto Exit;
-
-            /* Read the number of codes in the range. */
-            if ( FT_READ_BYTE( nleft ) )
-              goto Exit;
-
-            /* Increment nleft, so we read `nleft + 1' codes/sids. */
-            nleft++;
-
-            /* compute max number of character codes */
-            if ( (FT_UInt)nleft > encoding->count )
-              encoding->count = nleft;
-
-            /* Fill in the range of codes/sids. */
-            for ( k = i; k < nleft + i; k++, glyph_code++ )
-            {
-              /* Make sure k is not too big. */
-              if ( k < num_glyphs && glyph_code < 256 )
-              {
-                /* Assign code to GID mapping. */
-                encoding->codes[glyph_code] = (FT_UShort)k;
-
-                /* Assign code to SID mapping. */
-                encoding->sids[glyph_code] = charset->sids[k];
-              }
-            }
-          }
-
-          /* simple check; one never knows what can be found in a font */
-          if ( encoding->count > 256 )
-            encoding->count = 256;
-        }
-        break;
-
-      default:
-        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      /* Parse supplemental encodings, if any. */
-      if ( encoding->format & 0x80 )
-      {
-        FT_UInt  gindex;
-
-
-        /* count supplements */
-        if ( FT_READ_BYTE( count ) )
-          goto Exit;
-
-        for ( j = 0; j < count; j++ )
-        {
-          /* Read supplemental glyph code. */
-          if ( FT_READ_BYTE( glyph_code ) )
-            goto Exit;
-
-          /* Read the SID associated with this glyph code. */
-          if ( FT_READ_USHORT( glyph_sid ) )
-            goto Exit;
-
-          /* Assign code to SID mapping. */
-          encoding->sids[glyph_code] = glyph_sid;
-
-          /* First, look up GID which has been assigned to */
-          /* SID glyph_sid.                                */
-          for ( gindex = 0; gindex < num_glyphs; gindex++ )
-          {
-            if ( charset->sids[gindex] == glyph_sid )
-            {
-              encoding->codes[glyph_code] = (FT_UShort)gindex;
-              break;
-            }
-          }
-        }
-      }
-    }
-    else
-    {
-      /* We take into account the fact a CFF font can use a predefined */
-      /* encoding without containing all of the glyphs encoded by this */
-      /* encoding (see the note at the end of section 12 in the CFF    */
-      /* specification).                                               */
-
-      switch ( (FT_UInt)offset )
-      {
-      case 0:
-        /* First, copy the code to SID mapping. */
-        FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 );
-        goto Populate;
-
-      case 1:
-        /* First, copy the code to SID mapping. */
-        FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 );
-
-      Populate:
-        /* Construct code to GID mapping from code to SID mapping */
-        /* and charset.                                           */
-
-        encoding->count = 0;
-
-        error = cff_charset_compute_cids( charset, num_glyphs,
-                                          stream->memory );
-        if ( error )
-          goto Exit;
-
-        for ( j = 0; j < 256; j++ )
-        {
-          FT_UInt  sid = encoding->sids[j];
-          FT_UInt  gid = 0;
-
-
-          if ( sid )
-            gid = cff_charset_cid_to_gindex( charset, sid );
-
-          if ( gid != 0 )
-          {
-            encoding->codes[j] = (FT_UShort)gid;
-            encoding->count    = j + 1;
-          }
-          else
-          {
-            encoding->codes[j] = 0;
-            encoding->sids [j] = 0;
-          }
-        }
-        break;
-
-      default:
-        FT_ERROR(( "cff_encoding_load: invalid table format\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-    }
-
-  Exit:
-
-    /* Clean up if there was an error. */
-    return error;
-  }
-
-
-  /* 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;
-
-    stackSize = font->cff2 ? font->top_font.font_dict.maxstack
-                           : 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;
-
-  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  subfont,
-                    CFF_Index    idx,
-                    FT_UInt      font_index,
-                    FT_Stream    stream,
-                    FT_ULong     base_offset,
-                    FT_UInt      code,
-                    CFF_Font     font )
-  {
-    FT_Error         error;
-    CFF_ParserRec    parser;
-    FT_Byte*         dict = NULL;
-    FT_ULong         dict_len;
-    CFF_FontRecDict  top  = &subfont->font_dict;
-    CFF_Private      priv = &subfont->private_dict;
-
-    FT_Bool  cff2      = FT_BOOL( code == CFF2_CODE_TOPDICT  ||
-                                  code == CFF2_CODE_FONTDICT );
-    FT_UInt  stackSize = cff2 ? CFF2_DEFAULT_STACK
-                              : CFF_MAX_STACK_DEPTH;
-
-
-    /* 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_ZERO( top );
-
-    top->underline_position  = -( 100L << 16 );
-    top->underline_thickness = 50L << 16;
-    top->charstring_type     = 2;
-    top->font_matrix.xx      = 0x10000L;
-    top->font_matrix.yy      = 0x10000L;
-    top->cid_count           = 8720;
-
-    /* we use the implementation specific SID value 0xFFFF to indicate */
-    /* missing entries                                                 */
-    top->version             = 0xFFFFU;
-    top->notice              = 0xFFFFU;
-    top->copyright           = 0xFFFFU;
-    top->full_name           = 0xFFFFU;
-    top->family_name         = 0xFFFFU;
-    top->weight              = 0xFFFFU;
-    top->embedded_postscript = 0xFFFFU;
-
-    top->cid_registry        = 0xFFFFU;
-    top->cid_ordering        = 0xFFFFU;
-    top->cid_font_name       = 0xFFFFU;
-
-    /* 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 );
-    }
-
-    /* clean up regardless of error */
-    if ( idx->count )
-      cff_index_forget_element( idx, &dict );
-    else
-      FT_FRAME_RELEASE( dict );
-
-    if ( error )
-      goto Exit;
-
-    /* if it is a CID font, we stop there */
-    if ( top->cid_registry != 0xFFFFU )
-      goto Exit;
-
-    /* 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;
-
-    /* read the local subrs, if any */
-    if ( priv->local_subrs_offset )
-    {
-      if ( FT_STREAM_SEEK( base_offset + top->private_offset +
-                           priv->local_subrs_offset ) )
-        goto Exit;
-
-      error = cff_index_init( &subfont->local_subrs_index, stream, 1, cff2 );
-      if ( error )
-        goto Exit;
-
-      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;
-  }
-
-
-  static void
-  cff_subfont_done( FT_Memory    memory,
-                    CFF_SubFont  subfont )
-  {
-    if ( subfont )
-    {
-      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 );
-    }
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_font_load( FT_Library library,
-                 FT_Stream  stream,
-                 FT_Int     face_index,
-                 CFF_Font   font,
-                 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( 3 ),
-        FT_FRAME_BYTE( version_major ),
-        FT_FRAME_BYTE( version_minor ),
-        FT_FRAME_BYTE( header_size ),
-      FT_FRAME_END
-    };
-
-    FT_Error         error;
-    FT_Memory        memory = stream->memory;
-    FT_ULong         base_offset;
-    CFF_FontRecDict  dict;
-    CFF_IndexRec     string_index;
-    FT_UInt          subfont_index;
-
-
-    FT_ZERO( font );
-    FT_ZERO( &string_index );
-
-    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;
-
-    if ( cff2 )
-    {
-      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_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;
-    }
-
-    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;
-      }
-
-      /* font names must not be empty */
-      if ( 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 & 0xFFFF );
-
-      if ( face_index > 0 && subfont_index >= font->name_index.count )
-      {
-        FT_ERROR(( "cff_font_load:"
-                   " invalid subfont index for pure CFF font (%d)\n",
-                   subfont_index ));
-        error = FT_THROW( Invalid_Argument );
-        goto Exit;
-      }
-
-      font->num_faces = font->name_index.count;
-    }
-    else
-    {
-      subfont_index = 0;
-
-      if ( font->name_index.count > 1 )
-      {
-        FT_ERROR(( "cff_font_load:"
-                   " invalid CFF font with multiple subfonts\n"
-                   "              "
-                   " in SFNT wrapper\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-    }
-
-    /* in case of a font format check, simply exit now */
-    if ( face_index < 0 )
-      goto Exit;
-
-    /* now, parse the top-level font dictionary */
-    FT_TRACE4(( "parsing top-level\n" ));
-    error = cff_subfont_load( &font->top_font,
-                              &font->font_dict_index,
-                              subfont_index,
-                              stream,
-                              base_offset,
-                              cff2 ? CFF2_CODE_TOPDICT : CFF_CODE_TOPDICT,
-                              font );
-    if ( error )
-      goto Exit;
-
-    if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) )
-      goto Exit;
-
-    error = cff_index_init( &font->charstrings_index, stream, 0, cff2 );
-    if ( error )
-      goto Exit;
-
-    /* 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, 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" ));
-        goto Fail_CID;
-      }
-
-      /* allocate & read each font dict independently */
-      font->num_subfonts = fd_index.count;
-      if ( FT_NEW_ARRAY( sub, fd_index.count ) )
-        goto Fail_CID;
-
-      /* set up pointer table */
-      for ( idx = 0; idx < fd_index.count; idx++ )
-        font->subfonts[idx] = sub + idx;
-
-      /* now load each subfont independently */
-      for ( idx = 0; idx < fd_index.count; idx++ )
-      {
-        sub = font->subfonts[idx];
-        FT_TRACE4(( "parsing subfont %u\n", idx ));
-        error = cff_subfont_load( sub,
-                                  &fd_index,
-                                  idx,
-                                  stream,
-                                  base_offset,
-                                  cff2 ? CFF2_CODE_FONTDICT
-                                       : CFF_CODE_TOPDICT,
-                                  font );
-        if ( error )
-          goto Fail_CID;
-      }
-
-      /* 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 );
-
-      if ( error )
-        goto Exit;
-    }
-    else
-      font->num_subfonts = 0;
-
-    /* read the charstrings index now */
-    if ( dict->charstrings_offset == 0 )
-    {
-      FT_ERROR(( "cff_font_load: no charstrings offset\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    font->num_glyphs = font->charstrings_index.count;
-
-    error = cff_index_get_pointers( &font->global_subrs_index,
-                                    &font->global_subrs, NULL, NULL );
-
-    if ( error )
-      goto Exit;
-
-    /* read the Charset and Encoding tables if available */
-    if ( !cff2 && font->num_glyphs > 0 )
-    {
-      FT_Bool  invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff );
-
-
-      error = cff_charset_load( &font->charset, font->num_glyphs, stream,
-                                base_offset, dict->charset_offset, invert );
-      if ( error )
-        goto Exit;
-
-      /* CID-keyed CFFs don't have an encoding */
-      if ( dict->cid_registry == 0xFFFFU )
-      {
-        error = cff_encoding_load( &font->encoding,
-                                   &font->charset,
-                                   font->num_glyphs,
-                                   stream,
-                                   base_offset,
-                                   dict->encoding_offset );
-        if ( error )
-          goto Exit;
-      }
-    }
-
-    /* get the font name (/CIDFontName for CID-keyed fonts, */
-    /* /FontName otherwise)                                 */
-    font->font_name = cff_index_get_name( font, subfont_index );
-
-  Exit:
-    cff_index_done( &string_index );
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_font_done( CFF_Font  font )
-  {
-    FT_Memory  memory = font->memory;
-    FT_UInt    idx;
-
-
-    cff_index_done( &font->global_subrs_index );
-    cff_index_done( &font->font_dict_index );
-    cff_index_done( &font->name_index );
-    cff_index_done( &font->charstrings_index );
-
-    /* release font dictionaries, but only if working with */
-    /* a CID keyed CFF font or a CFF2 font                 */
-    if ( font->num_subfonts > 0 )
-    {
-      for ( idx = 0; idx < font->num_subfonts; idx++ )
-        cff_subfont_done( memory, font->subfonts[idx] );
-
-      /* the subfonts array has been allocated as a single block */
-      FT_FREE( font->subfonts[0] );
-    }
-
-    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 );
-
-    CFF_Done_FD_Select( &font->fd_select, font->stream );
-
-    FT_FREE( font->font_info );
-
-    FT_FREE( font->font_name );
-    FT_FREE( font->global_subrs );
-    FT_FREE( font->strings );
-    FT_FREE( font->string_pool );
-
-    if ( font->cf2_instance.finalizer )
-    {
-      font->cf2_instance.finalizer( font->cf2_instance.data );
-      FT_FREE( font->cf2_instance.data );
-    }
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffload.h b/third_party/freetype/src/cff/cffload.h
deleted file mode 100644
index 8be6452..0000000
--- a/third_party/freetype/src/cff/cffload.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffload.h                                                              */
-/*                                                                         */
-/*    OpenType & CFF data/program tables loader (specification).           */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CFFLOAD_H_
-#define CFFLOAD_H_
-
-
-#include <ft2build.h>
-#include "cfftypes.h"
-#include "cffparse.h"
-#include "cffobjs.h"  /* for CFF_Face */
-
-
-FT_BEGIN_HEADER
-
-  FT_LOCAL( FT_UShort )
-  cff_get_standard_encoding( FT_UInt  charcode );
-
-
-  FT_LOCAL( FT_String* )
-  cff_index_get_string( CFF_Font  font,
-                        FT_UInt   element );
-
-  FT_LOCAL( FT_String* )
-  cff_index_get_sid_string( CFF_Font  font,
-                            FT_UInt   sid );
-
-
-  FT_LOCAL( FT_Error )
-  cff_index_access_element( CFF_Index  idx,
-                            FT_UInt    element,
-                            FT_Byte**  pbytes,
-                            FT_ULong*  pbyte_len );
-
-  FT_LOCAL( void )
-  cff_index_forget_element( CFF_Index  idx,
-                            FT_Byte**  pbytes );
-
-  FT_LOCAL( FT_String* )
-  cff_index_get_name( CFF_Font  font,
-                      FT_UInt   element );
-
-
-  FT_LOCAL( FT_UInt )
-  cff_charset_cid_to_gindex( CFF_Charset  charset,
-                             FT_UInt      cid );
-
-
-  FT_LOCAL( FT_Error )
-  cff_font_load( FT_Library  library,
-                 FT_Stream   stream,
-                 FT_Int      face_index,
-                 CFF_Font    font,
-                 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_MM_Var*  *mm_var );
-
-  FT_LOCAL( void )
-  cff_done_blend( CFF_Face  face );
-#endif
-
-
-FT_END_HEADER
-
-#endif /* CFFLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffobjs.c b/third_party/freetype/src/cff/cffobjs.c
deleted file mode 100644
index a639350..0000000
--- a/third_party/freetype/src/cff/cffobjs.c
+++ /dev/null
@@ -1,1198 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffobjs.c                                                              */
-/*                                                                         */
-/*    OpenType objects manager (body).                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_STREAM_H
-#include FT_ERRORS_H
-#include FT_TRUETYPE_IDS_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_INTERNAL_SFNT_H
-#include FT_CFF_DRIVER_H
-
-#include "cffobjs.h"
-#include "cffload.h"
-#include "cffcmap.h"
-#include "cffpic.h"
-
-#include "cfferrs.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_cffobjs
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            SIZE FUNCTIONS                             */
-  /*                                                                       */
-  /*  Note that we store the global hints in the size's `internal' root    */
-  /*  field.                                                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static PSH_Globals_Funcs
-  cff_size_get_globals_funcs( CFF_Size  size )
-  {
-    CFF_Face          face     = (CFF_Face)size->root.face;
-    CFF_Font          font     = (CFF_Font)face->extra.data;
-    PSHinter_Service  pshinter = font->pshinter;
-    FT_Module         module;
-
-
-    module = FT_Get_Module( size->root.face->driver->root.library,
-                            "pshinter" );
-    return ( module && pshinter && pshinter->get_globals_funcs )
-           ? pshinter->get_globals_funcs( module )
-           : 0;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_size_done( FT_Size  cffsize )        /* CFF_Size */
-  {
-    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;
-
-
-    if ( internal )
-    {
-      PSH_Globals_Funcs  funcs;
-
-
-      funcs = cff_size_get_globals_funcs( size );
-      if ( funcs )
-      {
-        FT_UInt  i;
-
-
-        funcs->destroy( internal->topfont );
-
-        for ( i = font->num_subfonts; i > 0; i-- )
-          funcs->destroy( internal->subfonts[i - 1] );
-      }
-
-      /* `internal' is freed by destroy_size (in ftobjs.c) */
-    }
-  }
-
-
-  /* CFF and Type 1 private dictionaries have slightly different      */
-  /* structures; we need to synthesize a Type 1 dictionary on the fly */
-
-  static void
-  cff_make_private_dict( CFF_SubFont  subfont,
-                         PS_Private   priv )
-  {
-    CFF_Private  cpriv = &subfont->private_dict;
-    FT_UInt      n, count;
-
-
-    FT_ZERO( priv );
-
-    count = priv->num_blue_values = cpriv->num_blue_values;
-    for ( n = 0; n < count; n++ )
-      priv->blue_values[n] = (FT_Short)cpriv->blue_values[n];
-
-    count = priv->num_other_blues = cpriv->num_other_blues;
-    for ( n = 0; n < count; n++ )
-      priv->other_blues[n] = (FT_Short)cpriv->other_blues[n];
-
-    count = priv->num_family_blues = cpriv->num_family_blues;
-    for ( n = 0; n < count; n++ )
-      priv->family_blues[n] = (FT_Short)cpriv->family_blues[n];
-
-    count = priv->num_family_other_blues = cpriv->num_family_other_blues;
-    for ( n = 0; n < count; n++ )
-      priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n];
-
-    priv->blue_scale = cpriv->blue_scale;
-    priv->blue_shift = (FT_Int)cpriv->blue_shift;
-    priv->blue_fuzz  = (FT_Int)cpriv->blue_fuzz;
-
-    priv->standard_width[0]  = (FT_UShort)cpriv->standard_width;
-    priv->standard_height[0] = (FT_UShort)cpriv->standard_height;
-
-    count = priv->num_snap_widths = cpriv->num_snap_widths;
-    for ( n = 0; n < count; n++ )
-      priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n];
-
-    count = priv->num_snap_heights = cpriv->num_snap_heights;
-    for ( n = 0; n < count; n++ )
-      priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n];
-
-    priv->force_bold     = cpriv->force_bold;
-    priv->language_group = cpriv->language_group;
-    priv->lenIV          = cpriv->lenIV;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_size_init( FT_Size  cffsize )         /* CFF_Size */
-  {
-    CFF_Size           size  = (CFF_Size)cffsize;
-    FT_Error           error = FT_Err_Ok;
-    PSH_Globals_Funcs  funcs = cff_size_get_globals_funcs( size );
-
-
-    if ( funcs )
-    {
-      CFF_Face      face     = (CFF_Face)cffsize->face;
-      CFF_Font      font     = (CFF_Font)face->extra.data;
-      CFF_Internal  internal = NULL;
-
-      PS_PrivateRec  priv;
-      FT_Memory      memory = cffsize->face->memory;
-
-      FT_UInt  i;
-
-
-      if ( FT_NEW( internal ) )
-        goto Exit;
-
-      cff_make_private_dict( &font->top_font, &priv );
-      error = funcs->create( cffsize->face->memory, &priv,
-                             &internal->topfont );
-      if ( error )
-        goto Exit;
-
-      for ( i = font->num_subfonts; i > 0; i-- )
-      {
-        CFF_SubFont  sub = font->subfonts[i - 1];
-
-
-        cff_make_private_dict( sub, &priv );
-        error = funcs->create( cffsize->face->memory, &priv,
-                               &internal->subfonts[i - 1] );
-        if ( error )
-          goto Exit;
-      }
-
-      cffsize->internal = (FT_Size_Internal)(void*)internal;
-    }
-
-    size->strike_index = 0xFFFFFFFFUL;
-
-  Exit:
-    return error;
-  }
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_size_select( FT_Size   size,
-                   FT_ULong  strike_index )
-  {
-    CFF_Size           cffsize = (CFF_Size)size;
-    PSH_Globals_Funcs  funcs;
-
-
-    cffsize->strike_index = strike_index;
-
-    FT_Select_Metrics( size->face, strike_index );
-
-    funcs = cff_size_get_globals_funcs( cffsize );
-
-    if ( funcs )
-    {
-      CFF_Face      face     = (CFF_Face)size->face;
-      CFF_Font      font     = (CFF_Font)face->extra.data;
-      CFF_Internal  internal = (CFF_Internal)size->internal;
-
-      FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
-      FT_UInt  i;
-
-
-      funcs->set_scale( internal->topfont,
-                        size->metrics.x_scale, size->metrics.y_scale,
-                        0, 0 );
-
-      for ( i = font->num_subfonts; i > 0; i-- )
-      {
-        CFF_SubFont  sub     = font->subfonts[i - 1];
-        FT_Long      sub_upm = (FT_Long)sub->font_dict.units_per_em;
-        FT_Pos       x_scale, y_scale;
-
-
-        if ( top_upm != sub_upm )
-        {
-          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
-          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
-        }
-        else
-        {
-          x_scale = size->metrics.x_scale;
-          y_scale = size->metrics.y_scale;
-        }
-
-        funcs->set_scale( internal->subfonts[i - 1],
-                          x_scale, y_scale, 0, 0 );
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_size_request( FT_Size          size,
-                    FT_Size_Request  req )
-  {
-    CFF_Size           cffsize = (CFF_Size)size;
-    PSH_Globals_Funcs  funcs;
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-    if ( FT_HAS_FIXED_SIZES( size->face ) )
-    {
-      CFF_Face      cffface = (CFF_Face)size->face;
-      SFNT_Service  sfnt    = (SFNT_Service)cffface->sfnt;
-      FT_ULong      strike_index;
-
-
-      if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) )
-        cffsize->strike_index = 0xFFFFFFFFUL;
-      else
-        return cff_size_select( size, strike_index );
-    }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-    FT_Request_Metrics( size->face, req );
-
-    funcs = cff_size_get_globals_funcs( cffsize );
-
-    if ( funcs )
-    {
-      CFF_Face      cffface  = (CFF_Face)size->face;
-      CFF_Font      font     = (CFF_Font)cffface->extra.data;
-      CFF_Internal  internal = (CFF_Internal)size->internal;
-
-      FT_Long  top_upm  = (FT_Long)font->top_font.font_dict.units_per_em;
-      FT_UInt  i;
-
-
-      funcs->set_scale( internal->topfont,
-                        size->metrics.x_scale, size->metrics.y_scale,
-                        0, 0 );
-
-      for ( i = font->num_subfonts; i > 0; i-- )
-      {
-        CFF_SubFont  sub     = font->subfonts[i - 1];
-        FT_Long      sub_upm = (FT_Long)sub->font_dict.units_per_em;
-        FT_Pos       x_scale, y_scale;
-
-
-        if ( top_upm != sub_upm )
-        {
-          x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm );
-          y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm );
-        }
-        else
-        {
-          x_scale = size->metrics.x_scale;
-          y_scale = size->metrics.y_scale;
-        }
-
-        funcs->set_scale( internal->subfonts[i - 1],
-                          x_scale, y_scale, 0, 0 );
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            SLOT  FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-  FT_LOCAL_DEF( void )
-  cff_slot_done( FT_GlyphSlot  slot )
-  {
-    slot->internal->glyph_hints = NULL;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_slot_init( FT_GlyphSlot  slot )
-  {
-    CFF_Face          face     = (CFF_Face)slot->face;
-    CFF_Font          font     = (CFF_Font)face->extra.data;
-    PSHinter_Service  pshinter = font->pshinter;
-
-
-    if ( pshinter )
-    {
-      FT_Module  module;
-
-
-      module = FT_Get_Module( slot->face->driver->root.library,
-                              "pshinter" );
-      if ( module )
-      {
-        T2_Hints_Funcs  funcs;
-
-
-        funcs = pshinter->get_t2_funcs( module );
-        slot->internal->glyph_hints = (void*)funcs;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                           FACE  FUNCTIONS                             */
-  /*                                                                       */
-  /*************************************************************************/
-
-  static FT_String*
-  cff_strcpy( FT_Memory         memory,
-              const FT_String*  source )
-  {
-    FT_Error    error;
-    FT_String*  result;
-
-
-    (void)FT_STRDUP( result, source );
-
-    FT_UNUSED( error );
-
-    return result;
-  }
-
-
-  /* Strip all subset prefixes of the form `ABCDEF+'.  Usually, there */
-  /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold'   */
-  /* have been seen in the wild.                                      */
-
-  static void
-  remove_subset_prefix( FT_String*  name )
-  {
-    FT_Int32  idx             = 0;
-    FT_Int32  length          = (FT_Int32)strlen( name ) + 1;
-    FT_Bool   continue_search = 1;
-
-
-    while ( continue_search )
-    {
-      if ( length >= 7 && name[6] == '+' )
-      {
-        for ( idx = 0; idx < 6; idx++ )
-        {
-          /* ASCII uppercase letters */
-          if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) )
-            continue_search = 0;
-        }
-
-        if ( continue_search )
-        {
-          for ( idx = 7; idx < length; idx++ )
-            name[idx - 7] = name[idx];
-          length -= 7;
-        }
-      }
-      else
-        continue_search = 0;
-    }
-  }
-
-
-  /* Remove the style part from the family name (if present). */
-
-  static void
-  remove_style( FT_String*        family_name,
-                const FT_String*  style_name )
-  {
-    FT_Int32  family_name_length, style_name_length;
-
-
-    family_name_length = (FT_Int32)strlen( family_name );
-    style_name_length  = (FT_Int32)strlen( style_name );
-
-    if ( family_name_length > style_name_length )
-    {
-      FT_Int  idx;
-
-
-      for ( idx = 1; idx <= style_name_length; idx++ )
-      {
-        if ( family_name[family_name_length - idx] !=
-             style_name[style_name_length - idx] )
-          break;
-      }
-
-      if ( idx > style_name_length )
-      {
-        /* family_name ends with style_name; remove it */
-        idx = family_name_length - style_name_length - 1;
-
-        /* also remove special characters     */
-        /* between real family name and style */
-        while ( idx > 0                     &&
-                ( family_name[idx] == '-' ||
-                  family_name[idx] == ' ' ||
-                  family_name[idx] == '_' ||
-                  family_name[idx] == '+' ) )
-          idx--;
-
-        if ( idx > 0 )
-          family_name[idx + 1] = '\0';
-      }
-    }
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_face_init( FT_Stream      stream,
-                 FT_Face        cffface,        /* CFF_Face */
-                 FT_Int         face_index,
-                 FT_Int         num_params,
-                 FT_Parameter*  params )
-  {
-    CFF_Face            face        = (CFF_Face)cffface;
-    FT_Error            error;
-    SFNT_Service        sfnt;
-    FT_Service_PsCMaps  psnames;
-    PSHinter_Service    pshinter;
-    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" );
-    if ( !sfnt )
-    {
-      FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" ));
-      error = FT_THROW( Missing_Module );
-      goto Exit;
-    }
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
-
-    pshinter = (PSHinter_Service)FT_Get_Module_Interface(
-                 library, "pshinter" );
-
-    FT_TRACE2(( "CFF driver\n" ));
-
-    /* create input stream from resource */
-    if ( FT_STREAM_SEEK( 0 ) )
-      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 )
-    {
-      if ( face->format_tag != TTAG_OTTO )  /* `OTTO'; OpenType/CFF font */
-      {
-        FT_TRACE2(( "  not an OpenType/CFF font\n" ));
-        error = FT_THROW( Unknown_File_Format );
-        goto Exit;
-      }
-
-      /* if we are performing a simple font format check, exit immediately */
-      if ( face_index < 0 )
-        return FT_Err_Ok;
-
-      sfnt_format = 1;
-
-      /* now, the font can be either an OpenType/CFF font, or an SVG CEF */
-      /* font; in the latter case it doesn't have a `head' table         */
-      error = face->goto_table( face, TTAG_head, stream, 0 );
-      if ( !error )
-      {
-        pure_cff = 0;
-
-        /* load font directory */
-        error = sfnt->load_face( stream, face, face_index,
-                                 num_params, params );
-        if ( error )
-          goto Exit;
-      }
-      else
-      {
-        /* load the `cmap' table explicitly */
-        error = sfnt->load_cmap( face, stream );
-        if ( error )
-          goto Exit;
-      }
-
-      /* 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->isCFF2 = cff2;
-      }
-
-      if ( FT_ERR_EQ( error, Table_Missing ) )
-        error = face->goto_table( face, TTAG_CFF, stream, 0 );
-
-      if ( error )
-        goto Exit;
-    }
-    else
-    {
-      /* rewind to start of file; we are going to load a pure-CFF font */
-      if ( FT_STREAM_SEEK( 0 ) )
-        goto Exit;
-      error = FT_Err_Ok;
-    }
-
-    /* now load and parse the CFF table in the file */
-    {
-      CFF_Font         cff = NULL;
-      CFF_FontRecDict  dict;
-      FT_Memory        memory = cffface->memory;
-      FT_Int32         flags;
-      FT_UInt          i;
-
-
-      if ( FT_NEW( cff ) )
-        goto Exit;
-
-      face->extra.data = cff;
-      error = cff_font_load( library,
-                             stream,
-                             face_index,
-                             cff,
-                             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;
-
-      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; */
-      /* SFNT based fonts use the `name' table instead.               */
-
-      cffface->num_glyphs = (FT_Long)cff->num_glyphs;
-
-      dict = &cff->top_font.font_dict;
-
-      /* we need the `PSNames' module for CFF and CEF formats */
-      /* which aren't CID-keyed                               */
-      if ( dict->cid_registry == 0xFFFFU && !psnames )
-      {
-        FT_ERROR(( "cff_face_init:"
-                   " cannot open CFF & CEF fonts\n"
-                   "              "
-                   " without the `PSNames' module\n" ));
-        error = FT_THROW( Missing_Module );
-        goto Exit;
-      }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-      {
-        FT_UInt     idx;
-        FT_String*  s;
-
-
-        FT_TRACE4(( "SIDs\n" ));
-
-        /* dump string index, including default strings for convenience */
-        for ( idx = 0; idx <= 390; idx++ )
-        {
-          s = cff_index_get_sid_string( cff, idx );
-          if ( 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_Int  instance_index = face_index >> 16;
-
-
-      if ( FT_HAS_MULTIPLE_MASTERS( cffface ) &&
-           mm                                 &&
-           instance_index > 0                 )
-      {
-        FT_MM_Var*  mm_var;
-
-
-        error = mm->get_mm_var( cffface, NULL );
-        if ( error )
-          goto Exit;
-
-        mm->get_var_blend( cffface, NULL, NULL, &mm_var );
-
-        if ( mm_var->namedstyle )
-        {
-          FT_Var_Named_Style*  named_style;
-          FT_String*           style_name;
-
-
-          /* in `face_index', the instance index starts with value 1 */
-          named_style = mm_var->namedstyle + instance_index - 1;
-          error = sfnt->get_name( face,
-                                  (FT_UShort)named_style->strid,
-                                  &style_name );
-          if ( error )
-            goto Exit;
-
-          /* set style name; if already set, replace it */
-          if ( face->root.style_name )
-            FT_FREE( face->root.style_name );
-          face->root.style_name = style_name;
-
-          /* finally, select the named instance */
-          error = mm->set_var_design( cffface,
-                                      mm_var->num_axis,
-                                      named_style->coords );
-          if ( error )
-            goto Exit;
-        }
-      }
-    }
-
-#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->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.                                                   */
-
-      {
-        FT_Matrix*  matrix = &dict->font_matrix;
-        FT_Vector*  offset = &dict->font_offset;
-        FT_ULong*   upm    = &dict->units_per_em;
-        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 );
-
-          matrix->xx = FT_DivFix( matrix->xx, temp );
-          matrix->yx = FT_DivFix( matrix->yx, temp );
-          matrix->xy = FT_DivFix( matrix->xy, temp );
-          matrix->yy = FT_DivFix( matrix->yy, temp );
-          offset->x  = FT_DivFix( offset->x,  temp );
-          offset->y  = FT_DivFix( offset->y,  temp );
-        }
-
-        offset->x >>= 16;
-        offset->y >>= 16;
-      }
-
-      for ( i = cff->num_subfonts; i > 0; i-- )
-      {
-        CFF_FontRecDict  sub = &cff->subfonts[i - 1]->font_dict;
-        CFF_FontRecDict  top = &cff->top_font.font_dict;
-
-        FT_Matrix*  matrix;
-        FT_Vector*  offset;
-        FT_ULong*   upm;
-        FT_Fixed    temp;
-
-
-        if ( sub->has_font_matrix )
-        {
-          FT_Long  scaling;
-
-
-          /* if we have a top-level matrix, */
-          /* concatenate the subfont matrix */
-
-          if ( top->has_font_matrix )
-          {
-            if ( top->units_per_em > 1 && sub->units_per_em > 1 )
-              scaling = (FT_Long)FT_MIN( top->units_per_em,
-                                         sub->units_per_em );
-            else
-              scaling = 1;
-
-            FT_Matrix_Multiply_Scaled( &top->font_matrix,
-                                       &sub->font_matrix,
-                                       scaling );
-            FT_Vector_Transform_Scaled( &sub->font_offset,
-                                        &top->font_matrix,
-                                        scaling );
-
-            sub->units_per_em = (FT_ULong)
-                                  FT_MulDiv( (FT_Long)sub->units_per_em,
-                                             (FT_Long)top->units_per_em,
-                                             scaling );
-          }
-        }
-        else
-        {
-          sub->font_matrix = top->font_matrix;
-          sub->font_offset = top->font_offset;
-
-          sub->units_per_em = top->units_per_em;
-        }
-
-        matrix = &sub->font_matrix;
-        offset = &sub->font_offset;
-        upm    = &sub->units_per_em;
-
-        temp = matrix->yy ? FT_ABS( matrix->yy )
-                          : FT_ABS( matrix->yx );
-
-
-        if ( temp != 0x10000L )
-        {
-          *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp );
-
-          matrix->xx = FT_DivFix( matrix->xx, temp );
-          matrix->yx = FT_DivFix( matrix->yx, temp );
-          matrix->xy = FT_DivFix( matrix->xy, temp );
-          matrix->yy = FT_DivFix( matrix->yy, temp );
-          offset->x  = FT_DivFix( offset->x,  temp );
-          offset->y  = FT_DivFix( offset->y,  temp );
-        }
-
-        offset->x >>= 16;
-        offset->y >>= 16;
-      }
-
-      if ( pure_cff )
-      {
-        char*  style_name = NULL;
-
-
-        /* set up num_faces */
-        cffface->num_faces = (FT_Long)cff->num_faces;
-
-        /* compute number of glyphs */
-        if ( dict->cid_registry != 0xFFFFU )
-          cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 );
-        else
-          cffface->num_glyphs = (FT_Long)cff->charstrings_index.count;
-
-        /* set global bbox, as well as EM size */
-        cffface->bbox.xMin =   dict->font_bbox.xMin            >> 16;
-        cffface->bbox.yMin =   dict->font_bbox.yMin            >> 16;
-        /* no `U' suffix here to 0xFFFF! */
-        cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16;
-        cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16;
-
-        cffface->units_per_EM = (FT_UShort)( dict->units_per_em );
-
-        cffface->ascender  = (FT_Short)( cffface->bbox.yMax );
-        cffface->descender = (FT_Short)( cffface->bbox.yMin );
-
-        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->underline_position  =
-          (FT_Short)( dict->underline_position >> 16 );
-        cffface->underline_thickness =
-          (FT_Short)( dict->underline_thickness >> 16 );
-
-        /* retrieve font family & style name */
-        cffface->family_name = cff_index_get_name(
-                                 cff,
-                                 (FT_UInt)( face_index & 0xFFFF ) );
-        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 )
-          {
-            while ( *fullp )
-            {
-              /* skip common characters at the start of both strings */
-              if ( *fullp == *family )
-              {
-                family++;
-                fullp++;
-                continue;
-              }
-
-              /* ignore spaces and dashes in full name during comparison */
-              if ( *fullp == ' ' || *fullp == '-' )
-              {
-                fullp++;
-                continue;
-              }
-
-              /* ignore spaces and dashes in family name during comparison */
-              if ( *family == ' ' || *family == '-' )
-              {
-                family++;
-                continue;
-              }
-
-              if ( !*family && *fullp )
-              {
-                /* The full name begins with the same characters as the  */
-                /* family name, with spaces and dashes removed.  In this */
-                /* case, the remaining string in `fullp' will be used as */
-                /* the style name.                                       */
-                style_name = cff_strcpy( memory, fullp );
-
-                /* remove the style part from the family name (if present) */
-                remove_style( cffface->family_name, style_name );
-              }
-              break;
-            }
-          }
-        }
-        else
-        {
-          char  *cid_font_name =
-                   cff_index_get_sid_string( cff,
-                                             dict->cid_font_name );
-
-
-          /* do we have a `/FontName' for a CID-keyed font? */
-          if ( cid_font_name )
-            cffface->family_name = cff_strcpy( memory, cid_font_name );
-        }
-
-        if ( style_name )
-          cffface->style_name = style_name;
-        else
-          /* assume "Regular" style if we don't know better */
-          cffface->style_name = cff_strcpy( memory, (char *)"Regular" );
-
-        /*******************************************************************/
-        /*                                                                 */
-        /* Compute face flags.                                             */
-        /*                                                                 */
-        flags = FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
-                FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
-                FT_FACE_FLAG_HINTER;      /* has native hinter */
-
-        if ( sfnt_format )
-          flags |= FT_FACE_FLAG_SFNT;
-
-        /* fixed width font? */
-        if ( dict->is_fixed_pitch )
-          flags |= FT_FACE_FLAG_FIXED_WIDTH;
-
-  /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */
-#if 0
-        /* kerning available? */
-        if ( face->kern_pairs )
-          flags |= FT_FACE_FLAG_KERNING;
-#endif
-
-        cffface->face_flags |= flags;
-
-        /*******************************************************************/
-        /*                                                                 */
-        /* Compute style flags.                                            */
-        /*                                                                 */
-        flags = 0;
-
-        if ( dict->italic_angle )
-          flags |= FT_STYLE_FLAG_ITALIC;
-
-        {
-          char  *weight = cff_index_get_sid_string( cff,
-                                                    dict->weight );
-
-
-          if ( weight )
-            if ( !ft_strcmp( weight, "Bold"  ) ||
-                 !ft_strcmp( weight, "Black" ) )
-              flags |= FT_STYLE_FLAG_BOLD;
-        }
-
-        /* double check */
-        if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name )
-          if ( !ft_strncmp( cffface->style_name, "Bold", 4 )  ||
-               !ft_strncmp( cffface->style_name, "Black", 5 ) )
-            flags |= FT_STYLE_FLAG_BOLD;
-
-        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.          */
-      if ( dict->cid_registry == 0xFFFFU )
-        cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES;
-#endif
-
-      if ( dict->cid_registry != 0xFFFFU && pure_cff )
-        cffface->face_flags |= FT_FACE_FLAG_CID_KEYED;
-
-
-      /*******************************************************************/
-      /*                                                                 */
-      /* Compute char maps.                                              */
-      /*                                                                 */
-
-      /* Try to synthesize a Unicode charmap if there is none available */
-      /* already.  If an OpenType font contains a Unicode "cmap", we    */
-      /* will use it, whatever be in the CFF part of the file.          */
-      {
-        FT_CharMapRec  cmaprec;
-        FT_CharMap     cmap;
-        FT_UInt        nn;
-        CFF_Encoding   encoding = &cff->encoding;
-
-
-        for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ )
-        {
-          cmap = cffface->charmaps[nn];
-
-          /* Windows Unicode? */
-          if ( cmap->platform_id == TT_PLATFORM_MICROSOFT &&
-               cmap->encoding_id == TT_MS_ID_UNICODE_CS   )
-            goto Skip_Unicode;
-
-          /* Apple Unicode platform id? */
-          if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE )
-            goto Skip_Unicode; /* Apple Unicode */
-        }
-
-        /* since CID-keyed fonts don't contain glyph names, we can't */
-        /* construct a cmap                                          */
-        if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU )
-          goto Exit;
-
-        /* we didn't find a Unicode charmap -- synthesize one */
-        cmaprec.face        = cffface;
-        cmaprec.platform_id = TT_PLATFORM_MICROSOFT;
-        cmaprec.encoding_id = TT_MS_ID_UNICODE_CS;
-        cmaprec.encoding    = FT_ENCODING_UNICODE;
-
-        nn = (FT_UInt)cffface->num_charmaps;
-
-        error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL,
-                             &cmaprec, NULL );
-        if ( error                                      &&
-             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
-          goto Exit;
-        error = FT_Err_Ok;
-
-        /* if no Unicode charmap was previously selected, select this one */
-        if ( !cffface->charmap && nn != (FT_UInt)cffface->num_charmaps )
-          cffface->charmap = cffface->charmaps[nn];
-
-      Skip_Unicode:
-        if ( encoding->count > 0 )
-        {
-          FT_CMap_Class  clazz;
-
-
-          cmaprec.face        = cffface;
-          cmaprec.platform_id = TT_PLATFORM_ADOBE;  /* Adobe platform id */
-
-          if ( encoding->offset == 0 )
-          {
-            cmaprec.encoding_id = TT_ADOBE_ID_STANDARD;
-            cmaprec.encoding    = FT_ENCODING_ADOBE_STANDARD;
-            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
-          }
-          else if ( encoding->offset == 1 )
-          {
-            cmaprec.encoding_id = TT_ADOBE_ID_EXPERT;
-            cmaprec.encoding    = FT_ENCODING_ADOBE_EXPERT;
-            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
-          }
-          else
-          {
-            cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM;
-            cmaprec.encoding    = FT_ENCODING_ADOBE_CUSTOM;
-            clazz               = &CFF_CMAP_ENCODING_CLASS_REC_GET;
-          }
-
-          error = FT_CMap_New( clazz, NULL, &cmaprec, NULL );
-        }
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_face_done( FT_Face  cffface )         /* CFF_Face */
-  {
-    CFF_Face      face = (CFF_Face)cffface;
-    FT_Memory     memory;
-    SFNT_Service  sfnt;
-
-
-    if ( !face )
-      return;
-
-    memory = cffface->memory;
-    sfnt   = (SFNT_Service)face->sfnt;
-
-    if ( sfnt )
-      sfnt->done_face( face );
-
-    {
-      CFF_Font  cff = (CFF_Font)face->extra.data;
-
-
-      if ( cff )
-      {
-        cff_font_done( cff );
-        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;
-
-
-    /* set default property values, cf. `ftcffdrv.h' */
-#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
-    driver->hinting_engine = FT_CFF_HINTING_FREETYPE;
-#else
-    driver->hinting_engine = FT_CFF_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;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cff_driver_done( FT_Module  module )        /* CFF_Driver */
-  {
-    FT_UNUSED( module );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffobjs.h b/third_party/freetype/src/cff/cffobjs.h
deleted file mode 100644
index 5d26977..0000000
--- a/third_party/freetype/src/cff/cffobjs.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffobjs.h                                                              */
-/*                                                                         */
-/*    OpenType objects manager (specification).                            */
-/*                                                                         */
-/*  Copyright 1996-2017 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 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 */
-
-  FT_LOCAL( void )
-  cff_size_done( FT_Size  size );           /* CFF_Size */
-
-  FT_LOCAL( FT_Error )
-  cff_size_request( FT_Size          size,
-                    FT_Size_Request  req );
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  FT_LOCAL( FT_Error )
-  cff_size_select( FT_Size   size,
-                   FT_ULong  strike_index );
-
-#endif
-
-  FT_LOCAL( void )
-  cff_slot_done( FT_GlyphSlot  slot );
-
-  FT_LOCAL( FT_Error )
-  cff_slot_init( FT_GlyphSlot  slot );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Face functions                                                        */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  cff_face_init( FT_Stream      stream,
-                 FT_Face        face,           /* CFF_Face */
-                 FT_Int         face_index,
-                 FT_Int         num_params,
-                 FT_Parameter*  params );
-
-  FT_LOCAL( void )
-  cff_face_done( FT_Face  face );               /* CFF_Face */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Driver functions                                                      */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  cff_driver_init( FT_Module  module );         /* CFF_Driver */
-
-  FT_LOCAL( void )
-  cff_driver_done( FT_Module  module );         /* CFF_Driver */
-
-
-FT_END_HEADER
-
-#endif /* CFFOBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffparse.c b/third_party/freetype/src/cff/cffparse.c
deleted file mode 100644
index 819332b..0000000
--- a/third_party/freetype/src/cff/cffparse.c
+++ /dev/null
@@ -1,1633 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffparse.c                                                             */
-/*                                                                         */
-/*    CFF token stream parser (body)                                       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "cffparse.h"
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_DEBUG_H
-
-#include "cfferrs.h"
-#include "cffpic.h"
-#include "cffgload.h"
-#include "cffload.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_cffparse
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_parser_init( CFF_Parser  parser,
-                   FT_UInt     code,
-                   void*       object,
-                   FT_Library  library,
-                   FT_UInt     stackSize,
-                   FT_UShort   num_designs,
-                   FT_UShort   num_axes )
-  {
-    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 );
-  }
-
-
-  /* read an integer */
-  static FT_Long
-  cff_parse_integer( FT_Byte*  start,
-                     FT_Byte*  limit )
-  {
-    FT_Byte*  p   = start;
-    FT_Int    v   = *p++;
-    FT_Long   val = 0;
-
-
-    if ( v == 28 )
-    {
-      if ( p + 2 > limit )
-        goto Bad;
-
-      val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] );
-    }
-    else if ( v == 29 )
-    {
-      if ( p + 4 > limit )
-        goto Bad;
-
-      val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) |
-                       ( (FT_ULong)p[1] << 16 ) |
-                       ( (FT_ULong)p[2] <<  8 ) |
-                         (FT_ULong)p[3]         );
-    }
-    else if ( v < 247 )
-    {
-      val = v - 139;
-    }
-    else if ( v < 251 )
-    {
-      if ( p + 1 > limit )
-        goto Bad;
-
-      val = ( v - 247 ) * 256 + p[0] + 108;
-    }
-    else
-    {
-      if ( p + 1 > limit )
-        goto Bad;
-
-      val = -( v - 251 ) * 256 - p[0] - 108;
-    }
-
-  Exit:
-    return val;
-
-  Bad:
-    val = 0;
-    FT_TRACE4(( "!!!END OF DATA:!!!" ));
-    goto Exit;
-  }
-
-
-  static const FT_Long power_tens[] =
-  {
-    1L,
-    10L,
-    100L,
-    1000L,
-    10000L,
-    100000L,
-    1000000L,
-    10000000L,
-    100000000L,
-    1000000000L
-  };
-
-
-  /* read a real */
-  static FT_Fixed
-  cff_parse_real( FT_Byte*  start,
-                  FT_Byte*  limit,
-                  FT_Long   power_ten,
-                  FT_Long*  scaling )
-  {
-    FT_Byte*  p = start;
-    FT_Int    nib;
-    FT_UInt   phase;
-
-    FT_Long   result, number, exponent;
-    FT_Int    sign = 0, exponent_sign = 0, have_overflow = 0;
-    FT_Long   exponent_add, integer_length, fraction_length;
-
-
-    if ( scaling )
-      *scaling = 0;
-
-    result = 0;
-
-    number   = 0;
-    exponent = 0;
-
-    exponent_add    = 0;
-    integer_length  = 0;
-    fraction_length = 0;
-
-    /* First of all, read the integer part. */
-    phase = 4;
-
-    for (;;)
-    {
-      /* If we entered this iteration with phase == 4, we need to */
-      /* read a new byte.  This also skips past the initial 0x1E. */
-      if ( phase )
-      {
-        p++;
-
-        /* Make sure we don't read past the end. */
-        if ( p >= limit )
-          goto Bad;
-      }
-
-      /* Get the nibble. */
-      nib   = (FT_Int)( p[0] >> phase ) & 0xF;
-      phase = 4 - phase;
-
-      if ( nib == 0xE )
-        sign = 1;
-      else if ( nib > 9 )
-        break;
-      else
-      {
-        /* Increase exponent if we can't add the digit. */
-        if ( number >= 0xCCCCCCCL )
-          exponent_add++;
-        /* Skip leading zeros. */
-        else if ( nib || number )
-        {
-          integer_length++;
-          number = number * 10 + nib;
-        }
-      }
-    }
-
-    /* Read fraction part, if any. */
-    if ( nib == 0xA )
-      for (;;)
-      {
-        /* If we entered this iteration with phase == 4, we need */
-        /* to read a new byte.                                   */
-        if ( phase )
-        {
-          p++;
-
-          /* Make sure we don't read past the end. */
-          if ( p >= limit )
-            goto Bad;
-        }
-
-        /* Get the nibble. */
-        nib   = ( p[0] >> phase ) & 0xF;
-        phase = 4 - phase;
-        if ( nib >= 10 )
-          break;
-
-        /* Skip leading zeros if possible. */
-        if ( !nib && !number )
-          exponent_add--;
-        /* Only add digit if we don't overflow. */
-        else if ( number < 0xCCCCCCCL && fraction_length < 9 )
-        {
-          fraction_length++;
-          number = number * 10 + nib;
-        }
-      }
-
-    /* Read exponent, if any. */
-    if ( nib == 12 )
-    {
-      exponent_sign = 1;
-      nib           = 11;
-    }
-
-    if ( nib == 11 )
-    {
-      for (;;)
-      {
-        /* If we entered this iteration with phase == 4, */
-        /* we need to read a new byte.                   */
-        if ( phase )
-        {
-          p++;
-
-          /* Make sure we don't read past the end. */
-          if ( p >= limit )
-            goto Bad;
-        }
-
-        /* Get the nibble. */
-        nib   = ( p[0] >> phase ) & 0xF;
-        phase = 4 - phase;
-        if ( nib >= 10 )
-          break;
-
-        /* Arbitrarily limit exponent. */
-        if ( exponent > 1000 )
-          have_overflow = 1;
-        else
-          exponent = exponent * 10 + nib;
-      }
-
-      if ( exponent_sign )
-        exponent = -exponent;
-    }
-
-    if ( !number )
-      goto Exit;
-
-    if ( have_overflow )
-    {
-      if ( exponent_sign )
-        goto Underflow;
-      else
-        goto Overflow;
-    }
-
-    /* We don't check `power_ten' and `exponent_add'. */
-    exponent += power_ten + exponent_add;
-
-    if ( scaling )
-    {
-      /* Only use `fraction_length'. */
-      fraction_length += integer_length;
-      exponent        += integer_length;
-
-      if ( fraction_length <= 5 )
-      {
-        if ( number > 0x7FFFL )
-        {
-          result   = FT_DivFix( number, 10 );
-          *scaling = exponent - fraction_length + 1;
-        }
-        else
-        {
-          if ( exponent > 0 )
-          {
-            FT_Long  new_fraction_length, shift;
-
-
-            /* Make `scaling' as small as possible. */
-            new_fraction_length = FT_MIN( exponent, 5 );
-            shift               = new_fraction_length - fraction_length;
-
-            if ( shift > 0 )
-            {
-              exponent -= new_fraction_length;
-              number   *= power_tens[shift];
-              if ( number > 0x7FFFL )
-              {
-                number   /= 10;
-                exponent += 1;
-              }
-            }
-            else
-              exponent -= fraction_length;
-          }
-          else
-            exponent -= fraction_length;
-
-          result   = (FT_Long)( (FT_ULong)number << 16 );
-          *scaling = exponent;
-        }
-      }
-      else
-      {
-        if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL )
-        {
-          result   = FT_DivFix( number, power_tens[fraction_length - 4] );
-          *scaling = exponent - 4;
-        }
-        else
-        {
-          result   = FT_DivFix( number, power_tens[fraction_length - 5] );
-          *scaling = exponent - 5;
-        }
-      }
-    }
-    else
-    {
-      integer_length  += exponent;
-      fraction_length -= exponent;
-
-      if ( integer_length > 5 )
-        goto Overflow;
-      if ( integer_length < -5 )
-        goto Underflow;
-
-      /* Remove non-significant digits. */
-      if ( integer_length < 0 )
-      {
-        number          /= power_tens[-integer_length];
-        fraction_length += integer_length;
-      }
-
-      /* this can only happen if exponent was non-zero */
-      if ( fraction_length == 10 )
-      {
-        number          /= 10;
-        fraction_length -= 1;
-      }
-
-      /* Convert into 16.16 format. */
-      if ( fraction_length > 0 )
-      {
-        if ( ( number / power_tens[fraction_length] ) > 0x7FFFL )
-          goto Exit;
-
-        result = FT_DivFix( number, power_tens[fraction_length] );
-      }
-      else
-      {
-        number *= power_tens[-fraction_length];
-
-        if ( number > 0x7FFFL )
-          goto Overflow;
-
-        result = (FT_Long)( (FT_ULong)number << 16 );
-      }
-    }
-
-  Exit:
-    if ( sign )
-      result = -result;
-
-    return result;
-
-  Overflow:
-    result = 0x7FFFFFFFL;
-    FT_TRACE4(( "!!!OVERFLOW:!!!" ));
-    goto Exit;
-
-  Underflow:
-    result = 0;
-    FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
-    goto Exit;
-
-  Bad:
-    result = 0;
-    FT_TRACE4(( "!!!END OF DATA:!!!" ));
-    goto Exit;
-  }
-
-
-  /* read a number, either integer or real */
-  FT_LOCAL_DEF( FT_Long )
-  cff_parse_num( CFF_Parser  parser,
-                 FT_Byte**   d )
-  {
-    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( CFF_Parser  parser,
-            FT_Byte**   d,
-            FT_Long     scaling )
-  {
-    if ( **d == 30 )
-      return cff_parse_real( *d, parser->limit, scaling, NULL );
-    else
-    {
-      FT_Long  val = cff_parse_integer( *d, parser->limit );
-
-
-      if ( scaling )
-        val *= power_tens[scaling];
-
-      if ( val > 0x7FFF )
-      {
-        val = 0x7FFFFFFFL;
-        goto Overflow;
-      }
-      else if ( val < -0x7FFF )
-      {
-        val = -0x7FFFFFFFL;
-        goto Overflow;
-      }
-
-      return (FT_Long)( (FT_ULong)val << 16 );
-
-    Overflow:
-      FT_TRACE4(( "!!!OVERFLOW:!!!" ));
-      return val;
-    }
-  }
-
-
-  /* read a floating point number, either integer or real */
-  static FT_Fixed
-  cff_parse_fixed( CFF_Parser  parser,
-                   FT_Byte**   d )
-  {
-    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( CFF_Parser  parser,
-                          FT_Byte**   d,
-                          FT_Long     scaling )
-  {
-    return do_fixed( parser, d, scaling );
-  }
-
-
-  /* read a floating point number, either integer or real,     */
-  /* and return it as precise as possible -- `scaling' returns */
-  /* the scaling factor (as a power of 10)                     */
-  static FT_Fixed
-  cff_parse_fixed_dynamic( CFF_Parser  parser,
-                           FT_Byte**   d,
-                           FT_Long*    scaling )
-  {
-    FT_ASSERT( scaling );
-
-    if ( **d == 30 )
-      return cff_parse_real( *d, parser->limit, 0, scaling );
-    else
-    {
-      FT_Long  number;
-      FT_Int   integer_length;
-
-
-      number = cff_parse_integer( d[0], d[1] );
-
-      if ( number > 0x7FFFL )
-      {
-        for ( integer_length = 5; integer_length < 10; integer_length++ )
-          if ( number < power_tens[integer_length] )
-            break;
-
-        if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL )
-        {
-          *scaling = integer_length - 4;
-          return FT_DivFix( number, power_tens[integer_length - 4] );
-        }
-        else
-        {
-          *scaling = integer_length - 5;
-          return FT_DivFix( number, power_tens[integer_length - 5] );
-        }
-      }
-      else
-      {
-        *scaling = 0;
-        return (FT_Long)( (FT_ULong)number << 16 );
-      }
-    }
-  }
-
-
-  static FT_Error
-  cff_parse_font_matrix( CFF_Parser  parser )
-  {
-    CFF_FontRecDict  dict   = (CFF_FontRecDict)parser->object;
-    FT_Matrix*       matrix = &dict->font_matrix;
-    FT_Vector*       offset = &dict->font_offset;
-    FT_ULong*        upm    = &dict->units_per_em;
-    FT_Byte**        data   = parser->stack;
-    FT_Error         error  = FT_ERR( Stack_Underflow );
-
-
-    if ( parser->top >= parser->stack + 6 )
-    {
-      FT_Fixed  values[6];
-      FT_Long   scalings[6];
-
-      FT_Long  min_scaling, max_scaling;
-      int      i;
-
-
-      error = FT_Err_Ok;
-
-      dict->has_font_matrix = TRUE;
-
-      /* 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 the largest matrix     */
-      /* element to scale all other elements.  The scaling factor is then  */
-      /* contained in the `units_per_em' value.                            */
-
-      max_scaling = FT_LONG_MIN;
-      min_scaling = FT_LONG_MAX;
-
-      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 ( 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 values (minimum %d, maximum %d),\n"
-                    "                      "
-                    " using default matrix\n", min_scaling, max_scaling ));
-
-        matrix->xx = 0x10000L;
-        matrix->yx = 0;
-        matrix->xy = 0;
-        matrix->yy = 0x10000L;
-        offset->x  = 0;
-        offset->y  = 0;
-        *upm       = 1;
-
-        goto Exit;
-      }
-
-      for ( i = 0; i < 6; i++ )
-      {
-        FT_Fixed  value = values[i];
-        FT_Long   divisor, half_divisor;
-
-
-        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,
-                  (double)matrix->xy / *upm / 65536,
-                  (double)matrix->yx / *upm / 65536,
-                  (double)matrix->yy / *upm / 65536,
-                  (double)offset->x  / *upm / 65536,
-                  (double)offset->y  / *upm / 65536 ));
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  cff_parse_font_bbox( CFF_Parser  parser )
-  {
-    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
-    FT_BBox*         bbox = &dict->font_bbox;
-    FT_Byte**        data = parser->stack;
-    FT_Error         error;
-
-
-    error = FT_ERR( Stack_Underflow );
-
-    if ( parser->top >= parser->stack + 4 )
-    {
-      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",
-                  bbox->xMin / 65536,
-                  bbox->yMin / 65536,
-                  bbox->xMax / 65536,
-                  bbox->yMax / 65536 ));
-    }
-
-    return error;
-  }
-
-
-  static FT_Error
-  cff_parse_private_dict( CFF_Parser  parser )
-  {
-    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
-    FT_Byte**        data = parser->stack;
-    FT_Error         error;
-
-
-    error = FT_ERR( Stack_Underflow );
-
-    if ( parser->top >= parser->stack + 2 )
-    {
-      FT_Long  tmp;
-
-
-      tmp = cff_parse_num( parser, data++ );
-      if ( tmp < 0 )
-      {
-        FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Fail;
-      }
-      dict->private_size = (FT_ULong)tmp;
-
-      tmp = cff_parse_num( parser, data );
-      if ( tmp < 0 )
-      {
-        FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Fail;
-      }
-      dict->private_offset = (FT_ULong)tmp;
-
-      FT_TRACE4(( " %lu %lu\n",
-                  dict->private_size, dict->private_offset ));
-
-      error = FT_Err_Ok;
-    }
-
-  Fail:
-    return error;
-  }
-
-
-  /* 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 )
-  {
-    CFF_FontRecDict  dict = (CFF_FontRecDict)parser->object;
-    FT_Byte**        data = parser->stack;
-    FT_Error         error;
-
-
-    error = FT_ERR( Stack_Underflow );
-
-    if ( parser->top >= parser->stack + 3 )
-    {
-      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( parser, data );
-      if ( dict->cid_supplement < 0 )
-        FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n",
-                   dict->cid_supplement ));
-      error = FT_Err_Ok;
-
-      FT_TRACE4(( " %d %d %d\n",
-                  dict->cid_registry,
-                  dict->cid_ordering,
-                  dict->cid_supplement ));
-    }
-
-    return error;
-  }
-
-
-  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;
-
-
-    error = FT_ERR( Stack_Underflow );
-
-    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 values blended\n", numBlends ));
-
-    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 )             \
-          CFF_FIELD( code, name, id, cff_kind_fixed )
-#define CFF_FIELD_FIXED_1000( code, name, id )                 \
-          CFF_FIELD( code, name, id, cff_kind_fixed_thousand )
-#define CFF_FIELD_STRING( code, name, id )             \
-          CFF_FIELD( code, name, id, cff_kind_string )
-#define CFF_FIELD_BOOL( code, name, id )             \
-          CFF_FIELD( code, name, id, cff_kind_bool )
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-
-#undef  CFF_FIELD
-#undef  CFF_FIELD_DELTA
-
-
-#ifndef FT_DEBUG_LEVEL_TRACE
-
-
-#define CFF_FIELD_CALLBACK( code, name, id ) \
-          {                                  \
-            cff_kind_callback,               \
-            code | CFFCODE,                  \
-            0, 0,                            \
-            cff_parse_ ## name,              \
-            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,                         \
-            code | CFFCODE,               \
-            FT_FIELD_OFFSET( name ),      \
-            FT_FIELD_SIZE( name ),        \
-            0, 0, 0                       \
-          },
-
-#define CFF_FIELD_DELTA( code, name, max, id ) \
-          {                                    \
-            cff_kind_delta,                    \
-            code | CFFCODE,                    \
-            FT_FIELD_OFFSET( name ),           \
-            FT_FIELD_SIZE_DELTA( name ),       \
-            0,                                 \
-            max,                               \
-            FT_FIELD_OFFSET( num_ ## name )    \
-          },
-
-  static const CFF_Field_Handler  cff_field_handlers[] =
-  {
-
-#include "cfftoken.h"
-
-    { 0, 0, 0, 0, 0, 0, 0 }
-  };
-
-
-#else /* FT_DEBUG_LEVEL_TRACE */
-
-
-
-#define CFF_FIELD_CALLBACK( code, name, id ) \
-          {                                  \
-            cff_kind_callback,               \
-            code | CFFCODE,                  \
-            0, 0,                            \
-            cff_parse_ ## name,              \
-            0, 0,                            \
-            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,                         \
-            code | CFFCODE,               \
-            FT_FIELD_OFFSET( name ),      \
-            FT_FIELD_SIZE( name ),        \
-            0, 0, 0,                      \
-            id                            \
-          },
-
-#define CFF_FIELD_DELTA( code, name, max, id ) \
-          {                                    \
-            cff_kind_delta,                    \
-            code | CFFCODE,                    \
-            FT_FIELD_OFFSET( name ),           \
-            FT_FIELD_SIZE_DELTA( name ),       \
-            0,                                 \
-            max,                               \
-            FT_FIELD_OFFSET( num_ ## name ),   \
-            id                                 \
-          },
-
-  static const CFF_Field_Handler  cff_field_handlers[] =
-  {
-
-#include "cfftoken.h"
-
-    { 0, 0, 0, 0, 0, 0, 0, 0 }
-  };
-
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-
-  void
-  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
-                                       CFF_Field_Handler*  clazz )
-  {
-    FT_Memory  memory = library->memory;
-
-
-    if ( clazz )
-      FT_FREE( clazz );
-  }
-
-
-  FT_Error
-  FT_Create_Class_cff_field_handlers( FT_Library           library,
-                                      CFF_Field_Handler**  output_class )
-  {
-    CFF_Field_Handler*  clazz  = NULL;
-    FT_Error            error;
-    FT_Memory           memory = library->memory;
-
-    int  i = 0;
-
-
-#undef CFF_FIELD
-#define CFF_FIELD( code, name, id, kind ) i++;
-#undef CFF_FIELD_DELTA
-#define CFF_FIELD_DELTA( code, name, max, id ) i++;
-#undef CFF_FIELD_CALLBACK
-#define CFF_FIELD_CALLBACK( code, name, id ) i++;
-
-#include "cfftoken.h"
-
-    i++; /* { 0, 0, 0, 0, 0, 0, 0 } */
-
-    if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) )
-      return error;
-
-    i = 0;
-
-
-#ifndef FT_DEBUG_LEVEL_TRACE
-
-
-#undef CFF_FIELD_CALLBACK
-#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
-          clazz[i].kind         = cff_kind_callback;   \
-          clazz[i].code         = code_ | CFFCODE;     \
-          clazz[i].offset       = 0;                   \
-          clazz[i].size         = 0;                   \
-          clazz[i].reader       = cff_parse_ ## name_; \
-          clazz[i].array_max    = 0;                   \
-          clazz[i].count_offset = 0;                   \
-          i++;
-
-#undef  CFF_FIELD
-#define CFF_FIELD( code_, name_, id_, kind_ )               \
-          clazz[i].kind         = kind_;                    \
-          clazz[i].code         = code_ | CFFCODE;          \
-          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
-          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
-          clazz[i].reader       = 0;                        \
-          clazz[i].array_max    = 0;                        \
-          clazz[i].count_offset = 0;                        \
-          i++;                                              \
-
-#undef  CFF_FIELD_DELTA
-#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
-          clazz[i].kind         = cff_kind_delta;                   \
-          clazz[i].code         = code_ | CFFCODE;                  \
-          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
-          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
-          clazz[i].reader       = 0;                                \
-          clazz[i].array_max    = max_;                             \
-          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
-          i++;
-
-#include "cfftoken.h"
-
-    clazz[i].kind         = 0;
-    clazz[i].code         = 0;
-    clazz[i].offset       = 0;
-    clazz[i].size         = 0;
-    clazz[i].reader       = 0;
-    clazz[i].array_max    = 0;
-    clazz[i].count_offset = 0;
-
-
-#else /* FT_DEBUG_LEVEL_TRACE */
-
-
-#undef CFF_FIELD_CALLBACK
-#define CFF_FIELD_CALLBACK( code_, name_, id_ )        \
-          clazz[i].kind         = cff_kind_callback;   \
-          clazz[i].code         = code_ | CFFCODE;     \
-          clazz[i].offset       = 0;                   \
-          clazz[i].size         = 0;                   \
-          clazz[i].reader       = cff_parse_ ## name_; \
-          clazz[i].array_max    = 0;                   \
-          clazz[i].count_offset = 0;                   \
-          clazz[i].id           = id_;                 \
-          i++;
-
-#undef  CFF_FIELD
-#define CFF_FIELD( code_, name_, id_, kind_ )               \
-          clazz[i].kind         = kind_;                    \
-          clazz[i].code         = code_ | CFFCODE;          \
-          clazz[i].offset       = FT_FIELD_OFFSET( name_ ); \
-          clazz[i].size         = FT_FIELD_SIZE( name_ );   \
-          clazz[i].reader       = 0;                        \
-          clazz[i].array_max    = 0;                        \
-          clazz[i].count_offset = 0;                        \
-          clazz[i].id           = id_;                      \
-          i++;                                              \
-
-#undef  CFF_FIELD_DELTA
-#define CFF_FIELD_DELTA( code_, name_, max_, id_ )                  \
-          clazz[i].kind         = cff_kind_delta;                   \
-          clazz[i].code         = code_ | CFFCODE;                  \
-          clazz[i].offset       = FT_FIELD_OFFSET( name_ );         \
-          clazz[i].size         = FT_FIELD_SIZE_DELTA( name_ );     \
-          clazz[i].reader       = 0;                                \
-          clazz[i].array_max    = max_;                             \
-          clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \
-          clazz[i].id           = id_;                              \
-          i++;
-
-#include "cfftoken.h"
-
-    clazz[i].kind         = 0;
-    clazz[i].code         = 0;
-    clazz[i].offset       = 0;
-    clazz[i].size         = 0;
-    clazz[i].reader       = 0;
-    clazz[i].array_max    = 0;
-    clazz[i].count_offset = 0;
-    clazz[i].id           = 0;
-
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-    *output_class = clazz;
-
-    return FT_Err_Ok;
-  }
-
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cff_parser_run( CFF_Parser  parser,
-                  FT_Byte*    start,
-                  FT_Byte*    limit )
-  {
-    FT_Byte*    p       = start;
-    FT_Error    error   = FT_Err_Ok;
-    FT_Library  library = parser->library;
-    FT_UNUSED( library );
-
-
-    parser->top    = parser->stack;
-    parser->start  = start;
-    parser->limit  = limit;
-    parser->cursor = start;
-
-    while ( p < limit )
-    {
-      FT_UInt  v = *p;
-
-      /* 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 ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
-          goto Stack_Overflow;
-
-        *parser->top++ = p;
-
-        /* now, skip it */
-        if ( v == 30 )
-        {
-          /* skip real number */
-          p++;
-          for (;;)
-          {
-            /* An unterminated floating point number at the */
-            /* end of a dictionary is invalid but harmless. */
-            if ( p >= limit )
-              goto Exit;
-            v = p[0] >> 4;
-            if ( v == 15 )
-              break;
-            v = p[0] & 0xF;
-            if ( v == 15 )
-              break;
-            p++;
-          }
-        }
-        else if ( v == 28 )
-          p += 2;
-        else if ( v == 29 )
-          p += 4;
-        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;
-
-        error = cff_decoder_parse_charstrings( &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;
-        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;
-
-        if ( v == 12 )
-        {
-          /* two byte operator */
-          p++;
-          if ( p >= limit )
-            goto Syntax_Error;
-
-          code = 0x100 | p[0];
-        }
-        code = code | parser->object_code;
-
-        for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ )
-        {
-          if ( field->code == (FT_Int)code )
-          {
-            /* we found our field's handler; read it */
-            FT_Long   val;
-            FT_Byte*  q = (FT_Byte*)parser->object + field->offset;
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-            FT_TRACE4(( "  %s", field->id ));
-#endif
-
-            /* check that we have enough arguments -- except for */
-            /* delta encoded arrays, which can be empty          */
-            if ( field->kind != cff_kind_delta && num_args < 1 )
-              goto Stack_Underflow;
-
-            switch ( field->kind )
-            {
-            case cff_kind_bool:
-            case cff_kind_string:
-            case cff_kind_num:
-              val = cff_parse_num( parser, parser->stack );
-              goto Store_Number;
-
-            case cff_kind_fixed:
-              val = cff_parse_fixed( parser, parser->stack );
-              goto Store_Number;
-
-            case cff_kind_fixed_thousand:
-              val = cff_parse_fixed_scaled( parser, parser->stack, 3 );
-
-            Store_Number:
-              switch ( field->size )
-              {
-              case (8 / FT_CHAR_BIT):
-                *(FT_Byte*)q = (FT_Byte)val;
-                break;
-
-              case (16 / FT_CHAR_BIT):
-                *(FT_Short*)q = (FT_Short)val;
-                break;
-
-              case (32 / FT_CHAR_BIT):
-                *(FT_Int32*)q = (FT_Int)val;
-                break;
-
-              default:  /* for 64-bit systems */
-                *(FT_Long*)q = val;
-              }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-              switch ( field->kind )
-              {
-              case cff_kind_bool:
-                FT_TRACE4(( " %s\n", val ? "true" : "false" ));
-                break;
-
-              case cff_kind_string:
-                FT_TRACE4(( " %ld (SID)\n", val ));
-                break;
-
-              case cff_kind_num:
-                FT_TRACE4(( " %ld\n", val ));
-                break;
-
-              case cff_kind_fixed:
-                FT_TRACE4(( " %f\n", (double)val / 65536 ));
-                break;
-
-              case cff_kind_fixed_thousand:
-                FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
-
-              default:
-                ; /* never reached */
-              }
-#endif
-
-              break;
-
-            case cff_kind_delta:
-              {
-                FT_Byte*   qcount = (FT_Byte*)parser->object +
-                                      field->count_offset;
-
-                FT_Byte**  data = parser->stack;
-
-
-                if ( num_args > field->array_max )
-                  num_args = field->array_max;
-
-                FT_TRACE4(( " [" ));
-
-                /* store count */
-                *qcount = (FT_Byte)num_args;
-
-                val = 0;
-                while ( num_args > 0 )
-                {
-                  val += cff_parse_num( parser, data++ );
-                  switch ( field->size )
-                  {
-                  case (8 / FT_CHAR_BIT):
-                    *(FT_Byte*)q = (FT_Byte)val;
-                    break;
-
-                  case (16 / FT_CHAR_BIT):
-                    *(FT_Short*)q = (FT_Short)val;
-                    break;
-
-                  case (32 / FT_CHAR_BIT):
-                    *(FT_Int32*)q = (FT_Int)val;
-                    break;
-
-                  default:  /* for 64-bit systems */
-                    *(FT_Long*)q = val;
-                  }
-
-                  FT_TRACE4(( " %ld", val ));
-
-                  q += field->size;
-                  num_args--;
-                }
-
-                FT_TRACE4(( "]\n" ));
-              }
-              break;
-
-            default:  /* callback or blend */
-              error = field->reader( parser );
-              if ( error )
-                goto Exit;
-            }
-            goto Found;
-          }
-        }
-
-        /* this is an unknown operator, or it is unsupported; */
-        /* we will ignore it for now.                         */
-
-      Found:
-        /* clear 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++;
-    }
-
-  Exit:
-    return error;
-
-  Stack_Overflow:
-    error = FT_THROW( Invalid_Argument );
-    goto Exit;
-
-  Stack_Underflow:
-    error = FT_THROW( Invalid_Argument );
-    goto Exit;
-
-  Syntax_Error:
-    error = FT_THROW( Invalid_Argument );
-    goto Exit;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffparse.h b/third_party/freetype/src/cff/cffparse.h
deleted file mode 100644
index 9976d42..0000000
--- a/third_party/freetype/src/cff/cffparse.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffparse.h                                                             */
-/*                                                                         */
-/*    CFF token stream parser (specification)                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CFFPARSE_H_
-#define CFFPARSE_H_
-
-
-#include <ft2build.h>
-#include "cfftypes.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 CFF2_MAX_STACK      513
-#define CFF2_DEFAULT_STACK  193
-
-#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_Byte**   stack;
-    FT_Byte**   top;
-    FT_UInt     stackSize;  /* allocated size */
-
-    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( 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_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,
-                  FT_Byte*    start,
-                  FT_Byte*    limit );
-
-
-  enum
-  {
-    cff_kind_none = 0,
-    cff_kind_num,
-    cff_kind_fixed,
-    cff_kind_fixed_thousand,
-    cff_kind_string,
-    cff_kind_bool,
-    cff_kind_delta,
-    cff_kind_callback,
-    cff_kind_blend,
-
-    cff_kind_max  /* do not remove */
-  };
-
-
-  /* now generate handlers for the most simple fields */
-  typedef FT_Error  (*CFF_Field_Reader)( CFF_Parser  parser );
-
-  typedef struct  CFF_Field_Handler_
-  {
-    int               kind;
-    int               code;
-    FT_UInt           offset;
-    FT_Byte           size;
-    CFF_Field_Reader  reader;
-    FT_UInt           array_max;
-    FT_UInt           count_offset;
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-    const char*       id;
-#endif
-
-  } CFF_Field_Handler;
-
-
-FT_END_HEADER
-
-
-#endif /* CFFPARSE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffpic.c b/third_party/freetype/src/cff/cffpic.c
deleted file mode 100644
index 4e9ba12..0000000
--- a/third_party/freetype/src/cff/cffpic.c
+++ /dev/null
@@ -1,138 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffpic.c                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for cff module.      */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "cffcmap.h"
-#include "cffpic.h"
-#include "cfferrs.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from cffdrivr.c */
-  FT_Error
-  FT_Create_Class_cff_services( FT_Library           library,
-                                FT_ServiceDescRec**  output_class );
-  void
-  FT_Destroy_Class_cff_services( FT_Library          library,
-                                 FT_ServiceDescRec*  clazz );
-  void
-  FT_Init_Class_cff_service_ps_info( FT_Library             library,
-                                     FT_Service_PsInfoRec*  clazz );
-  void
-  FT_Init_Class_cff_service_glyph_dict( FT_Library                library,
-                                        FT_Service_GlyphDictRec*  clazz );
-  void
-  FT_Init_Class_cff_service_ps_name( FT_Library                 library,
-                                     FT_Service_PsFontNameRec*  clazz );
-  void
-  FT_Init_Class_cff_service_get_cmap_info( FT_Library              library,
-                                           FT_Service_TTCMapsRec*  clazz );
-  void
-  FT_Init_Class_cff_service_cid_info( FT_Library          library,
-                                      FT_Service_CIDRec*  clazz );
-
-  /* forward declaration of PIC init functions from cffparse.c */
-  FT_Error
-  FT_Create_Class_cff_field_handlers( FT_Library           library,
-                                      CFF_Field_Handler**  output_class );
-  void
-  FT_Destroy_Class_cff_field_handlers( FT_Library          library,
-                                       CFF_Field_Handler*  clazz );
-
-
-  void
-  cff_driver_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->cff )
-    {
-      CffModulePIC*  container = (CffModulePIC*)pic_container->cff;
-
-
-      if ( container->cff_services )
-        FT_Destroy_Class_cff_services( library,
-                                       container->cff_services );
-      container->cff_services = NULL;
-      if ( container->cff_field_handlers )
-        FT_Destroy_Class_cff_field_handlers(
-          library, container->cff_field_handlers );
-      container->cff_field_handlers = NULL;
-      FT_FREE( container );
-      pic_container->cff = NULL;
-    }
-  }
-
-
-  FT_Error
-  cff_driver_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    CffModulePIC*      container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC ( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->cff = container;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    error = FT_Create_Class_cff_services( library,
-                                          &container->cff_services );
-    if ( error )
-      goto Exit;
-
-    error = FT_Create_Class_cff_field_handlers(
-              library, &container->cff_field_handlers );
-    if ( error )
-      goto Exit;
-
-    FT_Init_Class_cff_service_ps_info(
-      library, &container->cff_service_ps_info );
-    FT_Init_Class_cff_service_glyph_dict(
-      library, &container->cff_service_glyph_dict );
-    FT_Init_Class_cff_service_ps_name(
-      library, &container->cff_service_ps_name );
-    FT_Init_Class_cff_service_get_cmap_info(
-      library, &container->cff_service_get_cmap_info );
-    FT_Init_Class_cff_service_cid_info(
-      library, &container->cff_service_cid_info );
-    FT_Init_Class_cff_cmap_encoding_class_rec(
-      library, &container->cff_cmap_encoding_class_rec );
-    FT_Init_Class_cff_cmap_unicode_class_rec(
-      library, &container->cff_cmap_unicode_class_rec );
-
-  Exit:
-    if ( error )
-      cff_driver_class_pic_free( library );
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cffpic.h b/third_party/freetype/src/cff/cffpic.h
deleted file mode 100644
index 0b89fcb..0000000
--- a/third_party/freetype/src/cff/cffpic.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cffpic.h                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for cff module.      */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 CFFPIC_H_
-#define CFFPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define CFF_SERVICE_PS_INFO_GET          cff_service_ps_info
-#define CFF_SERVICE_GLYPH_DICT_GET       cff_service_glyph_dict
-#define CFF_SERVICE_PS_NAME_GET          cff_service_ps_name
-#define CFF_SERVICE_GET_CMAP_INFO_GET    cff_service_get_cmap_info
-#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_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
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#include FT_SERVICE_GLYPH_DICT_H
-#include "cffparse.h"
-#include FT_SERVICE_POSTSCRIPT_INFO_H
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_TT_CMAP_H
-#include FT_SERVICE_CID_H
-#include FT_SERVICE_PROPERTIES_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;
-
-  } CffModulePIC;
-
-
-#define GET_PIC( lib )                                    \
-          ( (CffModulePIC*)( (lib)->pic_container.cff ) )
-
-#define CFF_SERVICE_PS_INFO_GET                       \
-          ( GET_PIC( library )->cff_service_ps_info )
-#define CFF_SERVICE_GLYPH_DICT_GET                       \
-          ( GET_PIC( library )->cff_service_glyph_dict )
-#define CFF_SERVICE_PS_NAME_GET                       \
-          ( GET_PIC( library )->cff_service_ps_name )
-#define CFF_SERVICE_GET_CMAP_INFO_GET                       \
-          ( GET_PIC( library )->cff_service_get_cmap_info )
-#define CFF_SERVICE_CID_INFO_GET                       \
-          ( GET_PIC( library )->cff_service_cid_info )
-#define CFF_SERVICE_PROPERTIES_GET                       \
-          ( GET_PIC( library )->cff_service_properties )
-#define CFF_SERVICES_GET                       \
-          ( GET_PIC( library )->cff_services )
-#define CFF_CMAP_ENCODING_CLASS_REC_GET                       \
-          ( GET_PIC( library )->cff_cmap_encoding_class_rec )
-#define CFF_CMAP_UNICODE_CLASS_REC_GET                       \
-          ( GET_PIC( library )->cff_cmap_unicode_class_rec )
-#define CFF_FIELD_HANDLERS_GET                       \
-          ( GET_PIC( library )->cff_field_handlers )
-
-  /* see cffpic.c for the implementation */
-  void
-  cff_driver_class_pic_free( FT_Library  library );
-
-  FT_Error
-  cff_driver_class_pic_init( FT_Library  library );
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-#endif /* CFFPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cff/cfftoken.h b/third_party/freetype/src/cff/cfftoken.h
deleted file mode 100644
index 3222e93..0000000
--- a/third_party/freetype/src/cff/cfftoken.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cfftoken.h                                                             */
-/*                                                                         */
-/*    CFF token definitions (specification only).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  CFF_FontRecDictRec
-
-#undef  CFFCODE
-#define CFFCODE       CFF_CODE_TOPDICT
-
-  CFF_FIELD_STRING  ( 0,     version,             "Version" )
-  CFF_FIELD_STRING  ( 1,     notice,              "Notice" )
-  CFF_FIELD_STRING  ( 0x100, copyright,           "Copyright" )
-  CFF_FIELD_STRING  ( 2,     full_name,           "FullName" )
-  CFF_FIELD_STRING  ( 3,     family_name,         "FamilyName" )
-  CFF_FIELD_STRING  ( 4,     weight,              "Weight" )
-  CFF_FIELD_BOOL    ( 0x101, is_fixed_pitch,      "isFixedPitch" )
-  CFF_FIELD_FIXED   ( 0x102, italic_angle,        "ItalicAngle" )
-  CFF_FIELD_FIXED   ( 0x103, underline_position,  "UnderlinePosition" )
-  CFF_FIELD_FIXED   ( 0x104, underline_thickness, "UnderlineThickness" )
-  CFF_FIELD_NUM     ( 0x105, paint_type,          "PaintType" )
-  CFF_FIELD_NUM     ( 0x106, charstring_type,     "CharstringType" )
-  CFF_FIELD_CALLBACK( 0x107, font_matrix,         "FontMatrix" )
-  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" )
-  CFF_FIELD_CALLBACK( 18,    private_dict,        "Private" )
-  CFF_FIELD_NUM     ( 0x114, synthetic_base,      "SyntheticBase" )
-  CFF_FIELD_STRING  ( 0x115, embedded_postscript, "PostScript" )
-
-#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" )
-#if 0
-  CFF_FIELD_CALLBACK( 0x11A, blend_axis_types,    "BlendAxisTypes" )
-#endif
-
-  CFF_FIELD_CALLBACK( 0x11E, cid_ros,              "ROS" )
-  CFF_FIELD_NUM     ( 0x11F, cid_font_version,     "CIDFontVersion" )
-  CFF_FIELD_NUM     ( 0x120, cid_font_revision,    "CIDFontRevision" )
-  CFF_FIELD_NUM     ( 0x121, cid_font_type,        "CIDFontType" )
-  CFF_FIELD_NUM     ( 0x122, cid_count,            "CIDCount" )
-  CFF_FIELD_NUM     ( 0x123, cid_uid_base,         "UIDBase" )
-  CFF_FIELD_NUM     ( 0x124, cid_fd_array_offset,  "FDArray" )
-  CFF_FIELD_NUM     ( 0x125, cid_fd_select_offset, "FDSelect" )
-  CFF_FIELD_STRING  ( 0x126, cid_font_name,        "FontName" )
-
-#if 0
-  CFF_FIELD_NUM     ( 0x127, chameleon, "Chameleon" )
-#endif
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  CFF_PrivateRec
-#undef  CFFCODE
-#define CFFCODE       CFF_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_BOOL      ( 0x10E, force_bold,             "ForceBold" )
-  CFF_FIELD_FIXED     ( 0x10F, force_bold_threshold,   "ForceBoldThreshold" )
-  CFF_FIELD_NUM       ( 0x110, lenIV,                  "lenIV" )
-  CFF_FIELD_NUM       ( 0x111, language_group,         "LanguageGroup" )
-  CFF_FIELD_FIXED     ( 0x112, expansion_factor,       "ExpansionFactor" )
-  CFF_FIELD_NUM       ( 0x113, initial_random_seed,    "initialRandomSeed" )
-  CFF_FIELD_NUM       ( 19,    local_subrs_offset,     "Subrs" )
-  CFF_FIELD_NUM       ( 20,    default_width,          "defaultWidthX" )
-  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/third_party/freetype/src/cff/cfftypes.h b/third_party/freetype/src/cff/cfftypes.h
deleted file mode 100644
index 412712c..0000000
--- a/third_party/freetype/src/cff/cfftypes.h
+++ /dev/null
@@ -1,402 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cfftypes.h                                                             */
-/*                                                                         */
-/*    Basic OpenType/CFF type definitions and interface (specification     */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CFFTYPES_H_
-#define CFFTYPES_H_
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TYPE1_TABLES_H
-#include FT_INTERNAL_SERVICE_H
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CFF_IndexRec                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to model a CFF Index table.                       */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    stream      :: The source input stream.                            */
-  /*                                                                       */
-  /*    start       :: The position of the first index byte in the         */
-  /*                   input stream.                                       */
-  /*                                                                       */
-  /*    count       :: The number of elements in the index.                */
-  /*                                                                       */
-  /*    off_size    :: The size in bytes of object offsets in index.       */
-  /*                                                                       */
-  /*    data_offset :: The position of first data byte in the index's      */
-  /*                   bytes.                                              */
-  /*                                                                       */
-  /*    data_size   :: The size of the data table in this index.           */
-  /*                                                                       */
-  /*    offsets     :: A table of element offsets in the index.  Must be   */
-  /*                   loaded explicitly.                                  */
-  /*                                                                       */
-  /*    bytes       :: If the index is loaded in memory, its bytes.        */
-  /*                                                                       */
-  typedef struct  CFF_IndexRec_
-  {
-    FT_Stream  stream;
-    FT_ULong   start;
-    FT_UInt    hdr_size;
-    FT_UInt    count;
-    FT_Byte    off_size;
-    FT_ULong   data_offset;
-    FT_ULong   data_size;
-
-    FT_ULong*  offsets;
-    FT_Byte*   bytes;
-
-  } CFF_IndexRec, *CFF_Index;
-
-
-  typedef struct  CFF_EncodingRec_
-  {
-    FT_UInt     format;
-    FT_ULong    offset;
-
-    FT_UInt     count;
-    FT_UShort   sids [256];  /* avoid dynamic allocations */
-    FT_UShort   codes[256];
-
-  } CFF_EncodingRec, *CFF_Encoding;
-
-
-  typedef struct  CFF_CharsetRec_
-  {
-
-    FT_UInt     format;
-    FT_ULong    offset;
-
-    FT_UShort*  sids;
-    FT_UShort*  cids;       /* the inverse mapping of `sids'; only needed */
-                            /* for CID-keyed fonts                        */
-    FT_UInt     max_cid;
-    FT_UInt     num_glyphs;
-
-  } 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 regions in this var data */
-    FT_UInt*  regionIndices;  /* array of `regionCount' 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;
-    FT_UInt    notice;
-    FT_UInt    copyright;
-    FT_UInt    full_name;
-    FT_UInt    family_name;
-    FT_UInt    weight;
-    FT_Bool    is_fixed_pitch;
-    FT_Fixed   italic_angle;
-    FT_Fixed   underline_position;
-    FT_Fixed   underline_thickness;
-    FT_Int     paint_type;
-    FT_Int     charstring_type;
-    FT_Matrix  font_matrix;
-    FT_Bool    has_font_matrix;
-    FT_ULong   units_per_em;  /* temporarily used as scaling value also */
-    FT_Vector  font_offset;
-    FT_ULong   unique_id;
-    FT_BBox    font_bbox;
-    FT_Pos     stroke_width;
-    FT_ULong   charset_offset;
-    FT_ULong   encoding_offset;
-    FT_ULong   charstrings_offset;
-    FT_ULong   private_offset;
-    FT_ULong   private_size;
-    FT_Long    synthetic_base;
-    FT_UInt    embedded_postscript;
-
-    /* these should only be used for the top-level font dictionary */
-    FT_UInt    cid_registry;
-    FT_UInt    cid_ordering;
-    FT_Long    cid_supplement;
-
-    FT_Long    cid_font_version;
-    FT_Long    cid_font_revision;
-    FT_Long    cid_font_type;
-    FT_ULong   cid_count;
-    FT_ULong   cid_uid_base;
-    FT_ULong   cid_fd_array_offset;
-    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;
-    FT_Byte   num_other_blues;
-    FT_Byte   num_family_blues;
-    FT_Byte   num_family_other_blues;
-
-    FT_Pos    blue_values[14];
-    FT_Pos    other_blues[10];
-    FT_Pos    family_blues[14];
-    FT_Pos    family_other_blues[10];
-
-    FT_Fixed  blue_scale;
-    FT_Pos    blue_shift;
-    FT_Pos    blue_fuzz;
-    FT_Pos    standard_width;
-    FT_Pos    standard_height;
-
-    FT_Byte   num_snap_widths;
-    FT_Byte   num_snap_heights;
-    FT_Pos    snap_widths[13];
-    FT_Pos    snap_heights[13];
-    FT_Bool   force_bold;
-    FT_Fixed  force_bold_threshold;
-    FT_Int    lenIV;
-    FT_Int    language_group;
-    FT_Fixed  expansion_factor;
-    FT_Long   initial_random_seed;
-    FT_ULong  local_subrs_offset;
-    FT_Pos    default_width;
-    FT_Pos    nominal_width;
-
-    /* fields for CFF2 */
-    FT_UInt      vsindex;
-    CFF_SubFont  subfont;
-
-  } CFF_PrivateRec, *CFF_Private;
-
-
-  typedef struct  CFF_FDSelectRec_
-  {
-    FT_Byte   format;
-    FT_UInt   range_count;
-
-    /* that's the table, taken from the file `as is' */
-    FT_Byte*  data;
-    FT_UInt   data_size;
-
-    /* small cache for format 3 only */
-    FT_UInt   cache_first;
-    FT_UInt   cache_count;
-    FT_Byte   cache_fd;
-
-  } CFF_FDSelectRec, *CFF_FDSelect;
-
-
-  /* A SubFont packs a font dict and a private dict together.  They are */
-  /* needed to support CID-keyed CFF fonts.                             */
-  typedef struct  CFF_SubFontRec_
-  {
-    CFF_FontRecDictRec  font_dict;
-    CFF_PrivateRec      private_dict;
-
-    /* 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 */
-
-    /* `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 */
-
-  } CFF_SubFontRec;
-
-
-#define CFF_MAX_CID_FONTS  256
-
-
-  typedef struct  CFF_FontRec_
-  {
-    FT_Library       library;
-    FT_Stream        stream;
-    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_UInt          top_dict_length;   /* cff2 only */
-
-    FT_Bool          cff2;
-
-    CFF_IndexRec     name_index;
-    CFF_IndexRec     top_dict_index;
-    CFF_IndexRec     global_subrs_index;
-
-    CFF_EncodingRec  encoding;
-    CFF_CharsetRec   charset;
-
-    CFF_IndexRec     charstrings_index;
-    CFF_IndexRec     font_dict_index;
-    CFF_IndexRec     private_index;
-    CFF_IndexRec     local_subrs_index;
-
-    FT_String*       font_name;
-
-    /* array of pointers into Global Subrs INDEX data */
-    FT_Byte**        global_subrs;
-
-    /* array of pointers into String INDEX data stored at string_pool */
-    FT_UInt          num_strings;
-    FT_Byte**        strings;
-    FT_Byte*         string_pool;
-    FT_ULong         string_pool_size;
-
-    CFF_SubFontRec   top_font;
-    FT_UInt          num_subfonts;
-    CFF_SubFont      subfonts[CFF_MAX_CID_FONTS];
-
-    CFF_FDSelectRec  fd_select;
-
-    /* interface to PostScript hinter */
-    PSHinter_Service  pshinter;
-
-    /* interface to Postscript Names service */
-    FT_Service_PsCMaps  psnames;
-
-    /* since version 2.3.0 */
-    PS_FontInfoRec*  font_info;   /* font info dictionary */
-
-    /* since version 2.3.6 */
-    FT_String*       registry;
-    FT_String*       ordering;
-
-    /* since version 2.4.12 */
-    FT_Generic       cf2_instance;
-
-    CFF_VStoreRec    vstore;        /* parsed vstore structure */
-
-  } CFF_FontRec;
-
-
-FT_END_HEADER
-
-#endif /* CFFTYPES_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/ciderrs.h b/third_party/freetype/src/cid/ciderrs.h
deleted file mode 100644
index 709dc8c..0000000
--- a/third_party/freetype/src/cid/ciderrs.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ciderrs.h                                                              */
-/*                                                                         */
-/*    CID error codes (specification only).                                */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the CID error enumeration constants.      */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef CIDERRS_H_
-#define CIDERRS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  CID_Err_
-#define FT_ERR_BASE    FT_Mod_Err_CID
-
-#include FT_ERRORS_H
-
-#endif /* CIDERRS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidgload.c b/third_party/freetype/src/cid/cidgload.c
deleted file mode 100644
index b96c333..0000000
--- a/third_party/freetype/src/cid/cidgload.c
+++ /dev/null
@@ -1,458 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidgload.c                                                             */
-/*                                                                         */
-/*    CID-keyed Type1 Glyph Loader (body).                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "cidload.h"
-#include "cidgload.h"
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_OUTLINE_H
-#include FT_INTERNAL_CALC_H
-
-#include "ciderrs.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_cidgload
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  cid_load_glyph( T1_Decoder  decoder,
-                  FT_UInt     glyph_index )
-  {
-    CID_Face       face = (CID_Face)decoder->builder.face;
-    CID_FaceInfo   cid  = &face->cid;
-    FT_Byte*       p;
-    FT_ULong       fd_select;
-    FT_Stream      stream       = face->cid_stream;
-    FT_Error       error        = FT_Err_Ok;
-    FT_Byte*       charstring   = NULL;
-    FT_Memory      memory       = face->root.memory;
-    FT_ULong       glyph_length = 0;
-    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_InterfaceRec *inc =
-                                  face->root.internal->incremental_interface;
-#endif
-
-
-    FT_TRACE1(( "cid_load_glyph: glyph index %d\n", glyph_index ));
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* For incremental fonts get the character data using */
-    /* the callback function.                             */
-    if ( inc )
-    {
-      FT_Data  glyph_data;
-
-
-      error = inc->funcs->get_glyph_data( inc->object,
-                                          glyph_index, &glyph_data );
-      if ( error )
-        goto Exit;
-
-      p         = (FT_Byte*)glyph_data.pointer;
-      fd_select = cid_get_offset( &p, (FT_Byte)cid->fd_bytes );
-
-      if ( glyph_data.length != 0 )
-      {
-        glyph_length = (FT_ULong)( glyph_data.length - cid->fd_bytes );
-        (void)FT_ALLOC( charstring, glyph_length );
-        if ( !error )
-          ft_memcpy( charstring, glyph_data.pointer + cid->fd_bytes,
-                     glyph_length );
-      }
-
-      inc->funcs->free_glyph_data( inc->object, &glyph_data );
-
-      if ( error )
-        goto Exit;
-    }
-
-    else
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    /* For ordinary fonts read the CID font dictionary index */
-    /* and charstring offset from the CIDMap.                */
-    {
-      FT_UInt   entry_len = (FT_UInt)( cid->fd_bytes + cid->gd_bytes );
-      FT_ULong  off1, off2;
-
-
-      if ( FT_STREAM_SEEK( cid->data_offset + cid->cidmap_offset +
-                           glyph_index * entry_len )               ||
-           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;
-      off2      = cid_get_offset( &p, (FT_Byte)cid->gd_bytes );
-      FT_FRAME_EXIT();
-
-      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 ) )
-        goto Exit;
-      if ( FT_STREAM_READ_AT( cid->data_offset + off1,
-                              charstring, glyph_length ) )
-        goto Exit;
-    }
-
-    /* Now set up the subrs array and parse the charstrings. */
-    {
-      CID_FaceDict  dict;
-      CID_Subrs     cid_subrs = face->subrs + fd_select;
-      FT_UInt       cs_offset;
-
-
-      /* Set up subrs */
-      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;
-
-      decoder->font_matrix = dict->font_matrix;
-      decoder->font_offset = dict->font_offset;
-      decoder->lenIV       = dict->private_dict.lenIV;
-
-      /* Decode the charstring. */
-
-      /* 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 );
-    }
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* Incremental fonts can optionally override the metrics. */
-    if ( !error && inc && inc->funcs->get_glyph_metrics )
-    {
-      FT_Incremental_MetricsRec  metrics;
-
-
-      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
-      metrics.bearing_y = 0;
-      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
-      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
-
-      error = inc->funcs->get_glyph_metrics( inc->object,
-                                             glyph_index, FALSE, &metrics );
-
-      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
-      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
-      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
-    }
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-  Exit:
-    FT_FREE( charstring );
-
-    return error;
-  }
-
-
-#if 0
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /**********                                                      *********/
-  /**********                                                      *********/
-  /**********            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 )
-  cid_face_compute_max_advance( CID_Face  face,
-                                FT_Int*   max_advance )
-  {
-    FT_Error       error;
-    T1_DecoderRec  decoder;
-    FT_Int         glyph_index;
-
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    *max_advance = 0;
-
-    /* Initialize load decoder */
-    error = psaux->t1_decoder_funcs->init( &decoder,
-                                           (FT_Face)face,
-                                           0, /* size       */
-                                           0, /* glyph slot */
-                                           0, /* glyph names! XXX */
-                                           0, /* blend == 0 */
-                                           0, /* hinting == 0 */
-                                           cid_load_glyph );
-    if ( error )
-      return error;
-
-    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
-    /*       if we ever support CID-keyed multiple master fonts     */
-
-    decoder.builder.metrics_only = 1;
-    decoder.builder.load_points  = 0;
-
-    /* for each glyph, parse the glyph charstring and extract */
-    /* the advance width                                      */
-    for ( glyph_index = 0; glyph_index < face->root.num_glyphs;
-          glyph_index++ )
-    {
-      /* now get load the unscaled outline */
-      error = cid_load_glyph( &decoder, glyph_index );
-      /* ignore the error if one occurred - skip to next glyph */
-    }
-
-    *max_advance = FIXED_TO_INT( decoder.builder.advance.x );
-
-    psaux->t1_decoder_funcs->done( &decoder );
-
-    return FT_Err_Ok;
-  }
-
-
-#endif /* 0 */
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cid_slot_load_glyph( FT_GlyphSlot  cidglyph,      /* CID_GlyphSlot */
-                       FT_Size       cidsize,       /* CID_Size      */
-                       FT_UInt       glyph_index,
-                       FT_Int32      load_flags )
-  {
-    CID_GlyphSlot  glyph = (CID_GlyphSlot)cidglyph;
-    FT_Error       error;
-    T1_DecoderRec  decoder;
-    CID_Face       face = (CID_Face)cidglyph->face;
-    FT_Bool        hinting;
-
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-    FT_Matrix      font_matrix;
-    FT_Vector      font_offset;
-
-
-    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( load_flags & FT_LOAD_NO_RECURSE )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    glyph->x_scale = cidsize->metrics.x_scale;
-    glyph->y_scale = cidsize->metrics.y_scale;
-
-    cidglyph->outline.n_points   = 0;
-    cidglyph->outline.n_contours = 0;
-
-    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
-                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
-
-    cidglyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
-    error = psaux->t1_decoder_funcs->init( &decoder,
-                                           cidglyph->face,
-                                           cidsize,
-                                           cidglyph,
-                                           0, /* glyph names -- XXX */
-                                           0, /* blend == 0 */
-                                           hinting,
-                                           FT_LOAD_TARGET_MODE( load_flags ),
-                                           cid_load_glyph );
-    if ( error )
-      goto Exit;
-
-    /* TODO: initialize decoder.len_buildchar and decoder.buildchar */
-    /*       if we ever support CID-keyed multiple master fonts     */
-
-    /* set up the decoder */
-    decoder.builder.no_recurse = FT_BOOL(
-      ( ( load_flags & FT_LOAD_NO_RECURSE ) != 0 ) );
-
-    error = cid_load_glyph( &decoder, glyph_index );
-    if ( error )
-      goto Exit;
-
-    font_matrix = decoder.font_matrix;
-    font_offset = decoder.font_offset;
-
-    /* save new glyph tables */
-    psaux->t1_decoder_funcs->done( &decoder );
-
-    /* now set the metrics -- this is rather simple, as    */
-    /* the left side bearing is the xMin, and the top side */
-    /* bearing the yMax                                    */
-    cidglyph->outline.flags &= FT_OUTLINE_OWNER;
-    cidglyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
-    /* for composite glyphs, return only left side bearing and */
-    /* advance width                                           */
-    if ( load_flags & FT_LOAD_NO_RECURSE )
-    {
-      FT_Slot_Internal  internal = cidglyph->internal;
-
-
-      cidglyph->metrics.horiBearingX =
-        FIXED_TO_INT( decoder.builder.left_bearing.x );
-      cidglyph->metrics.horiAdvance =
-        FIXED_TO_INT( decoder.builder.advance.x );
-
-      internal->glyph_matrix      = font_matrix;
-      internal->glyph_delta       = font_offset;
-      internal->glyph_transformed = 1;
-    }
-    else
-    {
-      FT_BBox            cbox;
-      FT_Glyph_Metrics*  metrics = &cidglyph->metrics;
-
-
-      /* copy the _unscaled_ advance width */
-      metrics->horiAdvance =
-        FIXED_TO_INT( decoder.builder.advance.x );
-      cidglyph->linearHoriAdvance =
-        FIXED_TO_INT( decoder.builder.advance.x );
-      cidglyph->internal->glyph_transformed = 0;
-
-      /* make up vertical ones */
-      metrics->vertAdvance        = ( face->cid.font_bbox.yMax -
-                                      face->cid.font_bbox.yMin ) >> 16;
-      cidglyph->linearVertAdvance = metrics->vertAdvance;
-
-      cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;
-
-      if ( cidsize->metrics.y_ppem < 24 )
-        cidglyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
-      /* 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 );
-
-        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( &cidglyph->outline,
-                              font_offset.x,
-                              font_offset.y );
-
-        metrics->horiAdvance += font_offset.x;
-        metrics->vertAdvance += font_offset.y;
-      }
-
-      if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
-      {
-        /* scale the outline and the metrics */
-        FT_Int       n;
-        FT_Outline*  cur = decoder.builder.base;
-        FT_Vector*   vec = cur->points;
-        FT_Fixed     x_scale = glyph->x_scale;
-        FT_Fixed     y_scale = glyph->y_scale;
-
-
-        /* First of all, scale the points */
-        if ( !hinting || !decoder.builder.hints_funcs )
-          for ( n = cur->n_points; n > 0; n--, vec++ )
-          {
-            vec->x = FT_MulFix( vec->x, x_scale );
-            vec->y = FT_MulFix( vec->y, y_scale );
-          }
-
-        /* Then scale the metrics */
-        metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
-        metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
-      }
-
-      /* compute the other metrics */
-      FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
-
-      metrics->width  = cbox.xMax - cbox.xMin;
-      metrics->height = cbox.yMax - cbox.yMin;
-
-      metrics->horiBearingX = cbox.xMin;
-      metrics->horiBearingY = cbox.yMax;
-
-      if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-      {
-        /* make up vertical ones */
-        ft_synthesize_vertical_metrics( metrics,
-                                        metrics->vertAdvance );
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidgload.h b/third_party/freetype/src/cid/cidgload.h
deleted file mode 100644
index 7f816b5..0000000
--- a/third_party/freetype/src/cid/cidgload.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidgload.h                                                             */
-/*                                                                         */
-/*    OpenType Glyph Loader (specification).                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CIDGLOAD_H_
-#define CIDGLOAD_H_
-
-
-#include <ft2build.h>
-#include "cidobjs.h"
-
-
-FT_BEGIN_HEADER
-
-
-#if 0
-
-  /* Compute the maximum advance width of a font through quick parsing */
-  FT_LOCAL( FT_Error )
-  cid_face_compute_max_advance( CID_Face  face,
-                                FT_Int*   max_advance );
-
-#endif /* 0 */
-
-  FT_LOCAL( FT_Error )
-  cid_slot_load_glyph( FT_GlyphSlot  glyph,         /* CID_Glyph_Slot */
-                       FT_Size       size,          /* CID_Size       */
-                       FT_UInt       glyph_index,
-                       FT_Int32      load_flags );
-
-
-FT_END_HEADER
-
-#endif /* CIDGLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidload.c b/third_party/freetype/src/cid/cidload.c
deleted file mode 100644
index ff07221..0000000
--- a/third_party/freetype/src/cid/cidload.c
+++ /dev/null
@@ -1,846 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidload.c                                                              */
-/*                                                                         */
-/*    CID-keyed Type1 font loader (body).                                  */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_CONFIG_CONFIG_H
-#include FT_MULTIPLE_MASTERS_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-#include "cidload.h"
-
-#include "ciderrs.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_cidload
-
-
-  /* read a single offset */
-  FT_LOCAL_DEF( FT_ULong )
-  cid_get_offset( FT_Byte*  *start,
-                  FT_Byte    offsize )
-  {
-    FT_ULong  result;
-    FT_Byte*  p = *start;
-
-
-    for ( result = 0; offsize > 0; offsize-- )
-    {
-      result <<= 8;
-      result  |= *p++;
-    }
-
-    *start = p;
-    return result;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    TYPE 1 SYMBOL PARSING                      *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  static FT_Error
-  cid_load_keyword( CID_Face        face,
-                    CID_Loader*     loader,
-                    const T1_Field  keyword )
-  {
-    FT_Error      error;
-    CID_Parser*   parser = &loader->parser;
-    FT_Byte*      object;
-    void*         dummy_object;
-    CID_FaceInfo  cid = &face->cid;
-
-
-    /* if the keyword has a dedicated callback, call it */
-    if ( keyword->type == T1_FIELD_TYPE_CALLBACK )
-    {
-      keyword->reader( (FT_Face)face, parser );
-      error = parser->root.error;
-      goto Exit;
-    }
-
-    /* we must now compute the address of our target object */
-    switch ( keyword->location )
-    {
-    case T1_FIELD_LOCATION_CID_INFO:
-      object = (FT_Byte*)cid;
-      break;
-
-    case T1_FIELD_LOCATION_FONT_INFO:
-      object = (FT_Byte*)&cid->font_info;
-      break;
-
-    case T1_FIELD_LOCATION_FONT_EXTRA:
-      object = (FT_Byte*)&face->font_extra;
-      break;
-
-    case T1_FIELD_LOCATION_BBOX:
-      object = (FT_Byte*)&cid->font_bbox;
-      break;
-
-    default:
-      {
-        CID_FaceDict  dict;
-
-
-        if ( parser->num_dict < 0 || parser->num_dict >= cid->num_dicts )
-        {
-          FT_ERROR(( "cid_load_keyword: invalid use of `%s'\n",
-                     keyword->ident ));
-          error = FT_THROW( Syntax_Error );
-          goto Exit;
-        }
-
-        dict = cid->font_dicts + parser->num_dict;
-        switch ( keyword->location )
-        {
-        case T1_FIELD_LOCATION_PRIVATE:
-          object = (FT_Byte*)&dict->private_dict;
-          break;
-
-        default:
-          object = (FT_Byte*)dict;
-        }
-      }
-    }
-
-    dummy_object = object;
-
-    /* now, load the keyword data in the object's field(s) */
-    if ( keyword->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
-         keyword->type == T1_FIELD_TYPE_FIXED_ARRAY   )
-      error = cid_parser_load_field_table( &loader->parser, keyword,
-                                           &dummy_object );
-    else
-      error = cid_parser_load_field( &loader->parser,
-                                     keyword, &dummy_object );
-  Exit:
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  cid_parse_font_matrix( CID_Face     face,
-                         CID_Parser*  parser )
-  {
-    CID_FaceDict  dict;
-    FT_Face       root = (FT_Face)&face->root;
-    FT_Fixed      temp[6];
-    FT_Fixed      temp_scale;
-
-
-    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
-    {
-      FT_Matrix*  matrix;
-      FT_Vector*  offset;
-      FT_Int      result;
-
-
-      dict   = face->cid.font_dicts + parser->num_dict;
-      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 )
-        return FT_THROW( Invalid_File_Format );
-
-      temp_scale = FT_ABS( temp[3] );
-
-      if ( temp_scale == 0 )
-      {
-        FT_ERROR(( "cid_parse_font_matrix: invalid font matrix\n" ));
-        return FT_THROW( Invalid_File_Format );
-      }
-
-      /* 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 );
-        temp[4] = FT_DivFix( temp[4], temp_scale );
-        temp[5] = FT_DivFix( temp[5], temp_scale );
-        temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
-      }
-
-      matrix->xx = temp[0];
-      matrix->yx = temp[1];
-      matrix->xy = temp[2];
-      matrix->yy = temp[3];
-
-      /* note that the font offsets are expressed in integer font units */
-      offset->x  = temp[4] >> 16;
-      offset->y  = temp[5] >> 16;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  parse_fd_array( CID_Face     face,
-                  CID_Parser*  parser )
-  {
-    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;
-
-
-    num_dicts = cid_parser_to_int( parser );
-    if ( num_dicts < 0 )
-    {
-      FT_ERROR(( "parse_fd_array: invalid number of dictionaries\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      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;
-
-
-      if ( FT_NEW_ARRAY( cid->font_dicts, num_dicts ) )
-        goto Exit;
-
-      cid->num_dicts = num_dicts;
-
-      /* don't forget to set a few defaults */
-      for ( n = 0; n < cid->num_dicts; n++ )
-      {
-        CID_FaceDict  dict = cid->font_dicts + n;
-
-
-        /* default value for lenIV */
-        dict->private_dict.lenIV = 4;
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* by mistake, `expansion_factor' appears both in PS_PrivateRec */
-  /* and CID_FaceDictRec (both are public header files and can't  */
-  /* changed); we simply copy the value                           */
-
-  FT_CALLBACK_DEF( FT_Error )
-  parse_expansion_factor( CID_Face     face,
-                          CID_Parser*  parser )
-  {
-    CID_FaceDict  dict;
-
-
-    if ( parser->num_dict >= 0 && parser->num_dict < face->cid.num_dicts )
-    {
-      dict = face->cid.font_dicts + parser->num_dict;
-
-      dict->expansion_factor              = cid_parser_to_fixed( parser, 0 );
-      dict->private_dict.expansion_factor = dict->expansion_factor;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  static
-  const T1_FieldRec  cid_field_records[] =
-  {
-
-#include "cidtoken.h"
-
-    T1_FIELD_CALLBACK( "FDArray",         parse_fd_array, 0 )
-    T1_FIELD_CALLBACK( "FontMatrix",      cid_parse_font_matrix, 0 )
-    T1_FIELD_CALLBACK( "ExpansionFactor", parse_expansion_factor, 0 )
-
-    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
-  };
-
-
-  static FT_Error
-  cid_parse_dict( CID_Face     face,
-                  CID_Loader*  loader,
-                  FT_Byte*     base,
-                  FT_ULong     size )
-  {
-    CID_Parser*  parser = &loader->parser;
-
-
-    parser->root.cursor = base;
-    parser->root.limit  = base + size;
-    parser->root.error  = FT_Err_Ok;
-
-    {
-      FT_Byte*  cur   = base;
-      FT_Byte*  limit = cur + size;
-
-
-      for (;;)
-      {
-        FT_Byte*  newlimit;
-
-
-        parser->root.cursor = cur;
-        cid_parser_skip_spaces( parser );
-
-        if ( parser->root.cursor >= limit )
-          newlimit = limit - 1 - 17;
-        else
-          newlimit = parser->root.cursor - 17;
-
-        /* look for `%ADOBeginFontDict' */
-        for ( ; cur < newlimit; cur++ )
-        {
-          if ( *cur == '%'                                            &&
-               ft_strncmp( (char*)cur, "%ADOBeginFontDict", 17 ) == 0 )
-          {
-            /* if /FDArray was found, then cid->num_dicts is > 0, and */
-            /* we can start increasing parser->num_dict               */
-            if ( face->cid.num_dicts > 0 )
-              parser->num_dict++;
-          }
-        }
-
-        cur = parser->root.cursor;
-        /* no error can occur in cid_parser_skip_spaces */
-        if ( cur >= limit )
-          break;
-
-        cid_parser_skip_PS_token( parser );
-        if ( parser->root.cursor >= limit || parser->root.error )
-          break;
-
-        /* look for immediates */
-        if ( *cur == '/' && cur + 2 < limit )
-        {
-          FT_UInt  len;
-
-
-          cur++;
-          len = (FT_UInt)( parser->root.cursor - cur );
-
-          if ( len > 0 && len < 22 )
-          {
-            /* now compare the immediate name to the keyword table */
-            T1_Field  keyword = (T1_Field)cid_field_records;
-
-
-            for (;;)
-            {
-              FT_Byte*  name;
-
-
-              name = (FT_Byte*)keyword->ident;
-              if ( !name )
-                break;
-
-              if ( cur[0] == name[0]                     &&
-                   len == ft_strlen( (const char*)name ) )
-              {
-                FT_UInt  n;
-
-
-                for ( n = 1; n < len; n++ )
-                  if ( cur[n] != name[n] )
-                    break;
-
-                if ( n >= len )
-                {
-                  /* we found it - run the parsing callback */
-                  parser->root.error = cid_load_keyword( face,
-                                                         loader,
-                                                         keyword );
-                  if ( parser->root.error )
-                    return parser->root.error;
-                  break;
-                }
-              }
-              keyword++;
-            }
-          }
-        }
-
-        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;
-  }
-
-
-  /* read the subrmap and the subrs of each font dict */
-  static FT_Error
-  cid_read_subrs( CID_Face  face )
-  {
-    CID_FaceInfo   cid    = &face->cid;
-    FT_Memory      memory = face->root.memory;
-    FT_Stream      stream = face->cid_stream;
-    FT_Error       error;
-    FT_Int         n;
-    CID_Subrs      subr;
-    FT_UInt        max_offsets = 0;
-    FT_ULong*      offsets = NULL;
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    if ( FT_NEW_ARRAY( face->subrs, cid->num_dicts ) )
-      goto Exit;
-
-    subr = face->subrs;
-    for ( n = 0; n < cid->num_dicts; n++, subr++ )
-    {
-      CID_FaceDict  dict  = cid->font_dicts + n;
-      FT_Int        lenIV = dict->private_dict.lenIV;
-      FT_UInt       count, num_subrs = dict->num_subrs;
-      FT_ULong      data_len;
-      FT_Byte*      p;
-
-
-      if ( !num_subrs )
-        continue;
-
-      /* reallocate offsets array if needed */
-      if ( num_subrs + 1 > max_offsets )
-      {
-        FT_UInt  new_max = FT_PAD_CEIL( num_subrs + 1, 4 );
-
-
-        if ( new_max <= max_offsets )
-        {
-          error = FT_THROW( Syntax_Error );
-          goto Fail;
-        }
-
-        if ( FT_RENEW_ARRAY( offsets, max_offsets, new_max ) )
-          goto Fail;
-
-        max_offsets = new_max;
-      }
-
-      /* read the subrmap's offsets */
-      if ( FT_STREAM_SEEK( cid->data_offset + dict->subrmap_offset )     ||
-           FT_FRAME_ENTER( ( num_subrs + 1 ) * (FT_UInt)dict->sd_bytes ) )
-        goto Fail;
-
-      p = (FT_Byte*)stream->cursor;
-      for ( count = 0; count <= num_subrs; count++ )
-        offsets[count] = cid_get_offset( &p, (FT_Byte)dict->sd_bytes );
-
-      FT_FRAME_EXIT();
-
-      /* 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 )       )
-        goto Fail;
-
-      if ( FT_STREAM_SEEK( cid->data_offset + offsets[0] ) ||
-           FT_STREAM_READ( subr->code[0], data_len )  )
-        goto Fail;
-
-      /* set up pointers */
-      for ( count = 1; count <= num_subrs; count++ )
-      {
-        FT_ULong  len;
-
-
-        len               = offsets[count] - offsets[count - 1];
-        subr->code[count] = subr->code[count - 1] + len;
-      }
-
-      /* decrypt subroutines, but only if lenIV >= 0 */
-      if ( lenIV >= 0 )
-      {
-        for ( count = 0; count < num_subrs; count++ )
-        {
-          FT_ULong  len;
-
-
-          len = offsets[count + 1] - offsets[count];
-          psaux->t1_decrypt( subr->code[count], len, 4330 );
-        }
-      }
-
-      subr->num_subrs = (FT_Int)num_subrs;
-    }
-
-  Exit:
-    FT_FREE( offsets );
-    return error;
-
-  Fail:
-    if ( face->subrs )
-    {
-      for ( n = 0; n < cid->num_dicts; n++ )
-      {
-        if ( face->subrs[n].code )
-          FT_FREE( face->subrs[n].code[0] );
-
-        FT_FREE( face->subrs[n].code );
-      }
-      FT_FREE( face->subrs );
-    }
-    goto Exit;
-  }
-
-
-  static void
-  cid_init_loader( CID_Loader*  loader,
-                   CID_Face     face )
-  {
-    FT_UNUSED( face );
-
-    FT_ZERO( loader );
-  }
-
-
-  static  void
-  cid_done_loader( CID_Loader*  loader )
-  {
-    CID_Parser*  parser = &loader->parser;
-
-
-    /* finalize parser */
-    cid_parser_done( parser );
-  }
-
-
-  static FT_Error
-  cid_hex_to_binary( FT_Byte*  data,
-                     FT_ULong  data_len,
-                     FT_ULong  offset,
-                     CID_Face  face )
-  {
-    FT_Stream  stream = face->root.stream;
-    FT_Error   error;
-
-    FT_Byte    buffer[256];
-    FT_Byte   *p, *plimit;
-    FT_Byte   *d, *dlimit;
-    FT_Byte    val;
-
-    FT_Bool    upper_nibble, done;
-
-
-    if ( FT_STREAM_SEEK( offset ) )
-      goto Exit;
-
-    d      = data;
-    dlimit = d + data_len;
-    p      = buffer;
-    plimit = p;
-
-    upper_nibble = 1;
-    done         = 0;
-
-    while ( d < dlimit )
-    {
-      if ( p >= plimit )
-      {
-        FT_ULong  oldpos = FT_STREAM_POS();
-        FT_ULong  size   = stream->size - oldpos;
-
-
-        if ( size == 0 )
-        {
-          error = FT_THROW( Syntax_Error );
-          goto Exit;
-        }
-
-        if ( FT_STREAM_READ( buffer, 256 > size ? size : 256 ) )
-          goto Exit;
-        p      = buffer;
-        plimit = p + FT_STREAM_POS() - oldpos;
-      }
-
-      if ( ft_isdigit( *p ) )
-        val = (FT_Byte)( *p - '0' );
-      else if ( *p >= 'a' && *p <= 'f' )
-        val = (FT_Byte)( *p - 'a' );
-      else if ( *p >= 'A' && *p <= 'F' )
-        val = (FT_Byte)( *p - 'A' + 10 );
-      else if ( *p == ' '  ||
-                *p == '\t' ||
-                *p == '\r' ||
-                *p == '\n' ||
-                *p == '\f' ||
-                *p == '\0' )
-      {
-        p++;
-        continue;
-      }
-      else if ( *p == '>' )
-      {
-        val  = 0;
-        done = 1;
-      }
-      else
-      {
-        error = FT_THROW( Syntax_Error );
-        goto Exit;
-      }
-
-      if ( upper_nibble )
-        *d = (FT_Byte)( val << 4 );
-      else
-      {
-        *d = (FT_Byte)( *d + val );
-        d++;
-      }
-
-      upper_nibble = (FT_Byte)( 1 - upper_nibble );
-
-      if ( done )
-        break;
-
-      p++;
-    }
-
-    error = FT_Err_Ok;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cid_face_open( CID_Face  face,
-                 FT_Int    face_index )
-  {
-    CID_Loader   loader;
-    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 );
-
-    parser = &loader.parser;
-    error = cid_parser_new( parser, face->root.stream, face->root.memory,
-                            (PSAux_Service)face->psaux );
-    if ( error )
-      goto Exit;
-
-    error = cid_parse_dict( face, &loader,
-                            parser->postscript,
-                            parser->postscript_len );
-    if ( error )
-      goto Exit;
-
-    if ( face_index < 0 )
-      goto Exit;
-
-    if ( FT_NEW( face->cid_stream ) )
-      goto Exit;
-
-    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 )    ||
-           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 );
-      cid->data_offset = 0;
-    }
-    else
-    {
-      *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:
-    cid_done_loader( &loader );
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidload.h b/third_party/freetype/src/cid/cidload.h
deleted file mode 100644
index 45a0e6d..0000000
--- a/third_party/freetype/src/cid/cidload.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidload.h                                                              */
-/*                                                                         */
-/*    CID-keyed Type1 font loader (specification).                         */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CIDLOAD_H_
-#define CIDLOAD_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include "cidparse.h"
-
-
-FT_BEGIN_HEADER
-
-
-  typedef struct  CID_Loader_
-  {
-    CID_Parser  parser;          /* parser used to read the stream */
-    FT_Int      num_chars;       /* number of characters in encoding */
-
-  } CID_Loader;
-
-
-  FT_LOCAL( FT_ULong )
-  cid_get_offset( FT_Byte**  start,
-                  FT_Byte    offsize );
-
-  FT_LOCAL( FT_Error )
-  cid_face_open( CID_Face  face,
-                 FT_Int    face_index );
-
-
-FT_END_HEADER
-
-#endif /* CIDLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidobjs.c b/third_party/freetype/src/cid/cidobjs.c
deleted file mode 100644
index 7830e1f..0000000
--- a/third_party/freetype/src/cid/cidobjs.c
+++ /dev/null
@@ -1,492 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidobjs.c                                                              */
-/*                                                                         */
-/*    CID objects manager (body).                                          */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-
-#include "cidgload.h"
-#include "cidload.h"
-
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
-
-#include "ciderrs.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_cidobjs
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            SLOT  FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-  FT_LOCAL_DEF( void )
-  cid_slot_done( FT_GlyphSlot  slot )
-  {
-    slot->internal->glyph_hints = NULL;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cid_slot_init( FT_GlyphSlot  slot )
-  {
-    CID_Face          face;
-    PSHinter_Service  pshinter;
-
-
-    face     = (CID_Face)slot->face;
-    pshinter = (PSHinter_Service)face->pshinter;
-
-    if ( pshinter )
-    {
-      FT_Module  module;
-
-
-      module = FT_Get_Module( slot->face->driver->root.library,
-                              "pshinter" );
-      if ( module )
-      {
-        T1_Hints_Funcs  funcs;
-
-
-        funcs = pshinter->get_t1_funcs( module );
-        slot->internal->glyph_hints = (void*)funcs;
-      }
-    }
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                           SIZE  FUNCTIONS                             */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static PSH_Globals_Funcs
-  cid_size_get_globals_funcs( CID_Size  size )
-  {
-    CID_Face          face     = (CID_Face)size->root.face;
-    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
-    FT_Module         module;
-
-
-    module = FT_Get_Module( size->root.face->driver->root.library,
-                            "pshinter" );
-    return ( module && pshinter && pshinter->get_globals_funcs )
-           ? pshinter->get_globals_funcs( module )
-           : 0;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  cid_size_done( FT_Size  cidsize )         /* CID_Size */
-  {
-    CID_Size  size = (CID_Size)cidsize;
-
-
-    if ( cidsize->internal )
-    {
-      PSH_Globals_Funcs  funcs;
-
-
-      funcs = cid_size_get_globals_funcs( size );
-      if ( funcs )
-        funcs->destroy( (PSH_Globals)cidsize->internal );
-
-      cidsize->internal = NULL;
-    }
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  cid_size_init( FT_Size  cidsize )     /* CID_Size */
-  {
-    CID_Size           size  = (CID_Size)cidsize;
-    FT_Error           error = FT_Err_Ok;
-    PSH_Globals_Funcs  funcs = cid_size_get_globals_funcs( size );
-
-
-    if ( funcs )
-    {
-      PSH_Globals   globals;
-      CID_Face      face = (CID_Face)cidsize->face;
-      CID_FaceDict  dict = face->cid.font_dicts + face->root.face_index;
-      PS_Private    priv = &dict->private_dict;
-
-
-      error = funcs->create( cidsize->face->memory, priv, &globals );
-      if ( !error )
-        cidsize->internal = (FT_Size_Internal)(void*)globals;
-    }
-
-    return error;
-  }
-
-
-  FT_LOCAL( FT_Error )
-  cid_size_request( FT_Size          size,
-                    FT_Size_Request  req )
-  {
-    PSH_Globals_Funcs  funcs;
-
-
-    FT_Request_Metrics( size->face, req );
-
-    funcs = cid_size_get_globals_funcs( (CID_Size)size );
-
-    if ( funcs )
-      funcs->set_scale( (PSH_Globals)size->internal,
-                        size->metrics.x_scale,
-                        size->metrics.y_scale,
-                        0, 0 );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                           FACE  FUNCTIONS                             */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cid_face_done                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given face object.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A pointer to the face object to destroy.                   */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  cid_face_done( FT_Face  cidface )         /* CID_Face */
-  {
-    CID_Face      face = (CID_Face)cidface;
-    FT_Memory     memory;
-    CID_FaceInfo  cid;
-    PS_FontInfo   info;
-
-
-    if ( !face )
-      return;
-
-    cid    = &face->cid;
-    info   = &cid->font_info;
-    memory = cidface->memory;
-
-    /* release subrs */
-    if ( face->subrs )
-    {
-      FT_Int  n;
-
-
-      for ( n = 0; n < cid->num_dicts; n++ )
-      {
-        CID_Subrs  subr = face->subrs + n;
-
-
-        if ( subr->code )
-        {
-          FT_FREE( subr->code[0] );
-          FT_FREE( subr->code );
-        }
-      }
-
-      FT_FREE( face->subrs );
-    }
-
-    /* release FontInfo strings */
-    FT_FREE( info->version );
-    FT_FREE( info->notice );
-    FT_FREE( info->full_name );
-    FT_FREE( info->family_name );
-    FT_FREE( info->weight );
-
-    /* release font dictionaries */
-    FT_FREE( cid->font_dicts );
-    cid->num_dicts = 0;
-
-    /* release other strings */
-    FT_FREE( cid->cid_font_name );
-    FT_FREE( cid->registry );
-    FT_FREE( cid->ordering );
-
-    cidface->family_name = NULL;
-    cidface->style_name  = NULL;
-
-    FT_FREE( face->binary_data );
-    FT_FREE( face->cid_stream );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cid_face_init                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given CID face object.                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream     :: The source font stream.                              */
-  /*                                                                       */
-  /*    face_index :: The index of the font face in the resource.          */
-  /*                                                                       */
-  /*    num_params :: Number of additional generic parameters.  Ignored.   */
-  /*                                                                       */
-  /*    params     :: Additional generic parameters.  Ignored.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The newly built face object.                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  cid_face_init( FT_Stream      stream,
-                 FT_Face        cidface,        /* CID_Face */
-                 FT_Int         face_index,
-                 FT_Int         num_params,
-                 FT_Parameter*  params )
-  {
-    CID_Face          face = (CID_Face)cidface;
-    FT_Error          error;
-    PSAux_Service     psaux;
-    PSHinter_Service  pshinter;
-
-    FT_UNUSED( num_params );
-    FT_UNUSED( params );
-    FT_UNUSED( stream );
-
-
-    cidface->num_faces = 1;
-
-    psaux = (PSAux_Service)face->psaux;
-    if ( !psaux )
-    {
-      psaux = (PSAux_Service)FT_Get_Module_Interface(
-                FT_FACE_LIBRARY( face ), "psaux" );
-
-      if ( !psaux )
-      {
-        FT_ERROR(( "cid_face_init: cannot access `psaux' module\n" ));
-        error = FT_THROW( Missing_Module );
-        goto Exit;
-      }
-
-      face->psaux = psaux;
-    }
-
-    pshinter = (PSHinter_Service)face->pshinter;
-    if ( !pshinter )
-    {
-      pshinter = (PSHinter_Service)FT_Get_Module_Interface(
-                   FT_FACE_LIBRARY( face ), "pshinter" );
-
-      face->pshinter = pshinter;
-    }
-
-    FT_TRACE2(( "CID driver\n" ));
-
-    /* open the tokenizer; this will also check the font format */
-    if ( FT_STREAM_SEEK( 0 ) )
-      goto Exit;
-
-    error = cid_face_open( face, face_index );
-    if ( error )
-      goto Exit;
-
-    /* if we just wanted to check the format, leave successfully now */
-    if ( face_index < 0 )
-      goto Exit;
-
-    /* check the face index */
-    /* XXX: handle CID fonts with more than a single face */
-    if ( ( face_index & 0xFFFF ) != 0 )
-    {
-      FT_ERROR(( "cid_face_init: invalid face index\n" ));
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* now load the font program into the face object */
-
-    /* initialize the face object fields */
-
-    /* set up root face fields */
-    {
-      CID_FaceInfo  cid  = &face->cid;
-      PS_FontInfo   info = &cid->font_info;
-
-
-      cidface->num_glyphs   = (FT_Long)cid->cid_count;
-      cidface->num_charmaps = 0;
-
-      cidface->face_index = face_index & 0xFFFF;
-
-      cidface->face_flags |= FT_FACE_FLAG_SCALABLE   | /* scalable outlines */
-                             FT_FACE_FLAG_HORIZONTAL | /* horizontal data   */
-                             FT_FACE_FLAG_HINTER;      /* has native hinter */
-
-      if ( info->is_fixed_pitch )
-        cidface->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
-
-      /* XXX: TODO: add kerning with .afm support */
-
-      /* get style name -- be careful, some broken fonts only */
-      /* have a /FontName dictionary entry!                   */
-      cidface->family_name = info->family_name;
-      /* assume "Regular" style if we don't know better */
-      cidface->style_name = (char *)"Regular";
-      if ( cidface->family_name )
-      {
-        char*  full   = info->full_name;
-        char*  family = cidface->family_name;
-
-
-        if ( full )
-        {
-          while ( *full )
-          {
-            if ( *full == *family )
-            {
-              family++;
-              full++;
-            }
-            else
-            {
-              if ( *full == ' ' || *full == '-' )
-                full++;
-              else if ( *family == ' ' || *family == '-' )
-                family++;
-              else
-              {
-                if ( !*family )
-                  cidface->style_name = full;
-                break;
-              }
-            }
-          }
-        }
-      }
-      else
-      {
-        /* do we have a `/FontName'? */
-        if ( cid->cid_font_name )
-          cidface->family_name = cid->cid_font_name;
-      }
-
-      /* compute style flags */
-      cidface->style_flags = 0;
-      if ( info->italic_angle )
-        cidface->style_flags |= FT_STYLE_FLAG_ITALIC;
-      if ( info->weight )
-      {
-        if ( !ft_strcmp( info->weight, "Bold"  ) ||
-             !ft_strcmp( info->weight, "Black" ) )
-          cidface->style_flags |= FT_STYLE_FLAG_BOLD;
-      }
-
-      /* no embedded bitmap support */
-      cidface->num_fixed_sizes = 0;
-      cidface->available_sizes = NULL;
-
-      cidface->bbox.xMin =   cid->font_bbox.xMin            >> 16;
-      cidface->bbox.yMin =   cid->font_bbox.yMin            >> 16;
-      /* no `U' suffix here to 0xFFFF! */
-      cidface->bbox.xMax = ( cid->font_bbox.xMax + 0xFFFF ) >> 16;
-      cidface->bbox.yMax = ( cid->font_bbox.yMax + 0xFFFF ) >> 16;
-
-      if ( !cidface->units_per_EM )
-        cidface->units_per_EM = 1000;
-
-      cidface->ascender  = (FT_Short)( cidface->bbox.yMax );
-      cidface->descender = (FT_Short)( cidface->bbox.yMin );
-
-      cidface->height = (FT_Short)( ( cidface->units_per_EM * 12 ) / 10 );
-      if ( cidface->height < cidface->ascender - cidface->descender )
-        cidface->height = (FT_Short)( cidface->ascender - cidface->descender );
-
-      cidface->underline_position  = (FT_Short)info->underline_position;
-      cidface->underline_thickness = (FT_Short)info->underline_thickness;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cid_driver_init                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given CID driver object.                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target driver object.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  cid_driver_init( FT_Module  driver )
-  {
-    FT_UNUSED( driver );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    cid_driver_done                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given CID driver.                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target CID driver.                       */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  cid_driver_done( FT_Module  driver )
-  {
-    FT_UNUSED( driver );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidobjs.h b/third_party/freetype/src/cid/cidobjs.h
deleted file mode 100644
index 8bcf886..0000000
--- a/third_party/freetype/src/cid/cidobjs.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidobjs.h                                                              */
-/*                                                                         */
-/*    CID objects manager (specification).                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CIDOBJS_H_
-#define CIDOBJS_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* The following structures must be defined by the hinter */
-  typedef struct CID_Size_Hints_   CID_Size_Hints;
-  typedef struct CID_Glyph_Hints_  CID_Glyph_Hints;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CID_Driver                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 driver object.                                */
-  /*                                                                       */
-  typedef struct CID_DriverRec_*  CID_Driver;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CID_Size                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 size object.                                  */
-  /*                                                                       */
-  typedef struct CID_SizeRec_*  CID_Size;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CID_GlyphSlot                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 glyph slot object.                            */
-  /*                                                                       */
-  typedef struct CID_GlyphSlotRec_*  CID_GlyphSlot;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    CID_CharMap                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 character mapping object.                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
-  /*    The driver is responsible for making up charmap objects            */
-  /*    corresponding to these tables.                                     */
-  /*                                                                       */
-  typedef struct CID_CharMapRec_*  CID_CharMap;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* HERE BEGINS THE TYPE 1 SPECIFIC STUFF                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  typedef struct  CID_SizeRec_
-  {
-    FT_SizeRec  root;
-    FT_Bool     valid;
-
-  } CID_SizeRec;
-
-
-  typedef struct  CID_GlyphSlotRec_
-  {
-    FT_GlyphSlotRec  root;
-
-    FT_Bool          hint;
-    FT_Bool          scaled;
-
-    FT_Fixed         x_scale;
-    FT_Fixed         y_scale;
-
-  } CID_GlyphSlotRec;
-
-
-  FT_LOCAL( void )
-  cid_slot_done( FT_GlyphSlot  slot );
-
-  FT_LOCAL( FT_Error )
-  cid_slot_init( FT_GlyphSlot  slot );
-
-
-  FT_LOCAL( void )
-  cid_size_done( FT_Size  size );       /* CID_Size */
-
-  FT_LOCAL( FT_Error )
-  cid_size_init( FT_Size  size );       /* CID_Size */
-
-  FT_LOCAL( FT_Error )
-  cid_size_request( FT_Size          size,      /* CID_Size */
-                    FT_Size_Request  req );
-
-  FT_LOCAL( FT_Error )
-  cid_face_init( FT_Stream      stream,
-                 FT_Face        face,           /* CID_Face */
-                 FT_Int         face_index,
-                 FT_Int         num_params,
-                 FT_Parameter*  params );
-
-  FT_LOCAL( void )
-  cid_face_done( FT_Face  face );               /* CID_Face */
-
-
-  FT_LOCAL( FT_Error )
-  cid_driver_init( FT_Module  driver );
-
-  FT_LOCAL( void )
-  cid_driver_done( FT_Module  driver );
-
-
-FT_END_HEADER
-
-#endif /* CIDOBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidparse.c b/third_party/freetype/src/cid/cidparse.c
deleted file mode 100644
index 007609b..0000000
--- a/third_party/freetype/src/cid/cidparse.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidparse.c                                                             */
-/*                                                                         */
-/*    CID-keyed Type1 parser (body).                                       */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_STREAM_H
-
-#include "cidparse.h"
-
-#include "ciderrs.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_cidparse
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    INPUT STREAM PARSER                        *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-#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,
-                  FT_Memory      memory,
-                  PSAux_Service  psaux )
-  {
-    FT_Error  error;
-    FT_ULong  base_offset, offset, ps_len;
-    FT_Byte   *cur, *limit;
-    FT_Byte   *arg1, *arg2;
-
-
-    FT_ZERO( parser );
-    psaux->ps_parser_funcs->init( &parser->root, 0, 0, memory );
-
-    parser->stream = stream;
-
-    base_offset = FT_STREAM_POS();
-
-    /* first of all, check the font format in the header */
-    if ( FT_FRAME_ENTER( 31 ) )
-      goto Exit;
-
-    if ( ft_strncmp( (char *)stream->cursor,
-                     "%!PS-Adobe-3.0 Resource-CIDFont", 31 ) )
-    {
-      FT_TRACE2(( "  not a CID-keyed font\n" ));
-      error = FT_THROW( Unknown_File_Format );
-    }
-
-    FT_FRAME_EXIT();
-    if ( error )
-      goto Exit;
-
-  Again:
-    /* now, read the rest of the file until we find */
-    /* `StartData' or `/sfnts'                      */
-    {
-      /*
-       * 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 )
-      {
-        FT_ULong  stream_len;
-
-
-        stream_len = stream->size - FT_STREAM_POS();
-
-        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;
-        }
-
-        FT_MEM_MOVE( buffer,
-                     buffer + read_offset + read_len - STARTDATA_LEN,
-                     STARTDATA_LEN );
-
-        /* values for the next loop */
-        read_len    = 256;
-        read_offset = STARTDATA_LEN;
-        p           = buffer + read_offset;
-      }
-    }
-
-  Found:
-    /* We have found the start of the binary data or the `/sfnts' token. */
-    /* Now rewind and extract the frame corresponding to this PostScript */
-    /* section.                                                          */
-
-    ps_len = offset - base_offset;
-    if ( FT_STREAM_SEEK( base_offset )                  ||
-         FT_FRAME_EXTRACT( ps_len, parser->postscript ) )
-      goto Exit;
-
-    parser->data_offset    = offset;
-    parser->postscript_len = ps_len;
-    parser->root.base      = parser->postscript;
-    parser->root.cursor    = parser->postscript;
-    parser->root.limit     = parser->root.cursor + ps_len;
-    parser->num_dict       = -1;
-
-    /* Finally, we check whether `StartData' or `/sfnts' was real --  */
-    /* it could be in a comment or string.  We also get the arguments */
-    /* of `StartData' to find out whether the data is represented in  */
-    /* binary or hex format.                                          */
-
-    arg1 = parser->root.cursor;
-    cid_parser_skip_PS_token( parser );
-    cid_parser_skip_spaces  ( parser );
-    arg2 = parser->root.cursor;
-    cid_parser_skip_PS_token( parser );
-    cid_parser_skip_spaces  ( parser );
-
-    limit = parser->root.limit;
-    cur   = parser->root.cursor;
-
-    while ( cur <= limit - SFNTS_LEN )
-    {
-      if ( parser->root.error )
-      {
-        error = parser->root.error;
-        goto Exit;
-      }
-
-      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_strtol( (const char *)arg2, NULL, 10 );
-
-
-          if ( tmp < 0 )
-          {
-            FT_ERROR(( "cid_parser_new: invalid length of hex data\n" ));
-            error = FT_THROW( Invalid_File_Format );
-          }
-          else
-            parser->binary_length = (FT_ULong)tmp;
-        }
-
-        goto Exit;
-      }
-      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 );
-        goto Exit;
-      }
-
-      cid_parser_skip_PS_token( parser );
-      cid_parser_skip_spaces  ( parser );
-      arg1 = arg2;
-      arg2 = cur;
-      cur  = parser->root.cursor;
-    }
-
-    /* we haven't found the correct `StartData'; go back and continue */
-    /* searching                                                      */
-    FT_FRAME_RELEASE( parser->postscript );
-    if ( !FT_STREAM_SEEK( offset ) )
-      goto Again;
-
-  Exit:
-    return error;
-  }
-
-
-#undef STARTDATA
-#undef STARTDATA_LEN
-#undef SFNTS
-#undef SFNTS_LEN
-
-
-  FT_LOCAL_DEF( void )
-  cid_parser_done( CID_Parser*  parser )
-  {
-    /* always free the private dictionary */
-    if ( parser->postscript )
-    {
-      FT_Stream  stream = parser->stream;
-
-
-      FT_FRAME_RELEASE( parser->postscript );
-    }
-    parser->root.funcs.done( &parser->root );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidparse.h b/third_party/freetype/src/cid/cidparse.h
deleted file mode 100644
index 20bebb9..0000000
--- a/third_party/freetype/src/cid/cidparse.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidparse.h                                                             */
-/*                                                                         */
-/*    CID-keyed Type1 parser (specification).                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CIDPARSE_H_
-#define CIDPARSE_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_TYPE1_TYPES_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    CID_Parser                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A CID_Parser is an object used to parse a Type 1 fonts very        */
-  /*    quickly.                                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root           :: The root PS_ParserRec fields.                    */
-  /*                                                                       */
-  /*    stream         :: The current input stream.                        */
-  /*                                                                       */
-  /*    postscript     :: A pointer to the data to be parsed.              */
-  /*                                                                       */
-  /*    postscript_len :: The length of the data to be parsed.             */
-  /*                                                                       */
-  /*    data_offset    :: The start position of the binary data (i.e., the */
-  /*                      end of the data to be parsed.                    */
-  /*                                                                       */
-  /*    binary_length  :: The length of the data after the `StartData'     */
-  /*                      command if the data format is hexadecimal.       */
-  /*                                                                       */
-  /*    cid            :: A structure which holds the information about    */
-  /*                      the current font.                                */
-  /*                                                                       */
-  /*    num_dict       :: The number of font dictionaries.                 */
-  /*                                                                       */
-  typedef struct  CID_Parser_
-  {
-    PS_ParserRec  root;
-    FT_Stream     stream;
-
-    FT_Byte*      postscript;
-    FT_ULong      postscript_len;
-
-    FT_ULong      data_offset;
-
-    FT_ULong      binary_length;
-
-    CID_FaceInfo  cid;
-    FT_Int        num_dict;
-
-  } CID_Parser;
-
-
-  FT_LOCAL( FT_Error )
-  cid_parser_new( CID_Parser*    parser,
-                  FT_Stream      stream,
-                  FT_Memory      memory,
-                  PSAux_Service  psaux );
-
-  FT_LOCAL( void )
-  cid_parser_done( CID_Parser*  parser );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            PARSING ROUTINES                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-#define cid_parser_skip_spaces( p )                 \
-          (p)->root.funcs.skip_spaces( &(p)->root )
-#define cid_parser_skip_PS_token( p )                 \
-          (p)->root.funcs.skip_PS_token( &(p)->root )
-
-#define cid_parser_to_int( p )       (p)->root.funcs.to_int( &(p)->root )
-#define cid_parser_to_fixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )
-
-#define cid_parser_to_coord_array( p, m, c )                 \
-          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
-#define cid_parser_to_fixed_array( p, m, f, t )                 \
-          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
-#define cid_parser_to_token( p, t )                 \
-          (p)->root.funcs.to_token( &(p)->root, t )
-#define cid_parser_to_token_array( p, t, m, c )                 \
-          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
-
-#define cid_parser_load_field( p, f, o )                       \
-          (p)->root.funcs.load_field( &(p)->root, f, o, 0, 0 )
-#define cid_parser_load_field_table( p, f, o )                       \
-          (p)->root.funcs.load_field_table( &(p)->root, f, o, 0, 0 )
-
-
-FT_END_HEADER
-
-#endif /* CIDPARSE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidriver.c b/third_party/freetype/src/cid/cidriver.c
deleted file mode 100644
index bb611a9..0000000
--- a/third_party/freetype/src/cid/cidriver.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidriver.c                                                             */
-/*                                                                         */
-/*    CID driver interface (body).                                         */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "cidriver.h"
-#include "cidgload.h"
-#include FT_INTERNAL_DEBUG_H
-
-#include "ciderrs.h"
-
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_FONT_FORMAT_H
-#include FT_SERVICE_POSTSCRIPT_INFO_H
-#include FT_SERVICE_CID_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_ciddriver
-
-
-  /*
-   *  POSTSCRIPT NAME SERVICE
-   *
-   */
-
-  static const char*
-  cid_get_postscript_name( CID_Face  face )
-  {
-    const char*  result = face->cid.cid_font_name;
-
-
-    if ( result && result[0] == '/' )
-      result++;
-
-    return result;
-  }
-
-
-  static const FT_Service_PsFontNameRec  cid_service_ps_name =
-  {
-    (FT_PsName_GetFunc)cid_get_postscript_name    /* get_ps_font_name */
-  };
-
-
-  /*
-   *  POSTSCRIPT INFO SERVICE
-   *
-   */
-
-  static FT_Error
-  cid_ps_get_font_info( FT_Face          face,
-                        PS_FontInfoRec*  afont_info )
-  {
-    *afont_info = ((CID_Face)face)->cid.font_info;
-
-    return FT_Err_Ok;
-  }
-
-  static FT_Error
-  cid_ps_get_font_extra( FT_Face          face,
-                        PS_FontExtraRec*  afont_extra )
-  {
-    *afont_extra = ((CID_Face)face)->font_extra;
-
-    return FT_Err_Ok;
-  }
-
-  static const FT_Service_PsInfoRec  cid_service_ps_info =
-  {
-    (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   */
-  };
-
-
-  /*
-   *  CID INFO SERVICE
-   *
-   */
-  static FT_Error
-  cid_get_ros( CID_Face      face,
-               const char*  *registry,
-               const char*  *ordering,
-               FT_Int       *supplement )
-  {
-    CID_FaceInfo  cid = &face->cid;
-
-
-    if ( registry )
-      *registry = cid->registry;
-
-    if ( ordering )
-      *ordering = cid->ordering;
-
-    if ( supplement )
-      *supplement = cid->supplement;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  cid_get_is_cid( CID_Face  face,
-                  FT_Bool  *is_cid )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UNUSED( face );
-
-
-    if ( is_cid )
-      *is_cid = 1; /* cid driver is only used for CID keyed fonts */
-
-    return error;
-  }
-
-
-  static FT_Error
-  cid_get_cid_from_glyph_index( CID_Face  face,
-                                FT_UInt   glyph_index,
-                                FT_UInt  *cid )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UNUSED( face );
-
-
-    if ( cid )
-      *cid = glyph_index; /* identity mapping */
-
-    return error;
-  }
-
-
-  static const FT_Service_CIDRec  cid_service_cid_info =
-  {
-    (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 */
-  };
-
-
-  /*
-   *  SERVICE LIST
-   *
-   */
-
-  static const FT_ServiceDescRec  cid_services[] =
-  {
-    { FT_SERVICE_ID_FONT_FORMAT,          FT_FONT_FORMAT_CID },
-    { 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 },
-    { NULL, NULL }
-  };
-
-
-  FT_CALLBACK_DEF( FT_Module_Interface )
-  cid_get_interface( FT_Module    module,
-                     const char*  cid_interface )
-  {
-    FT_UNUSED( module );
-
-    return ft_service_list_lookup( cid_services, cid_interface );
-  }
-
-
-
-  FT_CALLBACK_TABLE_DEF
-  const FT_Driver_ClassRec  t1cid_driver_class =
-  {
-    {
-      FT_MODULE_FONT_DRIVER       |
-      FT_MODULE_DRIVER_SCALABLE   |
-      FT_MODULE_DRIVER_HAS_HINTER,
-      sizeof ( FT_DriverRec ),
-
-      "t1cid",   /* module name           */
-      0x10000L,  /* version 1.0 of driver */
-      0x20000L,  /* requires FreeType 2.0 */
-
-      NULL,    /* module-specific 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 */
-    },
-
-    sizeof ( CID_FaceRec ),
-    sizeof ( CID_SizeRec ),
-    sizeof ( CID_GlyphSlotRec ),
-
-    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_slot_load_glyph,        /* FT_Slot_LoadFunc  load_glyph */
-
-    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
-    NULL,                       /* FT_Face_AttachFunc       attach_file  */
-    NULL,                       /* FT_Face_GetAdvancesFunc  get_advances */
-
-    cid_size_request,           /* FT_Size_RequestFunc  request_size */
-    NULL                        /* FT_Size_SelectFunc   select_size  */
-  };
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidriver.h b/third_party/freetype/src/cid/cidriver.h
deleted file mode 100644
index 76640c5..0000000
--- a/third_party/freetype/src/cid/cidriver.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidriver.h                                                             */
-/*                                                                         */
-/*    High-level CID driver interface (specification).                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 CIDRIVER_H_
-#define CIDRIVER_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-
-
-FT_BEGIN_HEADER
-
-#ifdef FT_CONFIG_OPTION_PIC
-#error "this module does not support PIC yet"
-#endif
-
-
-  FT_CALLBACK_TABLE
-  const FT_Driver_ClassRec  t1cid_driver_class;
-
-
-FT_END_HEADER
-
-#endif /* CIDRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/cidtoken.h b/third_party/freetype/src/cid/cidtoken.h
deleted file mode 100644
index 653cc55..0000000
--- a/third_party/freetype/src/cid/cidtoken.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  cidtoken.h                                                             */
-/*                                                                         */
-/*    CID token definitions (specification only).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  CID_FaceInfoRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_CID_INFO
-
-  T1_FIELD_KEY   ( "CIDFontName",    cid_font_name, 0 )
-  T1_FIELD_FIXED ( "CIDFontVersion", cid_version,   0 )
-  T1_FIELD_NUM   ( "CIDFontType",    cid_font_type, 0 )
-  T1_FIELD_STRING( "Registry",       registry,      0 )
-  T1_FIELD_STRING( "Ordering",       ordering,      0 )
-  T1_FIELD_NUM   ( "Supplement",     supplement,    0 )
-  T1_FIELD_NUM   ( "UIDBase",        uid_base,      0 )
-  T1_FIELD_NUM   ( "CIDMapOffset",   cidmap_offset, 0 )
-  T1_FIELD_NUM   ( "FDBytes",        fd_bytes,      0 )
-  T1_FIELD_NUM   ( "GDBytes",        gd_bytes,      0 )
-  T1_FIELD_NUM   ( "CIDCount",       cid_count,     0 )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_FontInfoRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
-
-  T1_FIELD_STRING( "version",            version,             0 )
-  T1_FIELD_STRING( "Notice",             notice,              0 )
-  T1_FIELD_STRING( "FullName",           full_name,           0 )
-  T1_FIELD_STRING( "FamilyName",         family_name,         0 )
-  T1_FIELD_STRING( "Weight",             weight,              0 )
-  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,        0 )
-  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,      0 )
-  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,  0 )
-  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness, 0 )
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_FontExtraRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
-
-  T1_FIELD_NUM   ( "FSType",             fs_type,             0 )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  CID_FaceDictRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
-
-  T1_FIELD_NUM  ( "PaintType",          paint_type,          0 )
-  T1_FIELD_NUM  ( "FontType",           font_type,           0 )
-  T1_FIELD_NUM  ( "SubrMapOffset",      subrmap_offset,      0 )
-  T1_FIELD_NUM  ( "SDBytes",            sd_bytes,            0 )
-  T1_FIELD_NUM  ( "SubrCount",          num_subrs,           0 )
-  T1_FIELD_NUM  ( "lenBuildCharArray",  len_buildchar,       0 )
-  T1_FIELD_FIXED( "ForceBoldThreshold", forcebold_threshold, 0 )
-  T1_FIELD_FIXED( "StrokeWidth",        stroke_width,        0 )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_PrivateRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_PRIVATE
-
-  T1_FIELD_NUM       ( "UniqueID",         unique_id,      0 )
-  T1_FIELD_NUM       ( "lenIV",            lenIV,          0 )
-  T1_FIELD_NUM       ( "LanguageGroup",    language_group, 0 )
-  T1_FIELD_NUM       ( "password",         password,       0 )
-
-  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,     0 )
-  T1_FIELD_NUM       ( "BlueShift",        blue_shift,     0 )
-  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,      0 )
-
-  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14, 0 )
-  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10, 0 )
-  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14, 0 )
-  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10, 0 )
-
-  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1, 0 )
-  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1, 0 )
-  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2, 0 )
-
-  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12, 0 )
-  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12, 0 )
-
-  T1_FIELD_BOOL      ( "ForceBold",        force_bold,          0 )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  FT_BBox
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_BBOX
-
-  T1_FIELD_BBOX( "FontBBox", xMin, 0 )
-
-
-/* END */
diff --git a/third_party/freetype/src/cid/type1cid.c b/third_party/freetype/src/cid/type1cid.c
deleted file mode 100644
index aeb9c3e..0000000
--- a/third_party/freetype/src/cid/type1cid.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  type1cid.c                                                             */
-/*                                                                         */
-/*    FreeType OpenType driver component (body only).                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "cidparse.c"
-#include "cidload.c"
-#include "cidobjs.c"
-#include "cidriver.c"
-#include "cidgload.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/afmparse.c b/third_party/freetype/src/psaux/afmparse.c
deleted file mode 100644
index dbe7ddd..0000000
--- a/third_party/freetype/src/psaux/afmparse.c
+++ /dev/null
@@ -1,977 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  afmparse.c                                                             */
-/*                                                                         */
-/*    AFM parser (body).                                                   */
-/*                                                                         */
-/*  Copyright 2006-2017 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_POSTSCRIPT_AUX_H
-
-#include "afmparse.h"
-#include "psconv.h"
-
-#include "psauxerr.h"
-
-
-/***************************************************************************/
-/*                                                                         */
-/*    AFM_Stream                                                           */
-/*                                                                         */
-/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib.  */
-/*                                                                         */
-/*                                                                         */
-
-  enum
-  {
-    AFM_STREAM_STATUS_NORMAL,
-    AFM_STREAM_STATUS_EOC,
-    AFM_STREAM_STATUS_EOL,
-    AFM_STREAM_STATUS_EOF
-  };
-
-
-  typedef struct  AFM_StreamRec_
-  {
-    FT_Byte*  cursor;
-    FT_Byte*  base;
-    FT_Byte*  limit;
-
-    FT_Int    status;
-
-  } AFM_StreamRec;
-
-
-#ifndef EOF
-#define EOF -1
-#endif
-
-
-  /* this works because empty lines are ignored */
-#define AFM_IS_NEWLINE( ch )  ( (ch) == '\r' || (ch) == '\n' )
-
-#define AFM_IS_EOF( ch )      ( (ch) == EOF  || (ch) == '\x1a' )
-#define AFM_IS_SPACE( ch )    ( (ch) == ' '  || (ch) == '\t' )
-
-  /* column separator; there is no `column' in the spec actually */
-#define AFM_IS_SEP( ch )      ( (ch) == ';' )
-
-#define AFM_GETC()                                                       \
-          ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \
-                                                   : EOF )
-
-#define AFM_STREAM_KEY_BEGIN( stream )    \
-          (char*)( (stream)->cursor - 1 )
-
-#define AFM_STREAM_KEY_LEN( stream, key )           \
-          (FT_Offset)( (char*)(stream)->cursor - key - 1 )
-
-#define AFM_STATUS_EOC( stream ) \
-          ( (stream)->status >= AFM_STREAM_STATUS_EOC )
-
-#define AFM_STATUS_EOL( stream ) \
-          ( (stream)->status >= AFM_STREAM_STATUS_EOL )
-
-#define AFM_STATUS_EOF( stream ) \
-          ( (stream)->status >= AFM_STREAM_STATUS_EOF )
-
-
-  static int
-  afm_stream_skip_spaces( AFM_Stream  stream )
-  {
-    int  ch = 0;  /* make stupid compiler happy */
-
-
-    if ( AFM_STATUS_EOC( stream ) )
-      return ';';
-
-    while ( 1 )
-    {
-      ch = AFM_GETC();
-      if ( !AFM_IS_SPACE( ch ) )
-        break;
-    }
-
-    if ( AFM_IS_NEWLINE( ch ) )
-      stream->status = AFM_STREAM_STATUS_EOL;
-    else if ( AFM_IS_SEP( ch ) )
-      stream->status = AFM_STREAM_STATUS_EOC;
-    else if ( AFM_IS_EOF( ch ) )
-      stream->status = AFM_STREAM_STATUS_EOF;
-
-    return ch;
-  }
-
-
-  /* read a key or value in current column */
-  static char*
-  afm_stream_read_one( AFM_Stream  stream )
-  {
-    char*  str;
-
-
-    afm_stream_skip_spaces( stream );
-    if ( AFM_STATUS_EOC( stream ) )
-      return NULL;
-
-    str = AFM_STREAM_KEY_BEGIN( stream );
-
-    while ( 1 )
-    {
-      int  ch = AFM_GETC();
-
-
-      if ( AFM_IS_SPACE( ch ) )
-        break;
-      else if ( AFM_IS_NEWLINE( ch ) )
-      {
-        stream->status = AFM_STREAM_STATUS_EOL;
-        break;
-      }
-      else if ( AFM_IS_SEP( ch ) )
-      {
-        stream->status = AFM_STREAM_STATUS_EOC;
-        break;
-      }
-      else if ( AFM_IS_EOF( ch ) )
-      {
-        stream->status = AFM_STREAM_STATUS_EOF;
-        break;
-      }
-    }
-
-    return str;
-  }
-
-
-  /* read a string (i.e., read to EOL) */
-  static char*
-  afm_stream_read_string( AFM_Stream  stream )
-  {
-    char*  str;
-
-
-    afm_stream_skip_spaces( stream );
-    if ( AFM_STATUS_EOL( stream ) )
-      return NULL;
-
-    str = AFM_STREAM_KEY_BEGIN( stream );
-
-    /* scan to eol */
-    while ( 1 )
-    {
-      int  ch = AFM_GETC();
-
-
-      if ( AFM_IS_NEWLINE( ch ) )
-      {
-        stream->status = AFM_STREAM_STATUS_EOL;
-        break;
-      }
-      else if ( AFM_IS_EOF( ch ) )
-      {
-        stream->status = AFM_STREAM_STATUS_EOF;
-        break;
-      }
-    }
-
-    return str;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*    AFM_Parser                                                         */
-  /*                                                                       */
-  /*                                                                       */
-
-  /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */
-  typedef enum  AFM_Token_
-  {
-    AFM_TOKEN_ASCENDER,
-    AFM_TOKEN_AXISLABEL,
-    AFM_TOKEN_AXISTYPE,
-    AFM_TOKEN_B,
-    AFM_TOKEN_BLENDAXISTYPES,
-    AFM_TOKEN_BLENDDESIGNMAP,
-    AFM_TOKEN_BLENDDESIGNPOSITIONS,
-    AFM_TOKEN_C,
-    AFM_TOKEN_CC,
-    AFM_TOKEN_CH,
-    AFM_TOKEN_CAPHEIGHT,
-    AFM_TOKEN_CHARWIDTH,
-    AFM_TOKEN_CHARACTERSET,
-    AFM_TOKEN_CHARACTERS,
-    AFM_TOKEN_DESCENDER,
-    AFM_TOKEN_ENCODINGSCHEME,
-    AFM_TOKEN_ENDAXIS,
-    AFM_TOKEN_ENDCHARMETRICS,
-    AFM_TOKEN_ENDCOMPOSITES,
-    AFM_TOKEN_ENDDIRECTION,
-    AFM_TOKEN_ENDFONTMETRICS,
-    AFM_TOKEN_ENDKERNDATA,
-    AFM_TOKEN_ENDKERNPAIRS,
-    AFM_TOKEN_ENDTRACKKERN,
-    AFM_TOKEN_ESCCHAR,
-    AFM_TOKEN_FAMILYNAME,
-    AFM_TOKEN_FONTBBOX,
-    AFM_TOKEN_FONTNAME,
-    AFM_TOKEN_FULLNAME,
-    AFM_TOKEN_ISBASEFONT,
-    AFM_TOKEN_ISCIDFONT,
-    AFM_TOKEN_ISFIXEDPITCH,
-    AFM_TOKEN_ISFIXEDV,
-    AFM_TOKEN_ITALICANGLE,
-    AFM_TOKEN_KP,
-    AFM_TOKEN_KPH,
-    AFM_TOKEN_KPX,
-    AFM_TOKEN_KPY,
-    AFM_TOKEN_L,
-    AFM_TOKEN_MAPPINGSCHEME,
-    AFM_TOKEN_METRICSSETS,
-    AFM_TOKEN_N,
-    AFM_TOKEN_NOTICE,
-    AFM_TOKEN_PCC,
-    AFM_TOKEN_STARTAXIS,
-    AFM_TOKEN_STARTCHARMETRICS,
-    AFM_TOKEN_STARTCOMPOSITES,
-    AFM_TOKEN_STARTDIRECTION,
-    AFM_TOKEN_STARTFONTMETRICS,
-    AFM_TOKEN_STARTKERNDATA,
-    AFM_TOKEN_STARTKERNPAIRS,
-    AFM_TOKEN_STARTKERNPAIRS0,
-    AFM_TOKEN_STARTKERNPAIRS1,
-    AFM_TOKEN_STARTTRACKKERN,
-    AFM_TOKEN_STDHW,
-    AFM_TOKEN_STDVW,
-    AFM_TOKEN_TRACKKERN,
-    AFM_TOKEN_UNDERLINEPOSITION,
-    AFM_TOKEN_UNDERLINETHICKNESS,
-    AFM_TOKEN_VV,
-    AFM_TOKEN_VVECTOR,
-    AFM_TOKEN_VERSION,
-    AFM_TOKEN_W,
-    AFM_TOKEN_W0,
-    AFM_TOKEN_W0X,
-    AFM_TOKEN_W0Y,
-    AFM_TOKEN_W1,
-    AFM_TOKEN_W1X,
-    AFM_TOKEN_W1Y,
-    AFM_TOKEN_WX,
-    AFM_TOKEN_WY,
-    AFM_TOKEN_WEIGHT,
-    AFM_TOKEN_WEIGHTVECTOR,
-    AFM_TOKEN_XHEIGHT,
-    N_AFM_TOKENS,
-    AFM_TOKEN_UNKNOWN
-
-  } AFM_Token;
-
-
-  static const char*  const afm_key_table[N_AFM_TOKENS] =
-  {
-    "Ascender",
-    "AxisLabel",
-    "AxisType",
-    "B",
-    "BlendAxisTypes",
-    "BlendDesignMap",
-    "BlendDesignPositions",
-    "C",
-    "CC",
-    "CH",
-    "CapHeight",
-    "CharWidth",
-    "CharacterSet",
-    "Characters",
-    "Descender",
-    "EncodingScheme",
-    "EndAxis",
-    "EndCharMetrics",
-    "EndComposites",
-    "EndDirection",
-    "EndFontMetrics",
-    "EndKernData",
-    "EndKernPairs",
-    "EndTrackKern",
-    "EscChar",
-    "FamilyName",
-    "FontBBox",
-    "FontName",
-    "FullName",
-    "IsBaseFont",
-    "IsCIDFont",
-    "IsFixedPitch",
-    "IsFixedV",
-    "ItalicAngle",
-    "KP",
-    "KPH",
-    "KPX",
-    "KPY",
-    "L",
-    "MappingScheme",
-    "MetricsSets",
-    "N",
-    "Notice",
-    "PCC",
-    "StartAxis",
-    "StartCharMetrics",
-    "StartComposites",
-    "StartDirection",
-    "StartFontMetrics",
-    "StartKernData",
-    "StartKernPairs",
-    "StartKernPairs0",
-    "StartKernPairs1",
-    "StartTrackKern",
-    "StdHW",
-    "StdVW",
-    "TrackKern",
-    "UnderlinePosition",
-    "UnderlineThickness",
-    "VV",
-    "VVector",
-    "Version",
-    "W",
-    "W0",
-    "W0X",
-    "W0Y",
-    "W1",
-    "W1X",
-    "W1Y",
-    "WX",
-    "WY",
-    "Weight",
-    "WeightVector",
-    "XHeight"
-  };
-
-
-  /*
-   * `afm_parser_read_vals' and `afm_parser_next_key' provide
-   * high-level operations to an AFM_Stream.  The rest of the
-   * parser functions should use them without accessing the
-   * AFM_Stream directly.
-   */
-
-  FT_LOCAL_DEF( FT_Int )
-  afm_parser_read_vals( AFM_Parser  parser,
-                        AFM_Value   vals,
-                        FT_Int      n )
-  {
-    AFM_Stream  stream = parser->stream;
-    char*       str;
-    FT_Int      i;
-
-
-    if ( n > AFM_MAX_ARGUMENTS )
-      return 0;
-
-    for ( i = 0; i < n; i++ )
-    {
-      FT_Offset  len;
-      AFM_Value  val = vals + i;
-
-
-      if ( val->type == AFM_VALUE_TYPE_STRING )
-        str = afm_stream_read_string( stream );
-      else
-        str = afm_stream_read_one( stream );
-
-      if ( !str )
-        break;
-
-      len = AFM_STREAM_KEY_LEN( stream, str );
-
-      switch ( val->type )
-      {
-      case AFM_VALUE_TYPE_STRING:
-      case AFM_VALUE_TYPE_NAME:
-        {
-          FT_Memory  memory = parser->memory;
-          FT_Error   error;
-
-
-          if ( !FT_QALLOC( val->u.s, len + 1 ) )
-          {
-            ft_memcpy( val->u.s, str, len );
-            val->u.s[len] = '\0';
-          }
-        }
-        break;
-
-      case AFM_VALUE_TYPE_FIXED:
-        val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str,
-                                    (FT_Byte*)str + len, 0 );
-        break;
-
-      case AFM_VALUE_TYPE_INTEGER:
-        val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str,
-                                  (FT_Byte*)str + len );
-        break;
-
-      case AFM_VALUE_TYPE_BOOL:
-        val->u.b = FT_BOOL( len == 4                      &&
-                            !ft_strncmp( str, "true", 4 ) );
-        break;
-
-      case AFM_VALUE_TYPE_INDEX:
-        if ( parser->get_index )
-          val->u.i = parser->get_index( str, len, parser->user_data );
-        else
-          val->u.i = 0;
-        break;
-      }
-    }
-
-    return i;
-  }
-
-
-  FT_LOCAL_DEF( char* )
-  afm_parser_next_key( AFM_Parser  parser,
-                       FT_Bool     line,
-                       FT_Offset*  len )
-  {
-    AFM_Stream  stream = parser->stream;
-    char*       key    = NULL;  /* make stupid compiler happy */
-
-
-    if ( line )
-    {
-      while ( 1 )
-      {
-        /* skip current line */
-        if ( !AFM_STATUS_EOL( stream ) )
-          afm_stream_read_string( stream );
-
-        stream->status = AFM_STREAM_STATUS_NORMAL;
-        key = afm_stream_read_one( stream );
-
-        /* skip empty line */
-        if ( !key                      &&
-             !AFM_STATUS_EOF( stream ) &&
-             AFM_STATUS_EOL( stream )  )
-          continue;
-
-        break;
-      }
-    }
-    else
-    {
-      while ( 1 )
-      {
-        /* skip current column */
-        while ( !AFM_STATUS_EOC( stream ) )
-          afm_stream_read_one( stream );
-
-        stream->status = AFM_STREAM_STATUS_NORMAL;
-        key = afm_stream_read_one( stream );
-
-        /* skip empty column */
-        if ( !key                      &&
-             !AFM_STATUS_EOF( stream ) &&
-             AFM_STATUS_EOC( stream )  )
-          continue;
-
-        break;
-      }
-    }
-
-    if ( len )
-      *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key )
-                     : 0;
-
-    return key;
-  }
-
-
-  static AFM_Token
-  afm_tokenize( const char*  key,
-                FT_Offset    len )
-  {
-    int  n;
-
-
-    for ( n = 0; n < N_AFM_TOKENS; n++ )
-    {
-      if ( *( afm_key_table[n] ) == *key )
-      {
-        for ( ; n < N_AFM_TOKENS; n++ )
-        {
-          if ( *( afm_key_table[n] ) != *key )
-            return AFM_TOKEN_UNKNOWN;
-
-          if ( ft_strncmp( afm_key_table[n], key, len ) == 0 )
-            return (AFM_Token) n;
-        }
-      }
-    }
-
-    return AFM_TOKEN_UNKNOWN;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  afm_parser_init( AFM_Parser  parser,
-                   FT_Memory   memory,
-                   FT_Byte*    base,
-                   FT_Byte*    limit )
-  {
-    AFM_Stream  stream = NULL;
-    FT_Error    error;
-
-
-    if ( FT_NEW( stream ) )
-      return error;
-
-    stream->cursor = stream->base = base;
-    stream->limit  = limit;
-
-    /* don't skip the first line during the first call */
-    stream->status = AFM_STREAM_STATUS_EOL;
-
-    parser->memory    = memory;
-    parser->stream    = stream;
-    parser->FontInfo  = NULL;
-    parser->get_index = NULL;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL( void )
-  afm_parser_done( AFM_Parser  parser )
-  {
-    FT_Memory  memory = parser->memory;
-
-
-    FT_FREE( parser->stream );
-  }
-
-
-  static FT_Error
-  afm_parser_read_int( AFM_Parser  parser,
-                       FT_Int*     aint )
-  {
-    AFM_ValueRec  val;
-
-
-    val.type = AFM_VALUE_TYPE_INTEGER;
-
-    if ( afm_parser_read_vals( parser, &val, 1 ) == 1 )
-    {
-      *aint = val.u.i;
-
-      return FT_Err_Ok;
-    }
-    else
-      return FT_THROW( Syntax_Error );
-  }
-
-
-  static FT_Error
-  afm_parse_track_kern( AFM_Parser  parser )
-  {
-    AFM_FontInfo   fi = parser->FontInfo;
-    AFM_TrackKern  tk;
-    char*          key;
-    FT_Offset      len;
-    int            n = -1;
-    FT_Int         tmp;
-
-
-    if ( afm_parser_read_int( parser, &tmp ) )
-        goto Fail;
-
-    if ( tmp < 0 )
-      goto Fail;
-
-    fi->NumTrackKern = (FT_UInt)tmp;
-
-    if ( fi->NumTrackKern )
-    {
-      FT_Memory  memory = parser->memory;
-      FT_Error   error;
-
-
-      if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) )
-        return error;
-    }
-
-    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
-    {
-      AFM_ValueRec  shared_vals[5];
-
-
-      switch ( afm_tokenize( key, len ) )
-      {
-      case AFM_TOKEN_TRACKKERN:
-        n++;
-
-        if ( n >= (int)fi->NumTrackKern )
-          goto Fail;
-
-        tk = fi->TrackKerns + n;
-
-        shared_vals[0].type = AFM_VALUE_TYPE_INTEGER;
-        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[4].type = AFM_VALUE_TYPE_FIXED;
-        if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 )
-          goto Fail;
-
-        tk->degree     = shared_vals[0].u.i;
-        tk->min_ptsize = shared_vals[1].u.f;
-        tk->min_kern   = shared_vals[2].u.f;
-        tk->max_ptsize = shared_vals[3].u.f;
-        tk->max_kern   = shared_vals[4].u.f;
-
-        break;
-
-      case AFM_TOKEN_ENDTRACKKERN:
-      case AFM_TOKEN_ENDKERNDATA:
-      case AFM_TOKEN_ENDFONTMETRICS:
-        fi->NumTrackKern = (FT_UInt)( n + 1 );
-        return FT_Err_Ok;
-
-      case AFM_TOKEN_UNKNOWN:
-        break;
-
-      default:
-        goto Fail;
-      }
-    }
-
-  Fail:
-    return FT_THROW( Syntax_Error );
-  }
-
-
-#undef  KERN_INDEX
-#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)g1 << 16 ) | g2 )
-
-
-  /* compare two kerning pairs */
-  FT_CALLBACK_DEF( int )
-  afm_compare_kern_pairs( const void*  a,
-                          const void*  b )
-  {
-    AFM_KernPair  kp1 = (AFM_KernPair)a;
-    AFM_KernPair  kp2 = (AFM_KernPair)b;
-
-    FT_ULong  index1 = KERN_INDEX( kp1->index1, kp1->index2 );
-    FT_ULong  index2 = KERN_INDEX( kp2->index1, kp2->index2 );
-
-
-    if ( index1 > index2 )
-      return 1;
-    else if ( index1 < index2 )
-      return -1;
-    else
-      return 0;
-  }
-
-
-  static FT_Error
-  afm_parse_kern_pairs( AFM_Parser  parser )
-  {
-    AFM_FontInfo  fi = parser->FontInfo;
-    AFM_KernPair  kp;
-    char*         key;
-    FT_Offset     len;
-    int           n = -1;
-    FT_Int        tmp;
-
-
-    if ( afm_parser_read_int( parser, &tmp ) )
-      goto Fail;
-
-    if ( tmp < 0 )
-      goto Fail;
-
-    fi->NumKernPair = (FT_UInt)tmp;
-
-    if ( fi->NumKernPair )
-    {
-      FT_Memory  memory = parser->memory;
-      FT_Error   error;
-
-
-      if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
-        return error;
-    }
-
-    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
-    {
-      AFM_Token  token = afm_tokenize( key, len );
-
-
-      switch ( token )
-      {
-      case AFM_TOKEN_KP:
-      case AFM_TOKEN_KPX:
-      case AFM_TOKEN_KPY:
-        {
-          FT_Int        r;
-          AFM_ValueRec  shared_vals[4];
-
-
-          n++;
-
-          if ( n >= (int)fi->NumKernPair )
-            goto Fail;
-
-          kp = fi->KernPairs + n;
-
-          shared_vals[0].type = AFM_VALUE_TYPE_INDEX;
-          shared_vals[1].type = AFM_VALUE_TYPE_INDEX;
-          shared_vals[2].type = AFM_VALUE_TYPE_INTEGER;
-          shared_vals[3].type = AFM_VALUE_TYPE_INTEGER;
-          r = afm_parser_read_vals( parser, shared_vals, 4 );
-          if ( r < 3 )
-            goto Fail;
-
-          /* index values can't be negative */
-          kp->index1 = shared_vals[0].u.u;
-          kp->index2 = shared_vals[1].u.u;
-          if ( token == AFM_TOKEN_KPY )
-          {
-            kp->x = 0;
-            kp->y = shared_vals[2].u.i;
-          }
-          else
-          {
-            kp->x = shared_vals[2].u.i;
-            kp->y = ( token == AFM_TOKEN_KP && r == 4 )
-                      ? shared_vals[3].u.i : 0;
-          }
-        }
-        break;
-
-      case AFM_TOKEN_ENDKERNPAIRS:
-      case AFM_TOKEN_ENDKERNDATA:
-      case AFM_TOKEN_ENDFONTMETRICS:
-        fi->NumKernPair = (FT_UInt)( n + 1 );
-        ft_qsort( fi->KernPairs, fi->NumKernPair,
-                  sizeof ( AFM_KernPairRec ),
-                  afm_compare_kern_pairs );
-        return FT_Err_Ok;
-
-      case AFM_TOKEN_UNKNOWN:
-        break;
-
-      default:
-        goto Fail;
-      }
-    }
-
-  Fail:
-    return FT_THROW( Syntax_Error );
-  }
-
-
-  static FT_Error
-  afm_parse_kern_data( AFM_Parser  parser )
-  {
-    FT_Error   error;
-    char*      key;
-    FT_Offset  len;
-
-
-    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
-    {
-      switch ( afm_tokenize( key, len ) )
-      {
-      case AFM_TOKEN_STARTTRACKKERN:
-        error = afm_parse_track_kern( parser );
-        if ( error )
-          return error;
-        break;
-
-      case AFM_TOKEN_STARTKERNPAIRS:
-      case AFM_TOKEN_STARTKERNPAIRS0:
-        error = afm_parse_kern_pairs( parser );
-        if ( error )
-          return error;
-        break;
-
-      case AFM_TOKEN_ENDKERNDATA:
-      case AFM_TOKEN_ENDFONTMETRICS:
-        return FT_Err_Ok;
-
-      case AFM_TOKEN_UNKNOWN:
-        break;
-
-      default:
-        goto Fail;
-      }
-    }
-
-  Fail:
-    return FT_THROW( Syntax_Error );
-  }
-
-
-  static FT_Error
-  afm_parser_skip_section( AFM_Parser  parser,
-                           FT_Int      n,
-                           AFM_Token   end_section )
-  {
-    char*      key;
-    FT_Offset  len;
-
-
-    while ( n-- > 0 )
-    {
-      key = afm_parser_next_key( parser, 1, NULL );
-      if ( !key )
-        goto Fail;
-    }
-
-    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
-    {
-      AFM_Token  token = afm_tokenize( key, len );
-
-
-      if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS )
-        return FT_Err_Ok;
-    }
-
-  Fail:
-    return FT_THROW( Syntax_Error );
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  afm_parser_parse( AFM_Parser  parser )
-  {
-    FT_Memory     memory = parser->memory;
-    AFM_FontInfo  fi     = parser->FontInfo;
-    FT_Error      error  = FT_ERR( Syntax_Error );
-    char*         key;
-    FT_Offset     len;
-    FT_Int        metrics_sets = 0;
-
-
-    if ( !fi )
-      return FT_THROW( Invalid_Argument );
-
-    key = afm_parser_next_key( parser, 1, &len );
-    if ( !key || len != 16                              ||
-         ft_strncmp( key, "StartFontMetrics", 16 ) != 0 )
-      return FT_THROW( Unknown_File_Format );
-
-    while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 )
-    {
-      AFM_ValueRec  shared_vals[4];
-
-
-      switch ( afm_tokenize( key, len ) )
-      {
-      case AFM_TOKEN_METRICSSETS:
-        if ( afm_parser_read_int( parser, &metrics_sets ) )
-          goto Fail;
-
-        if ( metrics_sets != 0 && metrics_sets != 2 )
-        {
-          error = FT_THROW( Unimplemented_Feature );
-
-          goto Fail;
-        }
-        break;
-
-      case AFM_TOKEN_ISCIDFONT:
-        shared_vals[0].type = AFM_VALUE_TYPE_BOOL;
-        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
-          goto Fail;
-
-        fi->IsCIDFont = shared_vals[0].u.b;
-        break;
-
-      case AFM_TOKEN_FONTBBOX:
-        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[1].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[2].type = AFM_VALUE_TYPE_FIXED;
-        shared_vals[3].type = AFM_VALUE_TYPE_FIXED;
-        if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 )
-          goto Fail;
-
-        fi->FontBBox.xMin = shared_vals[0].u.f;
-        fi->FontBBox.yMin = shared_vals[1].u.f;
-        fi->FontBBox.xMax = shared_vals[2].u.f;
-        fi->FontBBox.yMax = shared_vals[3].u.f;
-        break;
-
-      case AFM_TOKEN_ASCENDER:
-        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
-        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
-          goto Fail;
-
-        fi->Ascender = shared_vals[0].u.f;
-        break;
-
-      case AFM_TOKEN_DESCENDER:
-        shared_vals[0].type = AFM_VALUE_TYPE_FIXED;
-        if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 )
-          goto Fail;
-
-        fi->Descender = shared_vals[0].u.f;
-        break;
-
-      case AFM_TOKEN_STARTCHARMETRICS:
-        {
-          FT_Int  n = 0;
-
-
-          if ( afm_parser_read_int( parser, &n ) )
-            goto Fail;
-
-          error = afm_parser_skip_section( parser, n,
-                                           AFM_TOKEN_ENDCHARMETRICS );
-          if ( error )
-            return error;
-        }
-        break;
-
-      case AFM_TOKEN_STARTKERNDATA:
-        error = afm_parse_kern_data( parser );
-        if ( error )
-          goto Fail;
-        /* fall through since we only support kern data */
-
-      case AFM_TOKEN_ENDFONTMETRICS:
-        return FT_Err_Ok;
-
-      default:
-        break;
-      }
-    }
-
-  Fail:
-    FT_FREE( fi->TrackKerns );
-    fi->NumTrackKern = 0;
-
-    FT_FREE( fi->KernPairs );
-    fi->NumKernPair = 0;
-
-    fi->IsCIDFont = 0;
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/afmparse.h b/third_party/freetype/src/psaux/afmparse.h
deleted file mode 100644
index cd2beb7..0000000
--- a/third_party/freetype/src/psaux/afmparse.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  afmparse.h                                                             */
-/*                                                                         */
-/*    AFM parser (specification).                                          */
-/*                                                                         */
-/*  Copyright 2006-2017 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 AFMPARSE_H_
-#define AFMPARSE_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  afm_parser_init( AFM_Parser  parser,
-                   FT_Memory   memory,
-                   FT_Byte*    base,
-                   FT_Byte*    limit );
-
-
-  FT_LOCAL( void )
-  afm_parser_done( AFM_Parser  parser );
-
-
-  FT_LOCAL( FT_Error )
-  afm_parser_parse( AFM_Parser  parser );
-
-
-  enum  AFM_ValueType_
-  {
-    AFM_VALUE_TYPE_STRING,
-    AFM_VALUE_TYPE_NAME,
-    AFM_VALUE_TYPE_FIXED,   /* real number */
-    AFM_VALUE_TYPE_INTEGER,
-    AFM_VALUE_TYPE_BOOL,
-    AFM_VALUE_TYPE_INDEX    /* glyph index */
-  };
-
-
-  typedef struct  AFM_ValueRec_
-  {
-    enum AFM_ValueType_  type;
-    union
-    {
-      char*     s;
-      FT_Fixed  f;
-      FT_Int    i;
-      FT_UInt   u;
-      FT_Bool   b;
-
-    } u;
-
-  } AFM_ValueRec, *AFM_Value;
-
-#define  AFM_MAX_ARGUMENTS  5
-
-  FT_LOCAL( FT_Int )
-  afm_parser_read_vals( AFM_Parser  parser,
-                        AFM_Value   vals,
-                        FT_Int      n );
-
-  /* read the next key from the next line or column */
-  FT_LOCAL( char* )
-  afm_parser_next_key( AFM_Parser  parser,
-                       FT_Bool     line,
-                       FT_Offset*  len );
-
-FT_END_HEADER
-
-#endif /* AFMPARSE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psaux.c b/third_party/freetype/src/psaux/psaux.c
deleted file mode 100644
index f8f19d0..0000000
--- a/third_party/freetype/src/psaux/psaux.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psaux.c                                                                */
-/*                                                                         */
-/*    FreeType auxiliary PostScript driver component (body only).          */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#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 "psconv.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psauxerr.h b/third_party/freetype/src/psaux/psauxerr.h
deleted file mode 100644
index 1d7ac60..0000000
--- a/third_party/freetype/src/psaux/psauxerr.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psauxerr.h                                                             */
-/*                                                                         */
-/*    PS auxiliary module error codes (specification only).                */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the PS auxiliary module error enumeration */
-  /* constants.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef PSAUXERR_H_
-#define PSAUXERR_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  PSaux_Err_
-#define FT_ERR_BASE    FT_Mod_Err_PSaux
-
-#include FT_ERRORS_H
-
-#endif /* PSAUXERR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psauxmod.c b/third_party/freetype/src/psaux/psauxmod.c
deleted file mode 100644
index 1f589ce..0000000
--- a/third_party/freetype/src/psaux/psauxmod.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psauxmod.c                                                             */
-/*                                                                         */
-/*    FreeType auxiliary PostScript module implementation (body).          */
-/*                                                                         */
-/*  Copyright 2000-2017 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 "psauxmod.h"
-#include "psobjs.h"
-#include "t1decode.h"
-#include "t1cmap.h"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "afmparse.h"
-#endif
-
-
-  FT_CALLBACK_TABLE_DEF
-  const PS_Table_FuncsRec  ps_table_funcs =
-  {
-    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,             /* 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 T1_Builder_FuncsRec  t1_builder_funcs =
-  {
-    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,              /* init              */
-    t1_decoder_done,              /* done              */
-    t1_decoder_parse_charstrings  /* parse_charstrings */
-  };
-
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-  FT_CALLBACK_TABLE_DEF
-  const AFM_Parser_FuncsRec  afm_parser_funcs =
-  {
-    afm_parser_init,  /* init  */
-    afm_parser_done,  /* done  */
-    afm_parser_parse  /* parse */
-  };
-#endif
-
-
-  FT_CALLBACK_TABLE_DEF
-  const T1_CMap_ClassesRec  t1_cmap_classes =
-  {
-    &t1_cmap_standard_class_rec,
-    &t1_cmap_expert_class_rec,
-    &t1_cmap_custom_class_rec,
-    &t1_cmap_unicode_class_rec
-  };
-
-
-  static
-  const PSAux_Interface  psaux_interface =
-  {
-    &ps_table_funcs,
-    &ps_parser_funcs,
-    &t1_builder_funcs,
-    &t1_decoder_funcs,
-    t1_decrypt,
-
-    (const T1_CMap_ClassesRec*) &t1_cmap_classes,
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-    &afm_parser_funcs,
-#else
-    0,
-#endif
-  };
-
-
-  FT_CALLBACK_TABLE_DEF
-  const FT_Module_Class  psaux_module_class =
-  {
-    0,
-    sizeof ( FT_ModuleRec ),
-    "psaux",
-    0x20000L,
-    0x20000L,
-
-    &psaux_interface,  /* module-specific interface */
-
-    (FT_Module_Constructor)NULL,  /* module_init   */
-    (FT_Module_Destructor) NULL,  /* module_done   */
-    (FT_Module_Requester)  NULL   /* get_interface */
-  };
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psauxmod.h b/third_party/freetype/src/psaux/psauxmod.h
deleted file mode 100644
index 926f37e..0000000
--- a/third_party/freetype/src/psaux/psauxmod.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psauxmod.h                                                             */
-/*                                                                         */
-/*    FreeType auxiliary PostScript module implementation (specification). */
-/*                                                                         */
-/*  Copyright 2000-2017 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 PSAUXMOD_H_
-#define PSAUXMOD_H_
-
-
-#include <ft2build.h>
-#include FT_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-#ifdef FT_CONFIG_OPTION_PIC
-#error "this module does not support PIC yet"
-#endif
-
-
-  FT_EXPORT_VAR( const FT_Module_Class )  psaux_driver_class;
-
-
-FT_END_HEADER
-
-#endif /* PSAUXMOD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psconv.c b/third_party/freetype/src/psaux/psconv.c
deleted file mode 100644
index b092482..0000000
--- a/third_party/freetype/src/psaux/psconv.c
+++ /dev/null
@@ -1,603 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psconv.c                                                               */
-/*                                                                         */
-/*    Some convenience conversions (body).                                 */
-/*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include FT_INTERNAL_DEBUG_H
-
-#include "psconv.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_psconv
-
-
-  /* The following array is used by various functions to quickly convert */
-  /* digits (both decimal and non-decimal) into numbers.                 */
-
-#if 'A' == 65
-  /* ASCII */
-
-  static const FT_Char  ft_char_table[128] =
-  {
-    /* 0x00 */
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
-    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-    25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-  };
-
-  /* no character >= 0x80 can represent a valid number */
-#define OP  >=
-
-#endif /* 'A' == 65 */
-
-#if 'A' == 193
-  /* EBCDIC */
-
-  static const FT_Char  ft_char_table[128] =
-  {
-    /* 0x80 */
-    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
-    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
-    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-    -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1,
-    -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1,
-    -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1,
-     0,  1,  2,  3,  4,  5,  6,  7,  8,  9, -1, -1, -1, -1, -1, -1,
-  };
-
-  /* no character < 0x80 can represent a valid number */
-#define OP  <
-
-#endif /* 'A' == 193 */
-
-
-  FT_LOCAL_DEF( FT_Long )
-  PS_Conv_Strtol( FT_Byte**  cursor,
-                  FT_Byte*   limit,
-                  FT_Long    base )
-  {
-    FT_Byte*  p = *cursor;
-
-    FT_Long   num           = 0;
-    FT_Bool   sign          = 0;
-    FT_Bool   have_overflow = 0;
-
-    FT_Long   num_limit;
-    FT_Char   c_limit;
-
-
-    if ( p >= limit )
-      goto Bad;
-
-    if ( base < 2 || base > 36 )
-    {
-      FT_TRACE4(( "!!!INVALID BASE:!!!" ));
-      return 0;
-    }
-
-    if ( *p == '-' || *p == '+' )
-    {
-      sign = FT_BOOL( *p == '-' );
-
-      p++;
-      if ( p == limit )
-        goto Bad;
-    }
-
-    num_limit = 0x7FFFFFFFL / base;
-    c_limit   = (FT_Char)( 0x7FFFFFFFL % base );
-
-    for ( ; p < limit; p++ )
-    {
-      FT_Char  c;
-
-
-      if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
-        break;
-
-      c = ft_char_table[*p & 0x7F];
-
-      if ( c < 0 || c >= base )
-        break;
-
-      if ( num > num_limit || ( num == num_limit && c > c_limit ) )
-        have_overflow = 1;
-      else
-        num = num * base + c;
-    }
-
-    *cursor = p;
-
-    if ( have_overflow )
-    {
-      num = 0x7FFFFFFFL;
-      FT_TRACE4(( "!!!OVERFLOW:!!!" ));
-    }
-
-    if ( sign )
-      num = -num;
-
-    return num;
-
-  Bad:
-    FT_TRACE4(( "!!!END OF DATA:!!!" ));
-    return 0;
-  }
-
-
-  FT_LOCAL_DEF( FT_Long )
-  PS_Conv_ToInt( FT_Byte**  cursor,
-                 FT_Byte*   limit )
-
-  {
-    FT_Byte*  p = *cursor;
-    FT_Byte*  curp;
-
-    FT_Long   num;
-
-
-    curp = p;
-    num  = PS_Conv_Strtol( &p, limit, 10 );
-
-    if ( p == curp )
-      return 0;
-
-    if ( p < limit && *p == '#' )
-    {
-      p++;
-
-      curp = p;
-      num  = PS_Conv_Strtol( &p, limit, num );
-
-      if ( p == curp )
-        return 0;
-    }
-
-    *cursor = p;
-
-    return num;
-  }
-
-
-  FT_LOCAL_DEF( FT_Fixed )
-  PS_Conv_ToFixed( FT_Byte**  cursor,
-                   FT_Byte*   limit,
-                   FT_Long    power_ten )
-  {
-    FT_Byte*  p = *cursor;
-    FT_Byte*  curp;
-
-    FT_Fixed  integral = 0;
-    FT_Long   decimal  = 0;
-    FT_Long   divider  = 1;
-
-    FT_Bool   sign           = 0;
-    FT_Bool   have_overflow  = 0;
-    FT_Bool   have_underflow = 0;
-
-
-    if ( p >= limit )
-      goto Bad;
-
-    if ( *p == '-' || *p == '+' )
-    {
-      sign = FT_BOOL( *p == '-' );
-
-      p++;
-      if ( p == limit )
-        goto Bad;
-    }
-
-    /* read the integer part */
-    if ( *p != '.' )
-    {
-      curp     = p;
-      integral = PS_Conv_ToInt( &p, limit );
-
-      if ( p == curp )
-        return 0;
-
-      if ( integral > 0x7FFF )
-        have_overflow = 1;
-      else
-        integral = (FT_Fixed)( (FT_UInt32)integral << 16 );
-    }
-
-    /* read the decimal part */
-    if ( p < limit && *p == '.' )
-    {
-      p++;
-
-      for ( ; p < limit; p++ )
-      {
-        FT_Char  c;
-
-
-        if ( IS_PS_SPACE( *p ) || *p OP 0x80 )
-          break;
-
-        c = ft_char_table[*p & 0x7F];
-
-        if ( c < 0 || c >= 10 )
-          break;
-
-        /* only add digit if we don't overflow */
-        if ( divider < 0xCCCCCCCL && decimal < 0xCCCCCCCL )
-        {
-          decimal = decimal * 10 + c;
-
-          if ( !integral && power_ten > 0 )
-            power_ten--;
-          else
-            divider *= 10;
-        }
-      }
-    }
-
-    /* read exponent, if any */
-    if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) )
-    {
-      FT_Long  exponent;
-
-
-      p++;
-
-      curp     = p;
-      exponent = PS_Conv_ToInt( &p, limit );
-
-      if ( curp == p )
-        return 0;
-
-      /* arbitrarily limit exponent */
-      if ( exponent > 1000 )
-        have_overflow = 1;
-      else if ( exponent < -1000 )
-        have_underflow = 1;
-      else
-        power_ten += exponent;
-    }
-
-    *cursor = p;
-
-    if ( !integral && !decimal )
-      return 0;
-
-    if ( have_overflow )
-      goto Overflow;
-    if ( have_underflow )
-      goto Underflow;
-
-    while ( power_ten > 0 )
-    {
-      if ( integral >= 0xCCCCCCCL )
-        goto Overflow;
-      integral *= 10;
-
-      if ( decimal >= 0xCCCCCCCL )
-      {
-        if ( divider == 1 )
-          goto Overflow;
-        divider /= 10;
-      }
-      else
-        decimal *= 10;
-
-      power_ten--;
-    }
-
-    while ( power_ten < 0 )
-    {
-      integral /= 10;
-      if ( divider < 0xCCCCCCCL )
-        divider *= 10;
-      else
-        decimal /= 10;
-
-      if ( !integral && !decimal )
-        goto Underflow;
-
-      power_ten++;
-    }
-
-    if ( decimal )
-    {
-      decimal = FT_DivFix( decimal, divider );
-      /* it's not necessary to check this addition for overflow */
-      /* due to the structure of the real number representation */
-      integral += decimal;
-    }
-
-  Exit:
-    if ( sign )
-      integral = -integral;
-
-    return integral;
-
-  Bad:
-    FT_TRACE4(( "!!!END OF DATA:!!!" ));
-    return 0;
-
-  Overflow:
-    integral = 0x7FFFFFFFL;
-    FT_TRACE4(( "!!!OVERFLOW:!!!" ));
-    goto Exit;
-
-  Underflow:
-    FT_TRACE4(( "!!!UNDERFLOW:!!!" ));
-    return 0;
-  }
-
-
-#if 0
-  FT_LOCAL_DEF( FT_UInt )
-  PS_Conv_StringDecode( FT_Byte**  cursor,
-                        FT_Byte*   limit,
-                        FT_Byte*   buffer,
-                        FT_Offset  n )
-  {
-    FT_Byte*  p;
-    FT_UInt   r = 0;
-
-
-    for ( p = *cursor; r < n && p < limit; p++ )
-    {
-      FT_Byte  b;
-
-
-      if ( *p != '\\' )
-      {
-        buffer[r++] = *p;
-
-        continue;
-      }
-
-      p++;
-
-      switch ( *p )
-      {
-      case 'n':
-        b = '\n';
-        break;
-      case 'r':
-        b = '\r';
-        break;
-      case 't':
-        b = '\t';
-        break;
-      case 'b':
-        b = '\b';
-        break;
-      case 'f':
-        b = '\f';
-        break;
-      case '\r':
-        p++;
-        if ( *p != '\n' )
-        {
-          b = *p;
-
-          break;
-        }
-        /* no break */
-      case '\n':
-        continue;
-        break;
-      default:
-        if ( IS_PS_DIGIT( *p ) )
-        {
-          b = *p - '0';
-
-          p++;
-
-          if ( IS_PS_DIGIT( *p ) )
-          {
-            b = b * 8 + *p - '0';
-
-            p++;
-
-            if ( IS_PS_DIGIT( *p ) )
-              b = b * 8 + *p - '0';
-            else
-            {
-              buffer[r++] = b;
-              b = *p;
-            }
-          }
-          else
-          {
-            buffer[r++] = b;
-            b = *p;
-          }
-        }
-        else
-          b = *p;
-        break;
-      }
-
-      buffer[r++] = b;
-    }
-
-    *cursor = p;
-
-    return r;
-  }
-#endif /* 0 */
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
-                          FT_Byte*   limit,
-                          FT_Byte*   buffer,
-                          FT_Offset  n )
-  {
-    FT_Byte*  p;
-    FT_UInt   r   = 0;
-    FT_UInt   w   = 0;
-    FT_UInt   pad = 0x01;
-
-
-    n *= 2;
-
-#if 1
-
-    p = *cursor;
-
-    if ( p >= limit )
-      return 0;
-
-    if ( n > (FT_UInt)( limit - p ) )
-      n = (FT_UInt)( limit - p );
-
-    /* we try to process two nibbles at a time to be as fast as possible */
-    for ( ; r < n; r++ )
-    {
-      FT_UInt  c = p[r];
-
-
-      if ( IS_PS_SPACE( c ) )
-        continue;
-
-      if ( c OP 0x80 )
-        break;
-
-      c = (FT_UInt)ft_char_table[c & 0x7F];
-      if ( c >= 16 )
-        break;
-
-      pad = ( pad << 4 ) | c;
-      if ( pad & 0x100 )
-      {
-        buffer[w++] = (FT_Byte)pad;
-        pad         = 0x01;
-      }
-    }
-
-    if ( pad != 0x01 )
-      buffer[w++] = (FT_Byte)( pad << 4 );
-
-    *cursor = p + r;
-
-    return w;
-
-#else /* 0 */
-
-    for ( r = 0; r < n; r++ )
-    {
-      FT_Char  c;
-
-
-      if ( IS_PS_SPACE( *p ) )
-        continue;
-
-      if ( *p OP 0x80 )
-        break;
-
-      c = ft_char_table[*p & 0x7F];
-
-      if ( (unsigned)c >= 16 )
-        break;
-
-      if ( r & 1 )
-      {
-        *buffer = (FT_Byte)(*buffer + c);
-        buffer++;
-      }
-      else
-        *buffer = (FT_Byte)(c << 4);
-
-      r++;
-    }
-
-    *cursor = p;
-
-    return ( r + 1 ) / 2;
-
-#endif /* 0 */
-
-  }
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  PS_Conv_EexecDecode( FT_Byte**   cursor,
-                       FT_Byte*    limit,
-                       FT_Byte*    buffer,
-                       FT_Offset   n,
-                       FT_UShort*  seed )
-  {
-    FT_Byte*  p;
-    FT_UInt   r;
-    FT_UInt   s = *seed;
-
-
-#if 1
-
-    p = *cursor;
-
-    if ( p >= limit )
-      return 0;
-
-    if ( n > (FT_UInt)(limit - p) )
-      n = (FT_UInt)(limit - p);
-
-    for ( r = 0; r < n; r++ )
-    {
-      FT_UInt  val = p[r];
-      FT_UInt  b   = ( val ^ ( s >> 8 ) );
-
-
-      s         = ( (val + s)*52845U + 22719 ) & 0xFFFFU;
-      buffer[r] = (FT_Byte) b;
-    }
-
-    *cursor = p + n;
-    *seed   = (FT_UShort)s;
-
-#else /* 0 */
-
-    for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ )
-    {
-      FT_Byte  b = (FT_Byte)( *p ^ ( s >> 8 ) );
-
-
-      s = (FT_UShort)( ( *p + s ) * 52845U + 22719 );
-      *buffer++ = b;
-    }
-    *cursor = p;
-    *seed   = s;
-
-#endif /* 0 */
-
-    return r;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psconv.h b/third_party/freetype/src/psaux/psconv.h
deleted file mode 100644
index cab254a..0000000
--- a/third_party/freetype/src/psaux/psconv.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psconv.h                                                               */
-/*                                                                         */
-/*    Some convenience conversions (specification).                        */
-/*                                                                         */
-/*  Copyright 2006-2017 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 PSCONV_H_
-#define PSCONV_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Long )
-  PS_Conv_Strtol( FT_Byte**  cursor,
-                  FT_Byte*   limit,
-                  FT_Long    base );
-
-
-  FT_LOCAL( FT_Long )
-  PS_Conv_ToInt( FT_Byte**  cursor,
-                 FT_Byte*   limit );
-
-  FT_LOCAL( FT_Fixed )
-  PS_Conv_ToFixed( FT_Byte**  cursor,
-                   FT_Byte*   limit,
-                   FT_Long    power_ten );
-
-#if 0
-  FT_LOCAL( FT_UInt )
-  PS_Conv_StringDecode( FT_Byte**  cursor,
-                        FT_Byte*   limit,
-                        FT_Byte*   buffer,
-                        FT_Offset  n );
-#endif
-
-  FT_LOCAL( FT_UInt )
-  PS_Conv_ASCIIHexDecode( FT_Byte**  cursor,
-                          FT_Byte*   limit,
-                          FT_Byte*   buffer,
-                          FT_Offset  n );
-
-  FT_LOCAL( FT_UInt )
-  PS_Conv_EexecDecode( FT_Byte**   cursor,
-                       FT_Byte*    limit,
-                       FT_Byte*    buffer,
-                       FT_Offset   n,
-                       FT_UShort*  seed );
-
-
-FT_END_HEADER
-
-#endif /* PSCONV_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psobjs.c b/third_party/freetype/src/psaux/psobjs.c
deleted file mode 100644
index d18e821..0000000
--- a/third_party/freetype/src/psaux/psobjs.c
+++ /dev/null
@@ -1,1774 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psobjs.c                                                               */
-/*                                                                         */
-/*    Auxiliary functions for PostScript fonts (body).                     */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_CALC_H
-
-#include "psobjs.h"
-#include "psconv.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_psobjs
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                             PS_TABLE                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ps_table_new                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a PS_Table.                                            */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    table  :: The address of the target table.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    count  :: The table size = the maximum number of elements.         */
-  /*                                                                       */
-  /*    memory :: The memory object to use for all subsequent              */
-  /*              reallocations.                                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  ps_table_new( PS_Table   table,
-                FT_Int     count,
-                FT_Memory  memory )
-  {
-    FT_Error  error;
-
-
-    table->memory = memory;
-    if ( FT_NEW_ARRAY( table->elements, count ) ||
-         FT_NEW_ARRAY( table->lengths,  count ) )
-      goto Exit;
-
-    table->max_elems = count;
-    table->init      = 0xDEADBEEFUL;
-    table->num_elems = 0;
-    table->block     = NULL;
-    table->capacity  = 0;
-    table->cursor    = 0;
-
-    *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs;
-
-  Exit:
-    if ( error )
-      FT_FREE( table->elements );
-
-    return error;
-  }
-
-
-  static void
-  shift_elements( PS_Table  table,
-                  FT_Byte*  old_base )
-  {
-    FT_PtrDist  delta  = table->block - old_base;
-    FT_Byte**   offset = table->elements;
-    FT_Byte**   limit  = offset + table->max_elems;
-
-
-    for ( ; offset < limit; offset++ )
-    {
-      if ( offset[0] )
-        offset[0] += delta;
-    }
-  }
-
-
-  static FT_Error
-  reallocate_t1_table( PS_Table   table,
-                       FT_Offset  new_size )
-  {
-    FT_Memory  memory   = table->memory;
-    FT_Byte*   old_base = table->block;
-    FT_Error   error;
-
-
-    /* allocate new base block */
-    if ( FT_ALLOC( table->block, new_size ) )
-    {
-      table->block = old_base;
-      return error;
-    }
-
-    /* copy elements and shift offsets */
-    if ( old_base )
-    {
-      FT_MEM_COPY( table->block, old_base, table->capacity );
-      shift_elements( table, old_base );
-      FT_FREE( old_base );
-    }
-
-    table->capacity = new_size;
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ps_table_add                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Adds an object to a PS_Table, possibly growing its memory block.   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    table  :: The target table.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    idx    :: The index of the object in the table.                    */
-  /*                                                                       */
-  /*    object :: The address of the object to copy in memory.             */
-  /*                                                                       */
-  /*    length :: The length in bytes of the source object.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.  An error is returned if a  */
-  /*    reallocation fails.                                                */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  ps_table_add( PS_Table  table,
-                FT_Int    idx,
-                void*     object,
-                FT_UInt   length )
-  {
-    if ( idx < 0 || idx >= table->max_elems )
-    {
-      FT_ERROR(( "ps_table_add: invalid index\n" ));
-      return FT_THROW( Invalid_Argument );
-    }
-
-    /* grow the base block if needed */
-    if ( table->cursor + length > table->capacity )
-    {
-      FT_Error    error;
-      FT_Offset   new_size = table->capacity;
-      FT_PtrDist  in_offset;
-
-
-      in_offset = (FT_Byte*)object - table->block;
-      if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity )
-        in_offset = -1;
-
-      while ( new_size < table->cursor + length )
-      {
-        /* increase size by 25% and round up to the nearest multiple
-           of 1024 */
-        new_size += ( new_size >> 2 ) + 1;
-        new_size  = FT_PAD_CEIL( new_size, 1024 );
-      }
-
-      error = reallocate_t1_table( table, new_size );
-      if ( error )
-        return error;
-
-      if ( in_offset >= 0 )
-        object = table->block + in_offset;
-    }
-
-    /* add the object to the base block and adjust offset */
-    table->elements[idx] = table->block + table->cursor;
-    table->lengths [idx] = length;
-    FT_MEM_COPY( table->block + table->cursor, object, length );
-
-    table->cursor += length;
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ps_table_done                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a PS_TableRec (i.e., reallocate it to its current        */
-  /*    cursor).                                                           */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    table :: The target table.                                         */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This function does NOT release the heap's memory block.  It is up  */
-  /*    to the caller to clean it, or reference it in its own structures.  */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  ps_table_done( PS_Table  table )
-  {
-    FT_Memory  memory = table->memory;
-    FT_Error   error;
-    FT_Byte*   old_base = table->block;
-
-
-    /* should never fail, because rec.cursor <= rec.size */
-    if ( !old_base )
-      return;
-
-    if ( FT_ALLOC( table->block, table->cursor ) )
-      return;
-    FT_MEM_COPY( table->block, old_base, table->cursor );
-    shift_elements( table, old_base );
-
-    table->capacity = table->cursor;
-    FT_FREE( old_base );
-
-    FT_UNUSED( error );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  ps_table_release( PS_Table  table )
-  {
-    FT_Memory  memory = table->memory;
-
-
-    if ( (FT_ULong)table->init == 0xDEADBEEFUL )
-    {
-      FT_FREE( table->block );
-      FT_FREE( table->elements );
-      FT_FREE( table->lengths );
-      table->init = 0;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            T1 PARSER                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* first character must be already part of the comment */
-
-  static void
-  skip_comment( FT_Byte*  *acur,
-                FT_Byte*   limit )
-  {
-    FT_Byte*  cur = *acur;
-
-
-    while ( cur < limit )
-    {
-      if ( IS_PS_NEWLINE( *cur ) )
-        break;
-      cur++;
-    }
-
-    *acur = cur;
-  }
-
-
-  static void
-  skip_spaces( FT_Byte*  *acur,
-               FT_Byte*   limit )
-  {
-    FT_Byte*  cur = *acur;
-
-
-    while ( cur < limit )
-    {
-      if ( !IS_PS_SPACE( *cur ) )
-      {
-        if ( *cur == '%' )
-          /* According to the PLRM, a comment is equal to a space. */
-          skip_comment( &cur, limit );
-        else
-          break;
-      }
-      cur++;
-    }
-
-    *acur = cur;
-  }
-
-
-#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' )
-
-
-  /* first character must be `(';                               */
-  /* *acur is positioned at the character after the closing `)' */
-
-  static FT_Error
-  skip_literal_string( FT_Byte*  *acur,
-                       FT_Byte*   limit )
-  {
-    FT_Byte*      cur   = *acur;
-    FT_Int        embed = 0;
-    FT_Error      error = FT_ERR( Invalid_File_Format );
-    unsigned int  i;
-
-
-    while ( cur < limit )
-    {
-      FT_Byte  c = *cur;
-
-
-      cur++;
-
-      if ( c == '\\' )
-      {
-        /* Red Book 3rd ed., section `Literal Text Strings', p. 29:     */
-        /* A backslash can introduce three different types              */
-        /* of escape sequences:                                         */
-        /*   - a special escaped char like \r, \n, etc.                 */
-        /*   - a one-, two-, or three-digit octal number                */
-        /*   - none of the above in which case the backslash is ignored */
-
-        if ( cur == limit )
-          /* error (or to be ignored?) */
-          break;
-
-        switch ( *cur )
-        {
-          /* skip `special' escape */
-        case 'n':
-        case 'r':
-        case 't':
-        case 'b':
-        case 'f':
-        case '\\':
-        case '(':
-        case ')':
-          cur++;
-          break;
-
-        default:
-          /* skip octal escape or ignore backslash */
-          for ( i = 0; i < 3 && cur < limit; i++ )
-          {
-            if ( !IS_OCTAL_DIGIT( *cur ) )
-              break;
-
-            cur++;
-          }
-        }
-      }
-      else if ( c == '(' )
-        embed++;
-      else if ( c == ')' )
-      {
-        embed--;
-        if ( embed == 0 )
-        {
-          error = FT_Err_Ok;
-          break;
-        }
-      }
-    }
-
-    *acur = cur;
-
-    return error;
-  }
-
-
-  /* first character must be `<' */
-
-  static FT_Error
-  skip_string( FT_Byte*  *acur,
-               FT_Byte*   limit )
-  {
-    FT_Byte*  cur = *acur;
-    FT_Error  err =  FT_Err_Ok;
-
-
-    while ( ++cur < limit )
-    {
-      /* All whitespace characters are ignored. */
-      skip_spaces( &cur, limit );
-      if ( cur >= limit )
-        break;
-
-      if ( !IS_PS_XDIGIT( *cur ) )
-        break;
-    }
-
-    if ( cur < limit && *cur != '>' )
-    {
-      FT_ERROR(( "skip_string: missing closing delimiter `>'\n" ));
-      err = FT_THROW( Invalid_File_Format );
-    }
-    else
-      cur++;
-
-    *acur = cur;
-    return err;
-  }
-
-
-  /* first character must be the opening brace that */
-  /* starts the procedure                           */
-
-  /* NB: [ and ] need not match:                    */
-  /* `/foo {[} def' is a valid PostScript fragment, */
-  /* even within a Type1 font                       */
-
-  static FT_Error
-  skip_procedure( FT_Byte*  *acur,
-                  FT_Byte*   limit )
-  {
-    FT_Byte*  cur;
-    FT_Int    embed = 0;
-    FT_Error  error = FT_Err_Ok;
-
-
-    FT_ASSERT( **acur == '{' );
-
-    for ( cur = *acur; cur < limit && error == FT_Err_Ok; cur++ )
-    {
-      switch ( *cur )
-      {
-      case '{':
-        embed++;
-        break;
-
-      case '}':
-        embed--;
-        if ( embed == 0 )
-        {
-          cur++;
-          goto end;
-        }
-        break;
-
-      case '(':
-        error = skip_literal_string( &cur, limit );
-        break;
-
-      case '<':
-        error = skip_string( &cur, limit );
-        break;
-
-      case '%':
-        skip_comment( &cur, limit );
-        break;
-      }
-    }
-
-  end:
-    if ( embed != 0 )
-      error = FT_THROW( Invalid_File_Format );
-
-    *acur = cur;
-
-    return error;
-  }
-
-
-  /***********************************************************************/
-  /*                                                                     */
-  /* All exported parsing routines handle leading whitespace and stop at */
-  /* the first character which isn't part of the just handled token.     */
-  /*                                                                     */
-  /***********************************************************************/
-
-
-  FT_LOCAL_DEF( void )
-  ps_parser_skip_PS_token( PS_Parser  parser )
-  {
-    /* Note: PostScript allows any non-delimiting, non-whitespace        */
-    /*       character in a name (PS Ref Manual, 3rd ed, p31).           */
-    /*       PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */
-
-    FT_Byte*  cur   = parser->cursor;
-    FT_Byte*  limit = parser->limit;
-    FT_Error  error = FT_Err_Ok;
-
-
-    skip_spaces( &cur, limit );             /* this also skips comments */
-    if ( cur >= limit )
-      goto Exit;
-
-    /* self-delimiting, single-character tokens */
-    if ( *cur == '[' || *cur == ']' )
-    {
-      cur++;
-      goto Exit;
-    }
-
-    /* skip balanced expressions (procedures and strings) */
-
-    if ( *cur == '{' )                              /* {...} */
-    {
-      error = skip_procedure( &cur, limit );
-      goto Exit;
-    }
-
-    if ( *cur == '(' )                              /* (...) */
-    {
-      error = skip_literal_string( &cur, limit );
-      goto Exit;
-    }
-
-    if ( *cur == '<' )                              /* <...> */
-    {
-      if ( cur + 1 < limit && *(cur + 1) == '<' )   /* << */
-      {
-        cur++;
-        cur++;
-      }
-      else
-        error = skip_string( &cur, limit );
-
-      goto Exit;
-    }
-
-    if ( *cur == '>' )
-    {
-      cur++;
-      if ( cur >= limit || *cur != '>' )             /* >> */
-      {
-        FT_ERROR(( "ps_parser_skip_PS_token:"
-                   " unexpected closing delimiter `>'\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-      cur++;
-      goto Exit;
-    }
-
-    if ( *cur == '/' )
-      cur++;
-
-    /* anything else */
-    while ( cur < limit )
-    {
-      /* *cur might be invalid (e.g., ')' or '}'), but this   */
-      /* is handled by the test `cur == parser->cursor' below */
-      if ( IS_PS_DELIM( *cur ) )
-        break;
-
-      cur++;
-    }
-
-  Exit:
-    if ( cur < limit && cur == parser->cursor )
-    {
-      FT_ERROR(( "ps_parser_skip_PS_token:"
-                 " current token is `%c' which is self-delimiting\n"
-                 "                        "
-                 " but invalid at this point\n",
-                 *cur ));
-
-      error = FT_THROW( Invalid_File_Format );
-    }
-
-    if ( cur > limit )
-      cur = limit;
-
-    parser->error  = error;
-    parser->cursor = cur;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  ps_parser_skip_spaces( PS_Parser  parser )
-  {
-    skip_spaces( &parser->cursor, parser->limit );
-  }
-
-
-  /* `token' here means either something between balanced delimiters */
-  /* or the next token; the delimiters are not removed.              */
-
-  FT_LOCAL_DEF( void )
-  ps_parser_to_token( PS_Parser  parser,
-                      T1_Token   token )
-  {
-    FT_Byte*  cur;
-    FT_Byte*  limit;
-    FT_Int    embed;
-
-
-    token->type  = T1_TOKEN_TYPE_NONE;
-    token->start = NULL;
-    token->limit = NULL;
-
-    /* first of all, skip leading whitespace */
-    ps_parser_skip_spaces( parser );
-
-    cur   = parser->cursor;
-    limit = parser->limit;
-
-    if ( cur >= limit )
-      return;
-
-    switch ( *cur )
-    {
-      /************* check for literal string *****************/
-    case '(':
-      token->type  = T1_TOKEN_TYPE_STRING;
-      token->start = cur;
-
-      if ( skip_literal_string( &cur, limit ) == FT_Err_Ok )
-        token->limit = cur;
-      break;
-
-      /************* check for programs/array *****************/
-    case '{':
-      token->type  = T1_TOKEN_TYPE_ARRAY;
-      token->start = cur;
-
-      if ( skip_procedure( &cur, limit ) == FT_Err_Ok )
-        token->limit = cur;
-      break;
-
-      /************* check for table/array ********************/
-      /* XXX: in theory we should also look for "<<"          */
-      /*      since this is semantically equivalent to "[";   */
-      /*      in practice it doesn't matter (?)               */
-    case '[':
-      token->type  = T1_TOKEN_TYPE_ARRAY;
-      embed        = 1;
-      token->start = cur++;
-
-      /* we need this to catch `[ ]' */
-      parser->cursor = cur;
-      ps_parser_skip_spaces( parser );
-      cur = parser->cursor;
-
-      while ( cur < limit && !parser->error )
-      {
-        /* XXX: this is wrong because it does not      */
-        /*      skip comments, procedures, and strings */
-        if ( *cur == '[' )
-          embed++;
-        else if ( *cur == ']' )
-        {
-          embed--;
-          if ( embed <= 0 )
-          {
-            token->limit = ++cur;
-            break;
-          }
-        }
-
-        parser->cursor = cur;
-        ps_parser_skip_PS_token( parser );
-        /* we need this to catch `[XXX ]' */
-        ps_parser_skip_spaces  ( parser );
-        cur = parser->cursor;
-      }
-      break;
-
-      /* ************ otherwise, it is any token **************/
-    default:
-      token->start = cur;
-      token->type  = ( *cur == '/' ) ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY;
-      ps_parser_skip_PS_token( parser );
-      cur = parser->cursor;
-      if ( !parser->error )
-        token->limit = cur;
-    }
-
-    if ( !token->limit )
-    {
-      token->start = NULL;
-      token->type  = T1_TOKEN_TYPE_NONE;
-    }
-
-    parser->cursor = cur;
-  }
-
-
-  /* NB: `tokens' can be NULL if we only want to count */
-  /* the number of array elements                      */
-
-  FT_LOCAL_DEF( void )
-  ps_parser_to_token_array( PS_Parser  parser,
-                            T1_Token   tokens,
-                            FT_UInt    max_tokens,
-                            FT_Int*    pnum_tokens )
-  {
-    T1_TokenRec  master;
-
-
-    *pnum_tokens = -1;
-
-    /* this also handles leading whitespace */
-    ps_parser_to_token( parser, &master );
-
-    if ( master.type == T1_TOKEN_TYPE_ARRAY )
-    {
-      FT_Byte*  old_cursor = parser->cursor;
-      FT_Byte*  old_limit  = parser->limit;
-      T1_Token  cur        = tokens;
-      T1_Token  limit      = cur + max_tokens;
-
-
-      /* don't include outermost delimiters */
-      parser->cursor = master.start + 1;
-      parser->limit  = master.limit - 1;
-
-      while ( parser->cursor < parser->limit )
-      {
-        T1_TokenRec  token;
-
-
-        ps_parser_to_token( parser, &token );
-        if ( !token.type )
-          break;
-
-        if ( tokens && cur < limit )
-          *cur = token;
-
-        cur++;
-      }
-
-      *pnum_tokens = (FT_Int)( cur - tokens );
-
-      parser->cursor = old_cursor;
-      parser->limit  = old_limit;
-    }
-  }
-
-
-  /* first character must be a delimiter or a part of a number */
-  /* NB: `coords' can be NULL if we just want to skip the      */
-  /*     array; in this case we ignore `max_coords'            */
-
-  static FT_Int
-  ps_tocoordarray( FT_Byte*  *acur,
-                   FT_Byte*   limit,
-                   FT_Int     max_coords,
-                   FT_Short*  coords )
-  {
-    FT_Byte*  cur   = *acur;
-    FT_Int    count = 0;
-    FT_Byte   c, ender;
-
-
-    if ( cur >= limit )
-      goto Exit;
-
-    /* check for the beginning of an array; otherwise, only one number */
-    /* will be read                                                    */
-    c     = *cur;
-    ender = 0;
-
-    if ( c == '[' )
-      ender = ']';
-    else if ( c == '{' )
-      ender = '}';
-
-    if ( ender )
-      cur++;
-
-    /* now, read the coordinates */
-    while ( cur < limit )
-    {
-      FT_Short  dummy;
-      FT_Byte*  old_cur;
-
-
-      /* skip whitespace in front of data */
-      skip_spaces( &cur, limit );
-      if ( cur >= limit )
-        goto Exit;
-
-      if ( *cur == ender )
-      {
-        cur++;
-        break;
-      }
-
-      old_cur = cur;
-
-      if ( coords && count >= max_coords )
-        break;
-
-      /* call PS_Conv_ToFixed() even if coords == NULL */
-      /* to properly parse number at `cur'             */
-      *( coords ? &coords[count] : &dummy ) =
-        (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 );
-
-      if ( old_cur == cur )
-      {
-        count = -1;
-        goto Exit;
-      }
-      else
-        count++;
-
-      if ( !ender )
-        break;
-    }
-
-  Exit:
-    *acur = cur;
-    return count;
-  }
-
-
-  /* first character must be a delimiter or a part of a number */
-  /* NB: `values' can be NULL if we just want to skip the      */
-  /*     array; in this case we ignore `max_values'            */
-  /*                                                           */
-  /* return number of successfully parsed values               */
-
-  static FT_Int
-  ps_tofixedarray( FT_Byte*  *acur,
-                   FT_Byte*   limit,
-                   FT_Int     max_values,
-                   FT_Fixed*  values,
-                   FT_Int     power_ten )
-  {
-    FT_Byte*  cur   = *acur;
-    FT_Int    count = 0;
-    FT_Byte   c, ender;
-
-
-    if ( cur >= limit )
-      goto Exit;
-
-    /* Check for the beginning of an array.  Otherwise, only one number */
-    /* will be read.                                                    */
-    c     = *cur;
-    ender = 0;
-
-    if ( c == '[' )
-      ender = ']';
-    else if ( c == '{' )
-      ender = '}';
-
-    if ( ender )
-      cur++;
-
-    /* now, read the values */
-    while ( cur < limit )
-    {
-      FT_Fixed  dummy;
-      FT_Byte*  old_cur;
-
-
-      /* skip whitespace in front of data */
-      skip_spaces( &cur, limit );
-      if ( cur >= limit )
-        goto Exit;
-
-      if ( *cur == ender )
-      {
-        cur++;
-        break;
-      }
-
-      old_cur = cur;
-
-      if ( values && count >= max_values )
-        break;
-
-      /* call PS_Conv_ToFixed() even if coords == NULL */
-      /* to properly parse number at `cur'             */
-      *( values ? &values[count] : &dummy ) =
-        PS_Conv_ToFixed( &cur, limit, power_ten );
-
-      if ( old_cur == cur )
-      {
-        count = -1;
-        goto Exit;
-      }
-      else
-        count++;
-
-      if ( !ender )
-        break;
-    }
-
-  Exit:
-    *acur = cur;
-    return count;
-  }
-
-
-#if 0
-
-  static FT_String*
-  ps_tostring( FT_Byte**  cursor,
-               FT_Byte*   limit,
-               FT_Memory  memory )
-  {
-    FT_Byte*    cur = *cursor;
-    FT_UInt     len = 0;
-    FT_Int      count;
-    FT_String*  result;
-    FT_Error    error;
-
-
-    /* XXX: some stupid fonts have a `Notice' or `Copyright' string     */
-    /*      that simply doesn't begin with an opening parenthesis, even */
-    /*      though they have a closing one!  E.g. "amuncial.pfb"        */
-    /*                                                                  */
-    /*      We must deal with these ill-fated cases there.  Note that   */
-    /*      these fonts didn't work with the old Type 1 driver as the   */
-    /*      notice/copyright was not recognized as a valid string token */
-    /*      and made the old token parser commit errors.                */
-
-    while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) )
-      cur++;
-    if ( cur + 1 >= limit )
-      return 0;
-
-    if ( *cur == '(' )
-      cur++;  /* skip the opening parenthesis, if there is one */
-
-    *cursor = cur;
-    count   = 0;
-
-    /* then, count its length */
-    for ( ; cur < limit; cur++ )
-    {
-      if ( *cur == '(' )
-        count++;
-
-      else if ( *cur == ')' )
-      {
-        count--;
-        if ( count < 0 )
-          break;
-      }
-    }
-
-    len = (FT_UInt)( cur - *cursor );
-    if ( cur >= limit || FT_ALLOC( result, len + 1 ) )
-      return 0;
-
-    /* now copy the string */
-    FT_MEM_COPY( result, *cursor, len );
-    result[len] = '\0';
-    *cursor = cur;
-    return result;
-  }
-
-#endif /* 0 */
-
-
-  static int
-  ps_tobool( FT_Byte*  *acur,
-             FT_Byte*   limit )
-  {
-    FT_Byte*  cur    = *acur;
-    FT_Bool   result = 0;
-
-
-    /* return 1 if we find `true', 0 otherwise */
-    if ( cur + 3 < limit &&
-         cur[0] == 't'   &&
-         cur[1] == 'r'   &&
-         cur[2] == 'u'   &&
-         cur[3] == 'e'   )
-    {
-      result = 1;
-      cur   += 5;
-    }
-    else if ( cur + 4 < limit &&
-              cur[0] == 'f'   &&
-              cur[1] == 'a'   &&
-              cur[2] == 'l'   &&
-              cur[3] == 's'   &&
-              cur[4] == 'e'   )
-    {
-      result = 0;
-      cur   += 6;
-    }
-
-    *acur = cur;
-    return result;
-  }
-
-
-  /* load a simple field (i.e. non-table) into the current list of objects */
-
-  FT_LOCAL_DEF( FT_Error )
-  ps_parser_load_field( PS_Parser       parser,
-                        const T1_Field  field,
-                        void**          objects,
-                        FT_UInt         max_objects,
-                        FT_ULong*       pflags )
-  {
-    T1_TokenRec   token;
-    FT_Byte*      cur;
-    FT_Byte*      limit;
-    FT_UInt       count;
-    FT_UInt       idx;
-    FT_Error      error;
-    T1_FieldType  type;
-
-
-    /* this also skips leading whitespace */
-    ps_parser_to_token( parser, &token );
-    if ( !token.type )
-      goto Fail;
-
-    count = 1;
-    idx   = 0;
-    cur   = token.start;
-    limit = token.limit;
-
-    type = field->type;
-
-    /* we must detect arrays in /FontBBox */
-    if ( type == T1_FIELD_TYPE_BBOX )
-    {
-      T1_TokenRec  token2;
-      FT_Byte*     old_cur   = parser->cursor;
-      FT_Byte*     old_limit = parser->limit;
-
-
-      /* don't include delimiters */
-      parser->cursor = token.start + 1;
-      parser->limit  = token.limit - 1;
-
-      ps_parser_to_token( parser, &token2 );
-      parser->cursor = old_cur;
-      parser->limit  = old_limit;
-
-      if ( token2.type == T1_TOKEN_TYPE_ARRAY )
-      {
-        type = T1_FIELD_TYPE_MM_BBOX;
-        goto FieldArray;
-      }
-    }
-    else if ( token.type == T1_TOKEN_TYPE_ARRAY )
-    {
-      count = max_objects;
-
-    FieldArray:
-      /* if this is an array and we have no blend, an error occurs */
-      if ( max_objects == 0 )
-        goto Fail;
-
-      idx = 1;
-
-      /* don't include delimiters */
-      cur++;
-      limit--;
-    }
-
-    for ( ; count > 0; count--, idx++ )
-    {
-      FT_Byte*    q      = (FT_Byte*)objects[idx] + field->offset;
-      FT_Long     val;
-      FT_String*  string = NULL;
-
-
-      skip_spaces( &cur, limit );
-
-      switch ( type )
-      {
-      case T1_FIELD_TYPE_BOOL:
-        val = ps_tobool( &cur, limit );
-        goto Store_Integer;
-
-      case T1_FIELD_TYPE_FIXED:
-        val = PS_Conv_ToFixed( &cur, limit, 0 );
-        goto Store_Integer;
-
-      case T1_FIELD_TYPE_FIXED_1000:
-        val = PS_Conv_ToFixed( &cur, limit, 3 );
-        goto Store_Integer;
-
-      case T1_FIELD_TYPE_INTEGER:
-        val = PS_Conv_ToInt( &cur, limit );
-        /* fall through */
-
-      Store_Integer:
-        switch ( field->size )
-        {
-        case (8 / FT_CHAR_BIT):
-          *(FT_Byte*)q = (FT_Byte)val;
-          break;
-
-        case (16 / FT_CHAR_BIT):
-          *(FT_UShort*)q = (FT_UShort)val;
-          break;
-
-        case (32 / FT_CHAR_BIT):
-          *(FT_UInt32*)q = (FT_UInt32)val;
-          break;
-
-        default:                /* for 64-bit systems */
-          *(FT_Long*)q = val;
-        }
-        break;
-
-      case T1_FIELD_TYPE_STRING:
-      case T1_FIELD_TYPE_KEY:
-        {
-          FT_Memory  memory = parser->memory;
-          FT_UInt    len    = (FT_UInt)( limit - cur );
-
-
-          if ( cur >= limit )
-            break;
-
-          /* we allow both a string or a name   */
-          /* for cases like /FontName (foo) def */
-          if ( token.type == T1_TOKEN_TYPE_KEY )
-          {
-            /* don't include leading `/' */
-            len--;
-            cur++;
-          }
-          else if ( token.type == T1_TOKEN_TYPE_STRING )
-          {
-            /* don't include delimiting parentheses    */
-            /* XXX we don't handle <<...>> here        */
-            /* XXX should we convert octal escapes?    */
-            /*     if so, what encoding should we use? */
-            cur++;
-            len -= 2;
-          }
-          else
-          {
-            FT_ERROR(( "ps_parser_load_field:"
-                       " expected a name or string\n"
-                       "                     "
-                       " but found token of type %d instead\n",
-                       token.type ));
-            error = FT_THROW( Invalid_File_Format );
-            goto Exit;
-          }
-
-          /* for this to work (FT_String**)q must have been */
-          /* initialized to NULL                            */
-          if ( *(FT_String**)q )
-          {
-            FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n",
-                        field->ident ));
-            FT_FREE( *(FT_String**)q );
-            *(FT_String**)q = NULL;
-          }
-
-          if ( FT_ALLOC( string, len + 1 ) )
-            goto Exit;
-
-          FT_MEM_COPY( string, cur, len );
-          string[len] = 0;
-
-          *(FT_String**)q = string;
-        }
-        break;
-
-      case T1_FIELD_TYPE_BBOX:
-        {
-          FT_Fixed  temp[4];
-          FT_BBox*  bbox = (FT_BBox*)q;
-          FT_Int    result;
-
-
-          result = ps_tofixedarray( &cur, limit, 4, temp, 0 );
-
-          if ( result < 4 )
-          {
-            FT_ERROR(( "ps_parser_load_field:"
-                       " expected four integers in bounding box\n" ));
-            error = FT_THROW( Invalid_File_Format );
-            goto Exit;
-          }
-
-          bbox->xMin = FT_RoundFix( temp[0] );
-          bbox->yMin = FT_RoundFix( temp[1] );
-          bbox->xMax = FT_RoundFix( temp[2] );
-          bbox->yMax = FT_RoundFix( temp[3] );
-        }
-        break;
-
-      case T1_FIELD_TYPE_MM_BBOX:
-        {
-          FT_Memory  memory = parser->memory;
-          FT_Fixed*  temp   = NULL;
-          FT_Int     result;
-          FT_UInt    i;
-
-
-          if ( FT_NEW_ARRAY( temp, max_objects * 4 ) )
-            goto Exit;
-
-          for ( i = 0; i < 4; i++ )
-          {
-            result = ps_tofixedarray( &cur, limit, (FT_Int)max_objects,
-                                      temp + i * max_objects, 0 );
-            if ( result < 0 || (FT_UInt)result < max_objects )
-            {
-              FT_ERROR(( "ps_parser_load_field:"
-                         " expected %d integer%s in the %s subarray\n"
-                         "                     "
-                         " of /FontBBox in the /Blend dictionary\n",
-                         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;
-            }
-
-            skip_spaces( &cur, limit );
-          }
-
-          for ( i = 0; i < max_objects; i++ )
-          {
-            FT_BBox*  bbox = (FT_BBox*)objects[i];
-
-
-            bbox->xMin = FT_RoundFix( temp[i                  ] );
-            bbox->yMin = FT_RoundFix( temp[i +     max_objects] );
-            bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] );
-            bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] );
-          }
-
-          FT_FREE( temp );
-        }
-        break;
-
-      default:
-        /* an error occurred */
-        goto Fail;
-      }
-    }
-
-#if 0  /* obsolete -- keep for reference */
-    if ( pflags )
-      *pflags |= 1L << field->flag_bit;
-#else
-    FT_UNUSED( pflags );
-#endif
-
-    error = FT_Err_Ok;
-
-  Exit:
-    return error;
-
-  Fail:
-    error = FT_THROW( Invalid_File_Format );
-    goto Exit;
-  }
-
-
-#define T1_MAX_TABLE_ELEMENTS  32
-
-
-  FT_LOCAL_DEF( FT_Error )
-  ps_parser_load_field_table( PS_Parser       parser,
-                              const T1_Field  field,
-                              void**          objects,
-                              FT_UInt         max_objects,
-                              FT_ULong*       pflags )
-  {
-    T1_TokenRec  elements[T1_MAX_TABLE_ELEMENTS];
-    T1_Token     token;
-    FT_Int       num_elements;
-    FT_Error     error = FT_Err_Ok;
-    FT_Byte*     old_cursor;
-    FT_Byte*     old_limit;
-    T1_FieldRec  fieldrec = *(T1_Field)field;
-
-
-    fieldrec.type = T1_FIELD_TYPE_INTEGER;
-    if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY ||
-         field->type == T1_FIELD_TYPE_BBOX        )
-      fieldrec.type = T1_FIELD_TYPE_FIXED;
-
-    ps_parser_to_token_array( parser, elements,
-                              T1_MAX_TABLE_ELEMENTS, &num_elements );
-    if ( num_elements < 0 )
-    {
-      error = FT_ERR( Ignore );
-      goto Exit;
-    }
-    if ( (FT_UInt)num_elements > field->array_max )
-      num_elements = (FT_Int)field->array_max;
-
-    old_cursor = parser->cursor;
-    old_limit  = parser->limit;
-
-    /* we store the elements count if necessary;           */
-    /* we further assume that `count_offset' can't be zero */
-    if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 )
-      *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) =
-        (FT_Byte)num_elements;
-
-    /* we now load each element, adjusting the field.offset on each one */
-    token = elements;
-    for ( ; num_elements > 0; num_elements--, token++ )
-    {
-      parser->cursor = token->start;
-      parser->limit  = token->limit;
-
-      error = ps_parser_load_field( parser,
-                                    &fieldrec,
-                                    objects,
-                                    max_objects,
-                                    0 );
-      if ( error )
-        break;
-
-      fieldrec.offset += fieldrec.size;
-    }
-
-#if 0  /* obsolete -- keep for reference */
-    if ( pflags )
-      *pflags |= 1L << field->flag_bit;
-#else
-    FT_UNUSED( pflags );
-#endif
-
-    parser->cursor = old_cursor;
-    parser->limit  = old_limit;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Long )
-  ps_parser_to_int( PS_Parser  parser )
-  {
-    ps_parser_skip_spaces( parser );
-    return PS_Conv_ToInt( &parser->cursor, parser->limit );
-  }
-
-
-  /* first character must be `<' if `delimiters' is non-zero */
-
-  FT_LOCAL_DEF( FT_Error )
-  ps_parser_to_bytes( PS_Parser  parser,
-                      FT_Byte*   bytes,
-                      FT_Offset  max_bytes,
-                      FT_ULong*  pnum_bytes,
-                      FT_Bool    delimiters )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_Byte*  cur;
-
-
-    ps_parser_skip_spaces( parser );
-    cur = parser->cursor;
-
-    if ( cur >= parser->limit )
-      goto Exit;
-
-    if ( delimiters )
-    {
-      if ( *cur != '<' )
-      {
-        FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      cur++;
-    }
-
-    *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur,
-                                          parser->limit,
-                                          bytes,
-                                          max_bytes );
-
-    if ( delimiters )
-    {
-      if ( cur < parser->limit && *cur != '>' )
-      {
-        FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      cur++;
-    }
-
-    parser->cursor = cur;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Fixed )
-  ps_parser_to_fixed( PS_Parser  parser,
-                      FT_Int     power_ten )
-  {
-    ps_parser_skip_spaces( parser );
-    return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten );
-  }
-
-
-  FT_LOCAL_DEF( FT_Int )
-  ps_parser_to_coord_array( PS_Parser  parser,
-                            FT_Int     max_coords,
-                            FT_Short*  coords )
-  {
-    ps_parser_skip_spaces( parser );
-    return ps_tocoordarray( &parser->cursor, parser->limit,
-                            max_coords, coords );
-  }
-
-
-  FT_LOCAL_DEF( FT_Int )
-  ps_parser_to_fixed_array( PS_Parser  parser,
-                            FT_Int     max_values,
-                            FT_Fixed*  values,
-                            FT_Int     power_ten )
-  {
-    ps_parser_skip_spaces( parser );
-    return ps_tofixedarray( &parser->cursor, parser->limit,
-                            max_values, values, power_ten );
-  }
-
-
-#if 0
-
-  FT_LOCAL_DEF( FT_String* )
-  T1_ToString( PS_Parser  parser )
-  {
-    return ps_tostring( &parser->cursor, parser->limit, parser->memory );
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  T1_ToBool( PS_Parser  parser )
-  {
-    return ps_tobool( &parser->cursor, parser->limit );
-  }
-
-#endif /* 0 */
-
-
-  FT_LOCAL_DEF( void )
-  ps_parser_init( PS_Parser  parser,
-                  FT_Byte*   base,
-                  FT_Byte*   limit,
-                  FT_Memory  memory )
-  {
-    parser->error  = FT_Err_Ok;
-    parser->base   = base;
-    parser->limit  = limit;
-    parser->cursor = base;
-    parser->memory = memory;
-    parser->funcs  = ps_parser_funcs;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  ps_parser_done( PS_Parser  parser )
-  {
-    FT_UNUSED( parser );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            T1 BUILDER                         *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1_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 )
-  t1_builder_init( T1_Builder    builder,
-                   FT_Face       face,
-                   FT_Size       size,
-                   FT_GlyphSlot  glyph,
-                   FT_Bool       hinting )
-  {
-    builder->parse_state = T1_Parse_Start;
-    builder->load_points = 1;
-
-    builder->face   = face;
-    builder->glyph  = glyph;
-    builder->memory = face->memory;
-
-    if ( glyph )
-    {
-      FT_GlyphLoader  loader = glyph->internal->loader;
-
-
-      builder->loader  = loader;
-      builder->base    = &loader->base.outline;
-      builder->current = &loader->current.outline;
-      FT_GlyphLoader_Rewind( loader );
-
-      builder->hints_globals = size->internal;
-      builder->hints_funcs   = NULL;
-
-      if ( hinting )
-        builder->hints_funcs = glyph->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 = t1_builder_funcs;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1_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 )
-  t1_builder_done( T1_Builder  builder )
-  {
-    FT_GlyphSlot  glyph = builder->glyph;
-
-
-    if ( glyph )
-      glyph->outline = *builder->base;
-  }
-
-
-  /* check that there is enough space for `count' more points */
-  FT_LOCAL_DEF( FT_Error )
-  t1_builder_check_points( T1_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 )
-  t1_builder_add_point( T1_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;
-
-
-      point->x = FIXED_TO_INT( x );
-      point->y = FIXED_TO_INT( y );
-      *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 )
-  t1_builder_add_point1( T1_Builder  builder,
-                         FT_Pos      x,
-                         FT_Pos      y )
-  {
-    FT_Error  error;
-
-
-    error = t1_builder_check_points( builder, 1 );
-    if ( !error )
-      t1_builder_add_point( builder, x, y, 1 );
-
-    return error;
-  }
-
-
-  /* check space for a new contour, then add it */
-  FT_LOCAL_DEF( FT_Error )
-  t1_builder_add_contour( T1_Builder  builder )
-  {
-    FT_Outline*  outline = builder->current;
-    FT_Error     error;
-
-
-    /* this might happen in invalid fonts */
-    if ( !outline )
-    {
-      FT_ERROR(( "t1_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 )
-  t1_builder_start_point( T1_Builder  builder,
-                          FT_Pos      x,
-                          FT_Pos      y )
-  {
-    FT_Error  error = FT_ERR( Invalid_File_Format );
-
-
-    /* test whether we are building a new contour */
-
-    if ( builder->parse_state == T1_Parse_Have_Path )
-      error = FT_Err_Ok;
-    else
-    {
-      builder->parse_state = T1_Parse_Have_Path;
-      error = t1_builder_add_contour( builder );
-      if ( !error )
-        error = t1_builder_add_point1( builder, x, y );
-    }
-
-    return error;
-  }
-
-
-  /* close the current contour */
-  FT_LOCAL_DEF( void )
-  t1_builder_close_contour( T1_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 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 );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            OTHER                              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_LOCAL_DEF( void )
-  t1_decrypt( FT_Byte*   buffer,
-              FT_Offset  length,
-              FT_UShort  seed )
-  {
-    PS_Conv_EexecDecode( &buffer,
-                         buffer + length,
-                         buffer,
-                         length,
-                         &seed );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/psobjs.h b/third_party/freetype/src/psaux/psobjs.h
deleted file mode 100644
index 202e5b2..0000000
--- a/third_party/freetype/src/psaux/psobjs.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psobjs.h                                                               */
-/*                                                                         */
-/*    Auxiliary functions for PostScript fonts (specification).            */
-/*                                                                         */
-/*  Copyright 1996-2017 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 PSOBJS_H_
-#define PSOBJS_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                             T1_TABLE                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  FT_CALLBACK_TABLE
-  const PS_Table_FuncsRec    ps_table_funcs;
-
-  FT_CALLBACK_TABLE
-  const PS_Parser_FuncsRec   ps_parser_funcs;
-
-  FT_CALLBACK_TABLE
-  const T1_Builder_FuncsRec  t1_builder_funcs;
-
-
-  FT_LOCAL( FT_Error )
-  ps_table_new( PS_Table   table,
-                FT_Int     count,
-                FT_Memory  memory );
-
-  FT_LOCAL( FT_Error )
-  ps_table_add( PS_Table  table,
-                FT_Int    idx,
-                void*     object,
-                FT_UInt   length );
-
-  FT_LOCAL( void )
-  ps_table_done( PS_Table  table );
-
-
-  FT_LOCAL( void )
-  ps_table_release( PS_Table  table );
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            T1 PARSER                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  FT_LOCAL( void )
-  ps_parser_skip_spaces( PS_Parser  parser );
-
-  FT_LOCAL( void )
-  ps_parser_skip_PS_token( PS_Parser  parser );
-
-  FT_LOCAL( void )
-  ps_parser_to_token( PS_Parser  parser,
-                      T1_Token   token );
-
-  FT_LOCAL( void )
-  ps_parser_to_token_array( PS_Parser  parser,
-                            T1_Token   tokens,
-                            FT_UInt    max_tokens,
-                            FT_Int*    pnum_tokens );
-
-  FT_LOCAL( FT_Error )
-  ps_parser_load_field( PS_Parser       parser,
-                        const T1_Field  field,
-                        void**          objects,
-                        FT_UInt         max_objects,
-                        FT_ULong*       pflags );
-
-  FT_LOCAL( FT_Error )
-  ps_parser_load_field_table( PS_Parser       parser,
-                              const T1_Field  field,
-                              void**          objects,
-                              FT_UInt         max_objects,
-                              FT_ULong*       pflags );
-
-  FT_LOCAL( FT_Long )
-  ps_parser_to_int( PS_Parser  parser );
-
-
-  FT_LOCAL( FT_Error )
-  ps_parser_to_bytes( PS_Parser  parser,
-                      FT_Byte*   bytes,
-                      FT_Offset  max_bytes,
-                      FT_ULong*  pnum_bytes,
-                      FT_Bool    delimiters );
-
-
-  FT_LOCAL( FT_Fixed )
-  ps_parser_to_fixed( PS_Parser  parser,
-                      FT_Int     power_ten );
-
-
-  FT_LOCAL( FT_Int )
-  ps_parser_to_coord_array( PS_Parser  parser,
-                            FT_Int     max_coords,
-                            FT_Short*  coords );
-
-  FT_LOCAL( FT_Int )
-  ps_parser_to_fixed_array( PS_Parser  parser,
-                            FT_Int     max_values,
-                            FT_Fixed*  values,
-                            FT_Int     power_ten );
-
-
-  FT_LOCAL( void )
-  ps_parser_init( PS_Parser  parser,
-                  FT_Byte*   base,
-                  FT_Byte*   limit,
-                  FT_Memory  memory );
-
-  FT_LOCAL( void )
-  ps_parser_done( PS_Parser  parser );
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            T1 BUILDER                         *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_LOCAL( void )
-  t1_builder_init( T1_Builder    builder,
-                   FT_Face       face,
-                   FT_Size       size,
-                   FT_GlyphSlot  glyph,
-                   FT_Bool       hinting );
-
-  FT_LOCAL( void )
-  t1_builder_done( T1_Builder  builder );
-
-  FT_LOCAL( FT_Error )
-  t1_builder_check_points( T1_Builder  builder,
-                           FT_Int      count );
-
-  FT_LOCAL( void )
-  t1_builder_add_point( T1_Builder  builder,
-                        FT_Pos      x,
-                        FT_Pos      y,
-                        FT_Byte     flag );
-
-  FT_LOCAL( FT_Error )
-  t1_builder_add_point1( T1_Builder  builder,
-                         FT_Pos      x,
-                         FT_Pos      y );
-
-  FT_LOCAL( FT_Error )
-  t1_builder_add_contour( T1_Builder  builder );
-
-
-  FT_LOCAL( FT_Error )
-  t1_builder_start_point( T1_Builder  builder,
-                          FT_Pos      x,
-                          FT_Pos      y );
-
-
-  FT_LOCAL( void )
-  t1_builder_close_contour( T1_Builder  builder );
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                            OTHER                              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_LOCAL( void )
-  t1_decrypt( FT_Byte*   buffer,
-              FT_Offset  length,
-              FT_UShort  seed );
-
-
-FT_END_HEADER
-
-#endif /* PSOBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/t1cmap.c b/third_party/freetype/src/psaux/t1cmap.c
deleted file mode 100644
index 45b713e..0000000
--- a/third_party/freetype/src/psaux/t1cmap.c
+++ /dev/null
@@ -1,371 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1cmap.c                                                               */
-/*                                                                         */
-/*    Type 1 character map support (body).                                 */
-/*                                                                         */
-/*  Copyright 2002-2017 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 "t1cmap.h"
-
-#include FT_INTERNAL_DEBUG_H
-
-#include "psauxerr.h"
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static void
-  t1_cmap_std_init( T1_CMapStd  cmap,
-                    FT_Int      is_expert )
-  {
-    T1_Face             face    = (T1_Face)FT_CMAP_FACE( cmap );
-    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
-
-
-    cmap->num_glyphs    = (FT_UInt)face->type1.num_glyphs;
-    cmap->glyph_names   = (const char* const*)face->type1.glyph_names;
-    cmap->sid_to_string = psnames->adobe_std_strings;
-    cmap->code_to_sid   = is_expert ? psnames->adobe_expert_encoding
-                                    : psnames->adobe_std_encoding;
-
-    FT_ASSERT( cmap->code_to_sid );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  t1_cmap_std_done( T1_CMapStd  cmap )
-  {
-    cmap->num_glyphs    = 0;
-    cmap->glyph_names   = NULL;
-    cmap->sid_to_string = NULL;
-    cmap->code_to_sid   = NULL;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  t1_cmap_std_char_index( T1_CMapStd  cmap,
-                          FT_UInt32   char_code )
-  {
-    FT_UInt  result = 0;
-
-
-    if ( char_code < 256 )
-    {
-      FT_UInt      code, n;
-      const char*  glyph_name;
-
-
-      /* convert character code to Adobe SID string */
-      code       = cmap->code_to_sid[char_code];
-      glyph_name = cmap->sid_to_string( code );
-
-      /* look for the corresponding glyph name */
-      for ( n = 0; n < cmap->num_glyphs; n++ )
-      {
-        const char* gname = cmap->glyph_names[n];
-
-
-        if ( gname && gname[0] == glyph_name[0]  &&
-             ft_strcmp( gname, glyph_name ) == 0 )
-        {
-          result = n;
-          break;
-        }
-      }
-    }
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  t1_cmap_std_char_next( T1_CMapStd   cmap,
-                         FT_UInt32   *pchar_code )
-  {
-    FT_UInt    result    = 0;
-    FT_UInt32  char_code = *pchar_code + 1;
-
-
-    while ( char_code < 256 )
-    {
-      result = t1_cmap_std_char_index( cmap, char_code );
-      if ( result != 0 )
-        goto Exit;
-
-      char_code++;
-    }
-    char_code = 0;
-
-  Exit:
-    *pchar_code = char_code;
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  t1_cmap_standard_init( T1_CMapStd  cmap,
-                         FT_Pointer  pointer )
-  {
-    FT_UNUSED( pointer );
-
-
-    t1_cmap_std_init( cmap, 0 );
-    return 0;
-  }
-
-
-  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
-  t1_cmap_standard_class_rec =
-  {
-    sizeof ( T1_CMapStdRec ),
-
-    (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  */
-
-    (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 */
-  };
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  t1_cmap_expert_init( T1_CMapStd  cmap,
-                       FT_Pointer  pointer )
-  {
-    FT_UNUSED( pointer );
-
-
-    t1_cmap_std_init( cmap, 1 );
-    return 0;
-  }
-
-  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
-  t1_cmap_expert_class_rec =
-  {
-    sizeof ( T1_CMapStdRec ),
-
-    (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  */
-
-    (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 */
-  };
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    TYPE1 CUSTOM ENCODING CMAP                 *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  t1_cmap_custom_init( T1_CMapCustom  cmap,
-                       FT_Pointer     pointer )
-  {
-    T1_Face      face     = (T1_Face)FT_CMAP_FACE( cmap );
-    T1_Encoding  encoding = &face->type1.encoding;
-
-    FT_UNUSED( pointer );
-
-
-    cmap->first   = (FT_UInt)encoding->code_first;
-    cmap->count   = (FT_UInt)encoding->code_last - cmap->first;
-    cmap->indices = encoding->char_index;
-
-    FT_ASSERT( cmap->indices );
-    FT_ASSERT( encoding->code_first <= encoding->code_last );
-
-    return 0;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  t1_cmap_custom_done( T1_CMapCustom  cmap )
-  {
-    cmap->indices = NULL;
-    cmap->first   = 0;
-    cmap->count   = 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  t1_cmap_custom_char_index( T1_CMapCustom  cmap,
-                             FT_UInt32      char_code )
-  {
-    FT_UInt    result = 0;
-
-
-    if ( ( char_code >= cmap->first )                  &&
-         ( char_code < ( cmap->first + cmap->count ) ) )
-      result = cmap->indices[char_code];
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  t1_cmap_custom_char_next( T1_CMapCustom  cmap,
-                            FT_UInt32     *pchar_code )
-  {
-    FT_UInt    result = 0;
-    FT_UInt32  char_code = *pchar_code;
-
-
-    char_code++;
-
-    if ( char_code < cmap->first )
-      char_code = cmap->first;
-
-    for ( ; char_code < ( cmap->first + cmap->count ); char_code++ )
-    {
-      result = cmap->indices[char_code];
-      if ( result != 0 )
-        goto Exit;
-    }
-
-    char_code = 0;
-
-  Exit:
-    *pchar_code = char_code;
-    return result;
-  }
-
-
-  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
-  t1_cmap_custom_class_rec =
-  {
-    sizeof ( T1_CMapCustomRec ),
-
-    (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  */
-
-    (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 */
-  };
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****            TYPE1 SYNTHETIC UNICODE ENCODING CMAP              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_CALLBACK_DEF( const char * )
-  psaux_get_glyph_name( T1_Face  face,
-                        FT_UInt  idx )
-  {
-    return face->type1.glyph_names[idx];
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  t1_cmap_unicode_init( PS_Unicodes  unicodes,
-                        FT_Pointer   pointer )
-  {
-    T1_Face             face    = (T1_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,
-                                   (FT_UInt)face->type1.num_glyphs,
-                                   (PS_GetGlyphNameFunc)&psaux_get_glyph_name,
-                                   (PS_FreeGlyphNameFunc)NULL,
-                                   (FT_Pointer)face );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  t1_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 )
-  t1_cmap_unicode_char_index( PS_Unicodes  unicodes,
-                              FT_UInt32    char_code )
-  {
-    T1_Face             face    = (T1_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 )
-  t1_cmap_unicode_char_next( PS_Unicodes  unicodes,
-                             FT_UInt32   *pchar_code )
-  {
-    T1_Face             face    = (T1_Face)FT_CMAP_FACE( unicodes );
-    FT_Service_PsCMaps  psnames = (FT_Service_PsCMaps)face->psnames;
-
-
-    return psnames->unicodes_char_next( unicodes, pchar_code );
-  }
-
-
-  FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec
-  t1_cmap_unicode_class_rec =
-  {
-    sizeof ( PS_UnicodesRec ),
-
-    (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  */
-
-    (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/third_party/freetype/src/psaux/t1cmap.h b/third_party/freetype/src/psaux/t1cmap.h
deleted file mode 100644
index 7870245..0000000
--- a/third_party/freetype/src/psaux/t1cmap.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1cmap.h                                                               */
-/*                                                                         */
-/*    Type 1 character map support (specification).                        */
-/*                                                                         */
-/*  Copyright 2002-2017 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 T1CMAP_H_
-#define T1CMAP_H_
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****          TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS           *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* standard (and expert) encoding cmaps */
-  typedef struct T1_CMapStdRec_*  T1_CMapStd;
-
-  typedef struct  T1_CMapStdRec_
-  {
-    FT_CMapRec                cmap;
-
-    const FT_UShort*          code_to_sid;
-    PS_Adobe_Std_StringsFunc  sid_to_string;
-
-    FT_UInt                   num_glyphs;
-    const char* const*        glyph_names;
-
-  } T1_CMapStdRec;
-
-
-  FT_CALLBACK_TABLE const FT_CMap_ClassRec
-  t1_cmap_standard_class_rec;
-
-  FT_CALLBACK_TABLE const FT_CMap_ClassRec
-  t1_cmap_expert_class_rec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                  TYPE1 CUSTOM ENCODING CMAP                   *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef struct T1_CMapCustomRec_*  T1_CMapCustom;
-
-  typedef struct  T1_CMapCustomRec_
-  {
-    FT_CMapRec  cmap;
-    FT_UInt     first;
-    FT_UInt     count;
-    FT_UShort*  indices;
-
-  } T1_CMapCustomRec;
-
-
-  FT_CALLBACK_TABLE const FT_CMap_ClassRec
-  t1_cmap_custom_class_rec;
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****             TYPE1 SYNTHETIC UNICODE ENCODING CMAP             *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* unicode (synthetic) cmaps */
-
-  FT_CALLBACK_TABLE const FT_CMap_ClassRec
-  t1_cmap_unicode_class_rec;
-
- /* */
-
-
-FT_END_HEADER
-
-#endif /* T1CMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/t1decode.c b/third_party/freetype/src/psaux/t1decode.c
deleted file mode 100644
index af7b465..0000000
--- a/third_party/freetype/src/psaux/t1decode.c
+++ /dev/null
@@ -1,1625 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1decode.c                                                             */
-/*                                                                         */
-/*    PostScript Type 1 decoding routines (body).                          */
-/*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_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"
-#include "psobjs.h"
-
-#include "psauxerr.h"
-
-/* ensure proper sign extension */
-#define Fix2Int( f )  ( (FT_Int)(FT_Short)( (f) >> 16 ) )
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_t1decode
-
-
-  typedef enum  T1_Operator_
-  {
-    op_none = 0,
-    op_endchar,
-    op_hsbw,
-    op_seac,
-    op_sbw,
-    op_closepath,
-    op_hlineto,
-    op_hmoveto,
-    op_hvcurveto,
-    op_rlineto,
-    op_rmoveto,
-    op_rrcurveto,
-    op_vhcurveto,
-    op_vlineto,
-    op_vmoveto,
-    op_dotsection,
-    op_hstem,
-    op_hstem3,
-    op_vstem,
-    op_vstem3,
-    op_div,
-    op_callothersubr,
-    op_callsubr,
-    op_pop,
-    op_return,
-    op_setcurrentpoint,
-    op_unknown15,
-
-    op_max    /* never remove this one */
-
-  } T1_Operator;
-
-
-  static
-  const FT_Int  t1_args_count[op_max] =
-  {
-    0, /* none */
-    0, /* endchar */
-    2, /* hsbw */
-    5, /* seac */
-    4, /* sbw */
-    0, /* closepath */
-    1, /* hlineto */
-    1, /* hmoveto */
-    4, /* hvcurveto */
-    2, /* rlineto */
-    2, /* rmoveto */
-    6, /* rrcurveto */
-    4, /* vhcurveto */
-    1, /* vlineto */
-    1, /* vmoveto */
-    0, /* dotsection */
-    2, /* hstem */
-    6, /* hstem3 */
-    2, /* vstem */
-    6, /* vstem3 */
-    2, /* div */
-   -1, /* callothersubr */
-    1, /* callsubr */
-    0, /* pop */
-    0, /* return */
-    2, /* setcurrentpoint */
-    2  /* opcode 15 (undocumented and obsolete) */
-  };
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1_lookup_glyph_by_stdcharcode                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Looks up a given glyph by its StandardEncoding charcode.  Used to  */
-  /*    implement the SEAC Type 1 operator.                                */
-  /*                                                                       */
-  /* <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.                                                */
-  /*                                                                       */
-  static FT_Int
-  t1_lookup_glyph_by_stdcharcode( T1_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;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1operator_seac                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Implements the `seac' Type 1 operator for a Type 1 decoder.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    decoder :: The current CID decoder.                                */
-  /*                                                                       */
-  /*    asb     :: The accent's side bearing.                              */
-  /*                                                                       */
-  /*    adx     :: The horizontal offset of the accent.                    */
-  /*                                                                       */
-  /*    ady     :: The vertical offset of the accent.                      */
-  /*                                                                       */
-  /*    bchar   :: The base character's StandardEncoding charcode.         */
-  /*                                                                       */
-  /*    achar   :: The accent character's StandardEncoding charcode.       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  t1operator_seac( T1_Decoder  decoder,
-                   FT_Pos      asb,
-                   FT_Pos      adx,
-                   FT_Pos      ady,
-                   FT_Int      bchar,
-                   FT_Int      achar )
-  {
-    FT_Error     error;
-    FT_Int       bchar_index, achar_index;
-#if 0
-    FT_Int       n_base_points;
-    FT_Outline*  base = decoder->builder.base;
-#endif
-    FT_Vector    left_bearing, advance;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    T1_Face      face  = (T1_Face)decoder->builder.face;
-#endif
-
-
-    if ( decoder->seac )
-    {
-      FT_ERROR(( "t1operator_seac: invalid nested seac\n" ));
-      return FT_THROW( Syntax_Error );
-    }
-
-    if ( decoder->builder.metrics_only )
-    {
-      FT_ERROR(( "t1operator_seac: unexpected seac\n" ));
-      return FT_THROW( Syntax_Error );
-    }
-
-    /* seac weirdness */
-    adx += decoder->builder.left_bearing.x;
-
-    /* `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(( "t1operator_seac:"
-                 " glyph names table not available in this font\n" ));
-      return FT_THROW( Syntax_Error );
-    }
-
-#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( decoder, bchar );
-      achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar );
-    }
-
-    if ( bchar_index < 0 || achar_index < 0 )
-    {
-      FT_ERROR(( "t1operator_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 ( 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 */
-      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)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 */
-
-    FT_GlyphLoader_Prepare( decoder->builder.loader );  /* prepare loader */
-
-    /* the seac operator must not be nested */
-    decoder->seac = TRUE;
-    error = t1_decoder_parse_glyph( decoder, (FT_UInt)bchar_index );
-    decoder->seac = FALSE;
-    if ( error )
-      goto Exit;
-
-    /* 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;
-
-    decoder->builder.pos_x = adx - asb;
-    decoder->builder.pos_y = ady;
-
-    /* Now load `achar' on top of */
-    /* the base outline           */
-
-    /* the seac operator must not be nested */
-    decoder->seac = TRUE;
-    error = t1_decoder_parse_glyph( decoder, (FT_UInt)achar_index );
-    decoder->seac = FALSE;
-    if ( error )
-      goto Exit;
-
-    /* restore the left side bearing and   */
-    /* advance width of the base character */
-
-    decoder->builder.left_bearing = left_bearing;
-    decoder->builder.advance      = advance;
-
-    decoder->builder.pos_x = 0;
-    decoder->builder.pos_y = 0;
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    t1_decoder_parse_charstrings                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Parses a given Type 1 charstrings program.                         */
-  /*                                                                       */
-  /* <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_charstrings( T1_Decoder  decoder,
-                                FT_Byte*    charstring_base,
-                                FT_UInt     charstring_len )
-  {
-    FT_Error         error;
-    T1_Decoder_Zone  zone;
-    FT_Byte*         ip;
-    FT_Byte*         limit;
-    T1_Builder       builder = &decoder->builder;
-    FT_Pos           x, y, orig_x, orig_y;
-    FT_Int           known_othersubr_result_cnt   = 0;
-    FT_Int           unknown_othersubr_result_cnt = 0;
-    FT_Bool          large_int;
-    FT_Fixed         seed;
-
-    T1_Hints_Funcs   hinter;
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-    FT_Bool          bol = TRUE;
-#endif
-
-
-    /* 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;
-
-    /* First of all, initialize the decoder */
-    decoder->top  = decoder->stack;
-    decoder->zone = decoder->zones;
-    zone          = decoder->zones;
-
-    builder->parse_state = T1_Parse_Start;
-
-    hinter = (T1_Hints_Funcs)builder->hints_funcs;
-
-    /* a font that reads BuildCharArray without setting */
-    /* its values first is buggy, but ...               */
-    FT_ASSERT( ( decoder->len_buildchar == 0 ) ==
-               ( decoder->buildchar == NULL )  );
-
-    if ( decoder->buildchar && decoder->len_buildchar > 0 )
-      FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar );
-
-    FT_TRACE4(( "\n"
-                "Start charstring\n" ));
-
-    zone->base           = charstring_base;
-    limit = zone->limit  = charstring_base + charstring_len;
-    ip    = zone->cursor = zone->base;
-
-    error = FT_Err_Ok;
-
-    x = orig_x = builder->pos_x;
-    y = orig_y = builder->pos_y;
-
-    /* begin hints recording session, if any */
-    if ( hinter )
-      hinter->open( hinter->hints );
-
-    large_int = FALSE;
-
-    /* now, execute loop */
-    while ( ip < limit )
-    {
-      FT_Long*     top   = decoder->top;
-      T1_Operator  op    = op_none;
-      FT_Int32     value = 0;
-
-
-      FT_ASSERT( known_othersubr_result_cnt == 0   ||
-                 unknown_othersubr_result_cnt == 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:
-        op = op_hstem;
-        break;
-
-      case 3:
-        op = op_vstem;
-        break;
-      case 4:
-        op = op_vmoveto;
-        break;
-      case 5:
-        op = op_rlineto;
-        break;
-      case 6:
-        op = op_hlineto;
-        break;
-      case 7:
-        op = op_vlineto;
-        break;
-      case 8:
-        op = op_rrcurveto;
-        break;
-      case 9:
-        op = op_closepath;
-        break;
-      case 10:
-        op = op_callsubr;
-        break;
-      case 11:
-        op = op_return;
-        break;
-
-      case 13:
-        op = op_hsbw;
-        break;
-      case 14:
-        op = op_endchar;
-        break;
-
-      case 15:          /* undocumented, obsolete operator */
-        op = op_unknown15;
-        break;
-
-      case 21:
-        op = op_rmoveto;
-        break;
-      case 22:
-        op = op_hmoveto;
-        break;
-
-      case 30:
-        op = op_vhcurveto;
-        break;
-      case 31:
-        op = op_hvcurveto;
-        break;
-
-      case 12:
-        if ( ip >= limit )
-        {
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " invalid escape (12+EOF)\n" ));
-          goto Syntax_Error;
-        }
-
-        switch ( *ip++ )
-        {
-        case 0:
-          op = op_dotsection;
-          break;
-        case 1:
-          op = op_vstem3;
-          break;
-        case 2:
-          op = op_hstem3;
-          break;
-        case 6:
-          op = op_seac;
-          break;
-        case 7:
-          op = op_sbw;
-          break;
-        case 12:
-          op = op_div;
-          break;
-        case 16:
-          op = op_callothersubr;
-          break;
-        case 17:
-          op = op_pop;
-          break;
-        case 33:
-          op = op_setcurrentpoint;
-          break;
-
-        default:
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " invalid escape (12+%d)\n",
-                     ip[-1] ));
-          goto Syntax_Error;
-        }
-        break;
-
-      case 255:    /* four bytes integer */
-        if ( ip + 4 > limit )
-        {
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " 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 )
-        {
-          if ( large_int )
-          {
-            FT_ERROR(( "t1_decoder_parse_charstrings:"
-                       " no `div' after large integer\n" ));
-          }
-          else
-            large_int = TRUE;
-        }
-        else
-        {
-          if ( !large_int )
-            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_charstrings:"
-                         " 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 );
-          }
-
-          if ( !large_int )
-            value = (FT_Int32)( (FT_UInt32)value << 16 );
-        }
-        else
-        {
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " invalid byte (%d)\n", ip[-1] ));
-          goto Syntax_Error;
-        }
-      }
-
-      if ( unknown_othersubr_result_cnt > 0 )
-      {
-        switch ( op )
-        {
-        case op_callsubr:
-        case op_return:
-        case op_none:
-        case op_pop:
-          break;
-
-        default:
-          /* all operands have been transferred by previous pops */
-          unknown_othersubr_result_cnt = 0;
-          break;
-        }
-      }
-
-      if ( large_int && !( op == op_none || op == op_div ) )
-      {
-        FT_ERROR(( "t1_decoder_parse_charstrings:"
-                   " no `div' after large integer\n" ));
-
-        large_int = FALSE;
-      }
-
-      /*********************************************************************/
-      /*                                                                   */
-      /*  Push value on stack, or process operator                         */
-      /*                                                                   */
-      /*                                                                   */
-      if ( op == op_none )
-      {
-        if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS )
-        {
-          FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" ));
-          goto Syntax_Error;
-        }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( large_int )
-          FT_TRACE4(( " %d", value ));
-        else
-          FT_TRACE4(( " %d", value / 65536 ));
-#endif
-
-        *top++       = value;
-        decoder->top = top;
-      }
-      else if ( op == op_callothersubr )  /* callothersubr */
-      {
-        FT_Int  subr_no;
-        FT_Int  arg_cnt;
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        FT_TRACE4(( " callothersubr\n" ));
-        bol = TRUE;
-#endif
-
-        if ( top - decoder->stack < 2 )
-          goto Stack_Underflow;
-
-        top -= 2;
-
-        subr_no = Fix2Int( top[1] );
-        arg_cnt = Fix2Int( top[0] );
-
-        /***********************************************************/
-        /*                                                         */
-        /* 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                              */
-
-        if ( arg_cnt > top - decoder->stack )
-          goto Stack_Underflow;
-
-        top -= arg_cnt;
-
-        known_othersubr_result_cnt   = 0;
-        unknown_othersubr_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 ( !decoder->flex_state           ||
-               decoder->num_flex_vectors != 7 )
-          {
-            FT_ERROR(( "t1_decoder_parse_charstrings:"
-                       " unexpected flex end\n" ));
-            goto Syntax_Error;
-          }
-
-          /* the two `results' are popped by the following setcurrentpoint */
-          top[0] = x;
-          top[1] = y;
-          known_othersubr_result_cnt = 2;
-          break;
-
-        case 1:                     /* start flex feature */
-          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;
-          break;
-
-        case 2:                     /* add flex vectors */
-          {
-            FT_Int  idx;
-
-
-            if ( arg_cnt != 0 )
-              goto Unexpected_OtherSubr;
-
-            if ( !decoder->flex_state )
-            {
-              FT_ERROR(( "t1_decoder_parse_charstrings:"
-                         " missing flex start\n" ));
-              goto Syntax_Error;
-            }
-
-            /* 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 )
-              t1_builder_add_point( builder,
-                                    x,
-                                    y,
-                                    (FT_Byte)( idx == 3 || idx == 6 ) );
-          }
-          break;
-
-        case 3:                     /* change hints */
-          if ( arg_cnt != 1 )
-            goto Unexpected_OtherSubr;
-
-          known_othersubr_result_cnt = 1;
-
-          if ( hinter )
-            hinter->reset( hinter->hints,
-                           (FT_UInt)builder->current->n_points );
-          break;
-
-        case 12:
-        case 13:
-          /* counter control hints, clear stack */
-          top = decoder->stack;
-          break;
-
-        case 14:
-        case 15:
-        case 16:
-        case 17:
-        case 18:                    /* multiple masters */
-          {
-            PS_Blend  blend = decoder->blend;
-            FT_UInt   num_points, nn, mm;
-            FT_Long*  delta;
-            FT_Long*  values;
-
-
-            if ( !blend )
-            {
-              FT_ERROR(( "t1_decoder_parse_charstrings:"
-                         " unexpected multiple masters operator\n" ));
-              goto Syntax_Error;
-            }
-
-            num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 );
-            if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) )
-            {
-              FT_ERROR(( "t1_decoder_parse_charstrings:"
-                         " incorrect number of multiple masters arguments\n" ));
-              goto Syntax_Error;
-            }
-
-            /* 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  = top + num_points;
-            values = top;
-            for ( nn = 0; nn < num_points; nn++ )
-            {
-              FT_Long  tmp = values[0];
-
-
-              for ( mm = 1; mm < blend->num_designs; mm++ )
-                tmp += FT_MulFix( *delta++, blend->weight_vector[mm] );
-
-              *values++ = tmp;
-            }
-
-            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 = Fix2Int( top[0] );
-
-            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 */
-          if ( arg_cnt != 2 )
-            goto Unexpected_OtherSubr;
-
-          top[0] += top[1]; /* XXX (over|under)flow */
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        case 21:
-          /* <arg1> <arg2> 2 21 callothersubr pop   */
-          /* ==> push <arg1> - <arg2> onto T1 stack */
-          if ( arg_cnt != 2 )
-            goto Unexpected_OtherSubr;
-
-          top[0] -= top[1]; /* XXX (over|under)flow */
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        case 22:
-          /* <arg1> <arg2> 2 22 callothersubr pop   */
-          /* ==> push <arg1> * <arg2> onto T1 stack */
-          if ( arg_cnt != 2 )
-            goto Unexpected_OtherSubr;
-
-          top[0] = FT_MulFix( top[0], top[1] );
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        case 23:
-          /* <arg1> <arg2> 2 23 callothersubr pop   */
-          /* ==> push <arg1> / <arg2> onto T1 stack */
-          if ( arg_cnt != 2 || top[1] == 0 )
-            goto Unexpected_OtherSubr;
-
-          top[0] = FT_DivFix( top[0], top[1] );
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        case 24:
-          /* <val> <idx> 2 24 callothersubr               */
-          /* ==> set BuildCharArray[cvi( <idx> )] = <val> */
-          {
-            FT_Int    idx;
-            PS_Blend  blend = decoder->blend;
-
-
-            if ( arg_cnt != 2 || !blend )
-              goto Unexpected_OtherSubr;
-
-            idx = Fix2Int( top[1] );
-
-            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
-              goto Unexpected_OtherSubr;
-
-            decoder->buildchar[idx] = top[0];
-          }
-          break;
-
-        case 25:
-          /* <idx> 1 25 callothersubr pop        */
-          /* ==> push BuildCharArray[cvi( idx )] */
-          /*     onto T1 stack                   */
-          {
-            FT_Int    idx;
-            PS_Blend  blend = decoder->blend;
-
-
-            if ( arg_cnt != 1 || !blend )
-              goto Unexpected_OtherSubr;
-
-            idx = Fix2Int( top[0] );
-
-            if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar )
-              goto Unexpected_OtherSubr;
-
-            top[0] = 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 (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>                          */
-          if ( arg_cnt != 4 )
-            goto Unexpected_OtherSubr;
-
-          if ( top[2] > top[3] )
-            top[0] = top[1];
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        case 28:
-          /* 0 28 callothersubr pop                               */
-          /* => push random value from interval [0, 1) onto stack */
-          if ( arg_cnt != 0 )
-            goto Unexpected_OtherSubr;
-
-          {
-            FT_Fixed  Rand;
-
-
-            Rand = seed;
-            if ( Rand >= 0x8000L )
-              Rand++;
-
-            top[0] = Rand;
-
-            seed = FT_MulFix( seed, 0x10000L - seed );
-            if ( seed == 0 )
-              seed += 0x2873;
-          }
-
-          known_othersubr_result_cnt = 1;
-          break;
-
-        default:
-          if ( arg_cnt >= 0 && subr_no >= 0 )
-          {
-            FT_ERROR(( "t1_decoder_parse_charstrings:"
-                       " unknown othersubr [%d %d], wish me luck\n",
-                       arg_cnt, subr_no ));
-            unknown_othersubr_result_cnt = arg_cnt;
-            break;
-          }
-          /* fall through */
-
-        Unexpected_OtherSubr:
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " invalid othersubr [%d %d]\n", arg_cnt, subr_no ));
-          goto Syntax_Error;
-        }
-
-        top += known_othersubr_result_cnt;
-
-        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;
-
-        /* XXX Operators usually take their operands from the        */
-        /*     bottom of the stack, i.e., the operands are           */
-        /*     decoder->stack[0], ..., decoder->stack[num_args - 1]; */
-        /*     only div, callsubr, and callothersubr are different.  */
-        /*     In practice it doesn't matter (?).                    */
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-        switch ( op )
-        {
-        case op_callsubr:
-        case op_div:
-        case op_callothersubr:
-        case op_pop:
-        case op_return:
-          break;
-
-        default:
-          if ( top - decoder->stack != num_args )
-            FT_TRACE0(( "t1_decoder_parse_charstrings:"
-                        " too much operands on the stack"
-                        " (seen %d, expected %d)\n",
-                        top - decoder->stack, num_args ));
-            break;
-        }
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-        top -= num_args;
-
-        switch ( op )
-        {
-        case op_endchar:
-          FT_TRACE4(( " endchar\n" ));
-
-          t1_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 );
-
-          /* the compiler should optimize away this empty loop but ... */
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-          if ( decoder->len_buildchar > 0 )
-          {
-            FT_UInt  i;
-
-
-            FT_TRACE4(( "BuildCharArray = [ " ));
-
-            for ( i = 0; i < decoder->len_buildchar; i++ )
-              FT_TRACE4(( "%d ", decoder->buildchar[i] ));
-
-            FT_TRACE4(( "]\n" ));
-          }
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-          FT_TRACE4(( "\n" ));
-
-          /* return now! */
-          return FT_Err_Ok;
-
-        case op_hsbw:
-          FT_TRACE4(( " hsbw" ));
-
-          builder->parse_state = T1_Parse_Have_Width;
-
-          builder->left_bearing.x += top[0];
-          builder->advance.x       = top[1];
-          builder->advance.y       = 0;
-
-          orig_x = x = builder->pos_x + top[0];
-          orig_y = y = builder->pos_y;
-
-          FT_UNUSED( orig_y );
-
-          /* 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 )
-            return FT_Err_Ok;
-
-          break;
-
-        case op_seac:
-          return t1operator_seac( decoder,
-                                  top[0],
-                                  top[1],
-                                  top[2],
-                                  Fix2Int( top[3] ),
-                                  Fix2Int( top[4] ) );
-
-        case op_sbw:
-          FT_TRACE4(( " sbw" ));
-
-          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];
-
-          x = builder->pos_x + top[0];
-          y = 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   */
-          /* rest of it; so exit immediately                           */
-          if ( builder->metrics_only )
-            return FT_Err_Ok;
-
-          break;
-
-        case op_closepath:
-          FT_TRACE4(( " closepath" ));
-
-          /* if there is no path, `closepath' is a no-op */
-          if ( builder->parse_state == T1_Parse_Have_Path   ||
-               builder->parse_state == T1_Parse_Have_Moveto )
-            t1_builder_close_contour( builder );
-
-          builder->parse_state = T1_Parse_Have_Width;
-          break;
-
-        case op_hlineto:
-          FT_TRACE4(( " hlineto" ));
-
-          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
-            goto Fail;
-
-          x += top[0];
-          goto Add_Line;
-
-        case op_hmoveto:
-          FT_TRACE4(( " hmoveto" ));
-
-          x += top[0];
-          if ( !decoder->flex_state )
-          {
-            if ( builder->parse_state == T1_Parse_Start )
-              goto Syntax_Error;
-            builder->parse_state = T1_Parse_Have_Moveto;
-          }
-          break;
-
-        case op_hvcurveto:
-          FT_TRACE4(( " hvcurveto" ));
-
-          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];
-          t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
-          t1_builder_add_point( builder, x, y, 0 );
-          y += top[3];
-          t1_builder_add_point( builder, x, y, 1 );
-          break;
-
-        case op_rlineto:
-          FT_TRACE4(( " rlineto" ));
-
-          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
-            goto Fail;
-
-          x += top[0];
-          y += top[1];
-
-        Add_Line:
-          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];
-          if ( !decoder->flex_state )
-          {
-            if ( builder->parse_state == T1_Parse_Start )
-              goto Syntax_Error;
-            builder->parse_state = T1_Parse_Have_Moveto;
-          }
-          break;
-
-        case op_rrcurveto:
-          FT_TRACE4(( " rrcurveto" ));
-
-          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];
-          t1_builder_add_point( builder, x, y, 0 );
-
-          x += top[2];
-          y += top[3];
-          t1_builder_add_point( builder, x, y, 0 );
-
-          x += top[4];
-          y += top[5];
-          t1_builder_add_point( builder, x, y, 1 );
-          break;
-
-        case op_vhcurveto:
-          FT_TRACE4(( " vhcurveto" ));
-
-          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];
-          t1_builder_add_point( builder, x, y, 0 );
-          x += top[1];
-          y += top[2];
-          t1_builder_add_point( builder, x, y, 0 );
-          x += top[3];
-          t1_builder_add_point( builder, x, y, 1 );
-          break;
-
-        case op_vlineto:
-          FT_TRACE4(( " vlineto" ));
-
-          if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) )
-            goto Fail;
-
-          y += top[0];
-          goto Add_Line;
-
-        case op_vmoveto:
-          FT_TRACE4(( " vmoveto" ));
-
-          y += top[0];
-          if ( !decoder->flex_state )
-          {
-            if ( builder->parse_state == T1_Parse_Start )
-              goto Syntax_Error;
-            builder->parse_state = T1_Parse_Have_Moveto;
-          }
-          break;
-
-        case op_div:
-          FT_TRACE4(( " div" ));
-
-          /* if `large_int' is set, we divide unscaled numbers; */
-          /* otherwise, we divide numbers in 16.16 format --    */
-          /* in both cases, it is the same operation            */
-          *top = FT_DivFix( top[0], top[1] );
-          top++;
-
-          large_int = FALSE;
-          break;
-
-        case op_callsubr:
-          {
-            FT_Int  idx;
-
-
-            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:"
-                         " invalid subrs index\n" ));
-              goto Syntax_Error;
-            }
-
-            if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS )
-            {
-              FT_ERROR(( "t1_decoder_parse_charstrings:"
-                         " too many nested subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            zone->cursor = ip;  /* save current instruction pointer */
-
-            zone++;
-
-            /* 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.          */
-            zone->base = decoder->subrs[idx];
-
-            if ( decoder->subrs_len )
-              zone->limit = zone->base + decoder->subrs_len[idx];
-            else
-            {
-              /* We are using subroutines from a CID font.  We must adjust */
-              /* for the seed bytes.                                       */
-              zone->base  += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 );
-              zone->limit  = decoder->subrs[idx + 1];
-            }
-
-            zone->cursor = zone->base;
-
-            if ( !zone->base )
-            {
-              FT_ERROR(( "t1_decoder_parse_charstrings:"
-                         " invoking empty subrs\n" ));
-              goto Syntax_Error;
-            }
-
-            decoder->zone = zone;
-            ip            = zone->base;
-            limit         = zone->limit;
-            break;
-          }
-
-        case op_pop:
-          FT_TRACE4(( " pop" ));
-
-          if ( known_othersubr_result_cnt > 0 )
-          {
-            known_othersubr_result_cnt--;
-            /* ignore, we pushed the operands ourselves */
-            break;
-          }
-
-          if ( unknown_othersubr_result_cnt == 0 )
-          {
-            FT_ERROR(( "t1_decoder_parse_charstrings:"
-                       " no more operands for othersubr\n" ));
-            goto Syntax_Error;
-          }
-
-          unknown_othersubr_result_cnt--;
-          top++;   /* `push' the operand to callothersubr onto the stack */
-          break;
-
-        case op_return:
-          FT_TRACE4(( " return" ));
-
-          if ( zone <= decoder->zones )
-          {
-            FT_ERROR(( "t1_decoder_parse_charstrings:"
-                       " unexpected return\n" ));
-            goto Syntax_Error;
-          }
-
-          zone--;
-          ip            = zone->cursor;
-          limit         = zone->limit;
-          decoder->zone = zone;
-          break;
-
-        case op_dotsection:
-          FT_TRACE4(( " dotsection" ));
-
-          break;
-
-        case op_hstem:
-          FT_TRACE4(( " hstem" ));
-
-          /* record horizontal hint */
-          if ( hinter )
-          {
-            /* top[0] += builder->left_bearing.y; */
-            hinter->stem( hinter->hints, 1, top );
-          }
-          break;
-
-        case op_hstem3:
-          FT_TRACE4(( " hstem3" ));
-
-          /* record horizontal counter-controlled hints */
-          if ( hinter )
-            hinter->stem3( hinter->hints, 1, top );
-          break;
-
-        case op_vstem:
-          FT_TRACE4(( " vstem" ));
-
-          /* record vertical hint */
-          if ( hinter )
-          {
-            top[0] += orig_x;
-            hinter->stem( hinter->hints, 0, top );
-          }
-          break;
-
-        case op_vstem3:
-          FT_TRACE4(( " vstem3" ));
-
-          /* record vertical counter-controlled hints */
-          if ( hinter )
-          {
-            FT_Pos  dx = orig_x;
-
-
-            top[0] += dx;
-            top[2] += dx;
-            top[4] += dx;
-            hinter->stem3( hinter->hints, 0, top );
-          }
-          break;
-
-        case op_setcurrentpoint:
-          FT_TRACE4(( " setcurrentpoint" ));
-
-          /* 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(( "t1_decoder_parse_charstrings:"
-                       " unexpected `setcurrentpoint'\n" ));
-            goto Syntax_Error;
-          }
-          else
-            ...
-#endif
-
-          x = top[0];
-          y = top[1];
-          decoder->flex_state = 0;
-          break;
-
-        case op_unknown15:
-          FT_TRACE4(( " opcode_15" ));
-          /* nothing to do except to pop the two arguments */
-          break;
-
-        default:
-          FT_ERROR(( "t1_decoder_parse_charstrings:"
-                     " unhandled opcode %d\n", op ));
-          goto Syntax_Error;
-        }
-
-        /* XXX Operators usually clear the operand stack;  */
-        /*     only div, callsubr, callothersubr, pop, and */
-        /*     return are different.                       */
-        /*     In practice it doesn't matter (?).          */
-
-        decoder->top = top;
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        FT_TRACE4(( "\n" ));
-        bol = TRUE;
-#endif
-
-      } /* general operator processing */
-
-    } /* while ip < limit */
-
-    FT_TRACE4(( "..end..\n\n" ));
-
-  Fail:
-    return error;
-
-  Syntax_Error:
-    return FT_THROW( Syntax_Error );
-
-  Stack_Underflow:
-    return FT_THROW( Stack_Underflow );
-  }
-
-
-  /* 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 );
-  }
-
-
-  /* initialize T1 decoder */
-  FT_LOCAL_DEF( FT_Error )
-  t1_decoder_init( T1_Decoder           decoder,
-                   FT_Face              face,
-                   FT_Size              size,
-                   FT_GlyphSlot         slot,
-                   FT_Byte**            glyph_names,
-                   PS_Blend             blend,
-                   FT_Bool              hinting,
-                   FT_Render_Mode       hint_mode,
-                   T1_Decoder_Callback  parse_callback )
-  {
-    FT_ZERO( decoder );
-
-    /* retrieve PSNames interface from list of current modules */
-    {
-      FT_Service_PsCMaps  psnames;
-
-
-      FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
-      if ( !psnames )
-      {
-        FT_ERROR(( "t1_decoder_init:"
-                   " the `psnames' module is not available\n" ));
-        return FT_THROW( Unimplemented_Feature );
-      }
-
-      decoder->psnames = psnames;
-    }
-
-    t1_builder_init( &decoder->builder, face, size, slot, hinting );
-
-    /* decoder->buildchar and decoder->len_buildchar have to be  */
-    /* initialized by the caller since we cannot know the length */
-    /* of the BuildCharArray                                     */
-
-    decoder->num_glyphs     = (FT_UInt)face->num_glyphs;
-    decoder->glyph_names    = glyph_names;
-    decoder->hint_mode      = hint_mode;
-    decoder->blend          = blend;
-    decoder->parse_callback = parse_callback;
-
-    decoder->funcs          = t1_decoder_funcs;
-
-    return FT_Err_Ok;
-  }
-
-
-  /* finalize T1 decoder */
-  FT_LOCAL_DEF( void )
-  t1_decoder_done( T1_Decoder  decoder )
-  {
-    t1_builder_done( &decoder->builder );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/psaux/t1decode.h b/third_party/freetype/src/psaux/t1decode.h
deleted file mode 100644
index 12c27de..0000000
--- a/third_party/freetype/src/psaux/t1decode.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1decode.h                                                             */
-/*                                                                         */
-/*    PostScript Type 1 decoding routines (specification).                 */
-/*                                                                         */
-/*  Copyright 2000-2017 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 T1DECODE_H_
-#define T1DECODE_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_CALLBACK_TABLE
-  const T1_Decoder_FuncsRec  t1_decoder_funcs;
-
-
-  FT_LOCAL( FT_Error )
-  t1_decoder_parse_glyph( T1_Decoder  decoder,
-                          FT_UInt     glyph_index );
-
-  FT_LOCAL( FT_Error )
-  t1_decoder_parse_charstrings( T1_Decoder  decoder,
-                                FT_Byte*    base,
-                                FT_UInt     len );
-
-  FT_LOCAL( FT_Error )
-  t1_decoder_init( T1_Decoder           decoder,
-                   FT_Face              face,
-                   FT_Size              size,
-                   FT_GlyphSlot         slot,
-                   FT_Byte**            glyph_names,
-                   PS_Blend             blend,
-                   FT_Bool              hinting,
-                   FT_Render_Mode       hint_mode,
-                   T1_Decoder_Callback  parse_glyph );
-
-  FT_LOCAL( void )
-  t1_decoder_done( T1_Decoder  decoder );
-
-
-FT_END_HEADER
-
-#endif /* T1DECODE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshalgo.c b/third_party/freetype/src/pshinter/pshalgo.c
deleted file mode 100644
index 9ad1a3a..0000000
--- a/third_party/freetype/src/pshinter/pshalgo.c
+++ /dev/null
@@ -1,2195 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshalgo.c                                                              */
-/*                                                                         */
-/*    PostScript hinting algorithm (body).                                 */
-/*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used        */
-/*  modified and distributed under the terms of the FreeType project       */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_CALC_H
-#include "pshalgo.h"
-
-#include "pshnterr.h"
-
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_pshalgo2
-
-
-#ifdef DEBUG_HINTER
-  PSH_Hint_Table  ps_debug_hint_table = NULL;
-  PSH_HintFunc    ps_debug_hint_func  = NULL;
-  PSH_Glyph       ps_debug_glyph      = NULL;
-#endif
-
-
-#define  COMPUTE_INFLEXS  /* compute inflection points to optimize `S' */
-                          /* and similar glyphs                        */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                  BASIC HINTS RECORDINGS                       *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* return true if two stem hints overlap */
-  static FT_Int
-  psh_hint_overlap( PSH_Hint  hint1,
-                    PSH_Hint  hint2 )
-  {
-    return hint1->org_pos + hint1->org_len >= hint2->org_pos &&
-           hint2->org_pos + hint2->org_len >= hint1->org_pos;
-  }
-
-
-  /* destroy hints table */
-  static void
-  psh_hint_table_done( PSH_Hint_Table  table,
-                       FT_Memory       memory )
-  {
-    FT_FREE( table->zones );
-    table->num_zones = 0;
-    table->zone      = NULL;
-
-    FT_FREE( table->sort );
-    FT_FREE( table->hints );
-    table->num_hints   = 0;
-    table->max_hints   = 0;
-    table->sort_global = NULL;
-  }
-
-
-  /* deactivate all hints in a table */
-  static void
-  psh_hint_table_deactivate( PSH_Hint_Table  table )
-  {
-    FT_UInt   count = table->max_hints;
-    PSH_Hint  hint  = table->hints;
-
-
-    for ( ; count > 0; count--, hint++ )
-    {
-      psh_hint_deactivate( hint );
-      hint->order = -1;
-    }
-  }
-
-
-  /* internal function to record a new hint */
-  static void
-  psh_hint_table_record( PSH_Hint_Table  table,
-                         FT_UInt         idx )
-  {
-    PSH_Hint  hint = table->hints + idx;
-
-
-    if ( idx >= table->max_hints )
-    {
-      FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx ));
-      return;
-    }
-
-    /* ignore active hints */
-    if ( psh_hint_is_active( hint ) )
-      return;
-
-    psh_hint_activate( hint );
-
-    /* now scan the current active hint set to check */
-    /* whether `hint' overlaps with another hint     */
-    {
-      PSH_Hint*  sorted = table->sort_global;
-      FT_UInt    count  = table->num_hints;
-      PSH_Hint   hint2;
-
-
-      hint->parent = NULL;
-      for ( ; count > 0; count--, sorted++ )
-      {
-        hint2 = sorted[0];
-
-        if ( psh_hint_overlap( hint, hint2 ) )
-        {
-          hint->parent = hint2;
-          break;
-        }
-      }
-    }
-
-    if ( table->num_hints < table->max_hints )
-      table->sort_global[table->num_hints++] = hint;
-    else
-      FT_TRACE0(( "psh_hint_table_record: too many sorted hints!  BUG!\n" ));
-  }
-
-
-  static void
-  psh_hint_table_record_mask( PSH_Hint_Table  table,
-                              PS_Mask         hint_mask )
-  {
-    FT_Int    mask = 0, val = 0;
-    FT_Byte*  cursor = hint_mask->bytes;
-    FT_UInt   idx, limit;
-
-
-    limit = hint_mask->num_bits;
-
-    for ( idx = 0; idx < limit; idx++ )
-    {
-      if ( mask == 0 )
-      {
-        val  = *cursor++;
-        mask = 0x80;
-      }
-
-      if ( val & mask )
-        psh_hint_table_record( table, idx );
-
-      mask >>= 1;
-    }
-  }
-
-
-  /* create hints table */
-  static FT_Error
-  psh_hint_table_init( PSH_Hint_Table  table,
-                       PS_Hint_Table   hints,
-                       PS_Mask_Table   hint_masks,
-                       PS_Mask_Table   counter_masks,
-                       FT_Memory       memory )
-  {
-    FT_UInt   count;
-    FT_Error  error;
-
-    FT_UNUSED( counter_masks );
-
-
-    count = hints->num_hints;
-
-    /* allocate our tables */
-    if ( FT_NEW_ARRAY( table->sort,  2 * count     ) ||
-         FT_NEW_ARRAY( table->hints,     count     ) ||
-         FT_NEW_ARRAY( table->zones, 2 * count + 1 ) )
-      goto Exit;
-
-    table->max_hints   = count;
-    table->sort_global = table->sort + count;
-    table->num_hints   = 0;
-    table->num_zones   = 0;
-    table->zone        = NULL;
-
-    /* initialize the `table->hints' array */
-    {
-      PSH_Hint  write = table->hints;
-      PS_Hint   read  = hints->hints;
-
-
-      for ( ; count > 0; count--, write++, read++ )
-      {
-        write->org_pos = read->pos;
-        write->org_len = read->len;
-        write->flags   = read->flags;
-      }
-    }
-
-    /* we now need to determine the initial `parent' stems; first  */
-    /* activate the hints that are given by the initial hint masks */
-    if ( hint_masks )
-    {
-      PS_Mask  mask = hint_masks->masks;
-
-
-      count             = hint_masks->num_masks;
-      table->hint_masks = hint_masks;
-
-      for ( ; count > 0; count--, mask++ )
-        psh_hint_table_record_mask( table, mask );
-    }
-
-    /* finally, do a linear parse in case some hints were left alone */
-    if ( table->num_hints != table->max_hints )
-    {
-      FT_UInt  idx;
-
-
-      FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" ));
-
-      count = table->max_hints;
-      for ( idx = 0; idx < count; idx++ )
-        psh_hint_table_record( table, idx );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  psh_hint_table_activate_mask( PSH_Hint_Table  table,
-                                PS_Mask         hint_mask )
-  {
-    FT_Int    mask = 0, val = 0;
-    FT_Byte*  cursor = hint_mask->bytes;
-    FT_UInt   idx, limit, count;
-
-
-    limit = hint_mask->num_bits;
-    count = 0;
-
-    psh_hint_table_deactivate( table );
-
-    for ( idx = 0; idx < limit; idx++ )
-    {
-      if ( mask == 0 )
-      {
-        val  = *cursor++;
-        mask = 0x80;
-      }
-
-      if ( val & mask )
-      {
-        PSH_Hint  hint = &table->hints[idx];
-
-
-        if ( !psh_hint_is_active( hint ) )
-        {
-          FT_UInt     count2;
-
-#if 0
-          PSH_Hint*  sort = table->sort;
-          PSH_Hint   hint2;
-
-
-          for ( count2 = count; count2 > 0; count2--, sort++ )
-          {
-            hint2 = sort[0];
-            if ( psh_hint_overlap( hint, hint2 ) )
-              FT_TRACE0(( "psh_hint_table_activate_mask:"
-                          " found overlapping hints\n" ))
-          }
-#else
-          count2 = 0;
-#endif
-
-          if ( count2 == 0 )
-          {
-            psh_hint_activate( hint );
-            if ( count < table->max_hints )
-              table->sort[count++] = hint;
-            else
-              FT_TRACE0(( "psh_hint_tableactivate_mask:"
-                          " too many active hints\n" ));
-          }
-        }
-      }
-
-      mask >>= 1;
-    }
-    table->num_hints = count;
-
-    /* now, sort the hints; they are guaranteed to not overlap */
-    /* so we can compare their "org_pos" field directly        */
-    {
-      FT_Int     i1, i2;
-      PSH_Hint   hint1, hint2;
-      PSH_Hint*  sort = table->sort;
-
-
-      /* a simple bubble sort will do, since in 99% of cases, the hints */
-      /* will be already sorted -- and the sort will be linear          */
-      for ( i1 = 1; i1 < (FT_Int)count; i1++ )
-      {
-        hint1 = sort[i1];
-        for ( i2 = i1 - 1; i2 >= 0; i2-- )
-        {
-          hint2 = sort[i2];
-
-          if ( hint2->org_pos < hint1->org_pos )
-            break;
-
-          sort[i2 + 1] = hint2;
-          sort[i2]     = hint1;
-        }
-      }
-    }
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****               HINTS GRID-FITTING AND OPTIMIZATION             *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#if 1
-  static FT_Pos
-  psh_dimension_quantize_len( PSH_Dimension  dim,
-                              FT_Pos         len,
-                              FT_Bool        do_snapping )
-  {
-    if ( len <= 64 )
-      len = 64;
-    else
-    {
-      FT_Pos  delta = len - dim->stdw.widths[0].cur;
-
-
-      if ( delta < 0 )
-        delta = -delta;
-
-      if ( delta < 40 )
-      {
-        len = dim->stdw.widths[0].cur;
-        if ( len < 48 )
-          len = 48;
-      }
-
-      if ( len < 3 * 64 )
-      {
-        delta = ( len & 63 );
-        len  &= -64;
-
-        if ( delta < 10 )
-          len += delta;
-
-        else if ( delta < 32 )
-          len += 10;
-
-        else if ( delta < 54 )
-          len += 54;
-
-        else
-          len += delta;
-      }
-      else
-        len = FT_PIX_ROUND( len );
-    }
-
-    if ( do_snapping )
-      len = FT_PIX_ROUND( len );
-
-    return  len;
-  }
-#endif /* 0 */
-
-
-#ifdef DEBUG_HINTER
-
-  static void
-  ps_simple_scale( PSH_Hint_Table  table,
-                   FT_Fixed        scale,
-                   FT_Fixed        delta,
-                   FT_Int          dimension )
-  {
-    FT_UInt  count;
-
-
-    for ( count = 0; count < table->max_hints; count++ )
-    {
-      PSH_Hint  hint = table->hints + count;
-
-
-      hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta;
-      hint->cur_len = FT_MulFix( hint->org_len, scale );
-
-      if ( ps_debug_hint_func )
-        ps_debug_hint_func( hint, dimension );
-    }
-  }
-
-#endif /* DEBUG_HINTER */
-
-
-  static FT_Fixed
-  psh_hint_snap_stem_side_delta( FT_Fixed  pos,
-                                 FT_Fixed  len )
-  {
-    FT_Fixed  delta1 = FT_PIX_ROUND( pos ) - pos;
-    FT_Fixed  delta2 = FT_PIX_ROUND( pos + len ) - pos - len;
-
-
-    if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) )
-      return delta1;
-    else
-      return delta2;
-  }
-
-
-  static void
-  psh_hint_align( PSH_Hint     hint,
-                  PSH_Globals  globals,
-                  FT_Int       dimension,
-                  PSH_Glyph    glyph )
-  {
-    PSH_Dimension  dim   = &globals->dimension[dimension];
-    FT_Fixed       scale = dim->scale_mult;
-    FT_Fixed       delta = dim->scale_delta;
-
-
-    if ( !psh_hint_is_fitted( hint ) )
-    {
-      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
-      FT_Pos  len = FT_MulFix( hint->org_len, scale );
-
-      FT_Int            do_snapping;
-      FT_Pos            fit_len;
-      PSH_AlignmentRec  align;
-
-
-      /* ignore stem alignments when requested through the hint flags */
-      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
-           ( dimension == 1 && !glyph->do_vert_hints ) )
-      {
-        hint->cur_pos = pos;
-        hint->cur_len = len;
-
-        psh_hint_set_fitted( hint );
-        return;
-      }
-
-      /* perform stem snapping when requested - this is necessary
-       * for monochrome and LCD hinting modes only
-       */
-      do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) ||
-                    ( dimension == 1 && glyph->do_vert_snapping );
-
-      hint->cur_len = fit_len = len;
-
-      /* check blue zones for horizontal stems */
-      align.align     = PSH_BLUE_ALIGN_NONE;
-      align.align_bot = align.align_top = 0;
-
-      if ( dimension == 1 )
-        psh_blues_snap_stem( &globals->blues,
-                             hint->org_pos + hint->org_len,
-                             hint->org_pos,
-                             &align );
-
-      switch ( align.align )
-      {
-      case PSH_BLUE_ALIGN_TOP:
-        /* the top of the stem is aligned against a blue zone */
-        hint->cur_pos = align.align_top - fit_len;
-        break;
-
-      case PSH_BLUE_ALIGN_BOT:
-        /* the bottom of the stem is aligned against a blue zone */
-        hint->cur_pos = align.align_bot;
-        break;
-
-      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
-        /* both edges of the stem are aligned against blue zones */
-        hint->cur_pos = align.align_bot;
-        hint->cur_len = align.align_top - align.align_bot;
-        break;
-
-      default:
-        {
-          PSH_Hint  parent = hint->parent;
-
-
-          if ( parent )
-          {
-            FT_Pos  par_org_center, par_cur_center;
-            FT_Pos  cur_org_center, cur_delta;
-
-
-            /* ensure that parent is already fitted */
-            if ( !psh_hint_is_fitted( parent ) )
-              psh_hint_align( parent, globals, dimension, glyph );
-
-            /* keep original relation between hints, this is, use the */
-            /* scaled distance between the centers of the hints to    */
-            /* compute the new position                               */
-            par_org_center = parent->org_pos + ( parent->org_len >> 1 );
-            par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 );
-            cur_org_center = hint->org_pos   + ( hint->org_len   >> 1 );
-
-            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
-            pos       = par_cur_center + cur_delta - ( len >> 1 );
-          }
-
-          hint->cur_pos = pos;
-          hint->cur_len = fit_len;
-
-          /* Stem adjustment tries to snap stem widths to standard
-           * ones.  This is important to prevent unpleasant rounding
-           * artefacts.
-           */
-          if ( glyph->do_stem_adjust )
-          {
-            if ( len <= 64 )
-            {
-              /* the stem is less than one pixel; we will center it
-               * around the nearest pixel center
-               */
-              if ( len >= 32 )
-              {
-                /* This is a special case where we also widen the stem
-                 * and align it to the pixel grid.
-                 *
-                 *   stem_center          = pos + (len/2)
-                 *   nearest_pixel_center = FT_ROUND(stem_center-32)+32
-                 *   new_pos              = nearest_pixel_center-32
-                 *                        = FT_ROUND(stem_center-32)
-                 *                        = FT_FLOOR(stem_center-32+32)
-                 *                        = FT_FLOOR(stem_center)
-                 *   new_len              = 64
-                 */
-                pos = FT_PIX_FLOOR( pos + ( len >> 1 ) );
-                len = 64;
-              }
-              else if ( len > 0 )
-              {
-                /* This is a very small stem; we simply align it to the
-                 * pixel grid, trying to find the minimum displacement.
-                 *
-                 * left               = pos
-                 * right              = pos + len
-                 * left_nearest_edge  = ROUND(pos)
-                 * right_nearest_edge = ROUND(right)
-                 *
-                 * if ( ABS(left_nearest_edge - left) <=
-                 *      ABS(right_nearest_edge - right) )
-                 *    new_pos = left
-                 * else
-                 *    new_pos = right
-                 */
-                FT_Pos  left_nearest  = FT_PIX_ROUND( pos );
-                FT_Pos  right_nearest = FT_PIX_ROUND( pos + len );
-                FT_Pos  left_disp     = left_nearest - pos;
-                FT_Pos  right_disp    = right_nearest - ( pos + len );
-
-
-                if ( left_disp < 0 )
-                  left_disp = -left_disp;
-                if ( right_disp < 0 )
-                  right_disp = -right_disp;
-                if ( left_disp <= right_disp )
-                  pos = left_nearest;
-                else
-                  pos = right_nearest;
-              }
-              else
-              {
-                /* this is a ghost stem; we simply round it */
-                pos = FT_PIX_ROUND( pos );
-              }
-            }
-            else
-            {
-              len = psh_dimension_quantize_len( dim, len, 0 );
-            }
-          }
-
-          /* now that we have a good hinted stem width, try to position */
-          /* the stem along a pixel grid integer coordinate             */
-          hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len );
-          hint->cur_len = len;
-        }
-      }
-
-      if ( do_snapping )
-      {
-        pos = hint->cur_pos;
-        len = hint->cur_len;
-
-        if ( len < 64 )
-          len = 64;
-        else
-          len = FT_PIX_ROUND( len );
-
-        switch ( align.align )
-        {
-          case PSH_BLUE_ALIGN_TOP:
-            hint->cur_pos = align.align_top - len;
-            hint->cur_len = len;
-            break;
-
-          case PSH_BLUE_ALIGN_BOT:
-            hint->cur_len = len;
-            break;
-
-          case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP:
-            /* don't touch */
-            break;
-
-
-          default:
-            hint->cur_len = len;
-            if ( len & 64 )
-              pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32;
-            else
-              pos = FT_PIX_ROUND( pos + ( len >> 1 ) );
-
-            hint->cur_pos = pos - ( len >> 1 );
-            hint->cur_len = len;
-        }
-      }
-
-      psh_hint_set_fitted( hint );
-
-#ifdef DEBUG_HINTER
-      if ( ps_debug_hint_func )
-        ps_debug_hint_func( hint, dimension );
-#endif
-    }
-  }
-
-
-#if 0  /* not used for now, experimental */
-
- /*
-  *  A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT)
-  *  of stems
-  */
-  static void
-  psh_hint_align_light( PSH_Hint     hint,
-                        PSH_Globals  globals,
-                        FT_Int       dimension,
-                        PSH_Glyph    glyph )
-  {
-    PSH_Dimension  dim   = &globals->dimension[dimension];
-    FT_Fixed       scale = dim->scale_mult;
-    FT_Fixed       delta = dim->scale_delta;
-
-
-    if ( !psh_hint_is_fitted( hint ) )
-    {
-      FT_Pos  pos = FT_MulFix( hint->org_pos, scale ) + delta;
-      FT_Pos  len = FT_MulFix( hint->org_len, scale );
-
-      FT_Pos  fit_len;
-
-      PSH_AlignmentRec  align;
-
-
-      /* ignore stem alignments when requested through the hint flags */
-      if ( ( dimension == 0 && !glyph->do_horz_hints ) ||
-           ( dimension == 1 && !glyph->do_vert_hints ) )
-      {
-        hint->cur_pos = pos;
-        hint->cur_len = len;
-
-        psh_hint_set_fitted( hint );
-        return;
-      }
-
-      fit_len = len;
-
-      hint->cur_len = fit_len;
-
-      /* check blue zones for horizontal stems */
-      align.align = PSH_BLUE_ALIGN_NONE;
-      align.align_bot = align.align_top = 0;
-
-      if ( dimension == 1 )
-        psh_blues_snap_stem( &globals->blues,
-                             hint->org_pos + hint->org_len,
-                             hint->org_pos,
-                             &align );
-
-      switch ( align.align )
-      {
-      case PSH_BLUE_ALIGN_TOP:
-        /* the top of the stem is aligned against a blue zone */
-        hint->cur_pos = align.align_top - fit_len;
-        break;
-
-      case PSH_BLUE_ALIGN_BOT:
-        /* the bottom of the stem is aligned against a blue zone */
-        hint->cur_pos = align.align_bot;
-        break;
-
-      case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT:
-        /* both edges of the stem are aligned against blue zones */
-        hint->cur_pos = align.align_bot;
-        hint->cur_len = align.align_top - align.align_bot;
-        break;
-
-      default:
-        {
-          PSH_Hint  parent = hint->parent;
-
-
-          if ( parent )
-          {
-            FT_Pos  par_org_center, par_cur_center;
-            FT_Pos  cur_org_center, cur_delta;
-
-
-            /* ensure that parent is already fitted */
-            if ( !psh_hint_is_fitted( parent ) )
-              psh_hint_align_light( parent, globals, dimension, glyph );
-
-            par_org_center = parent->org_pos + ( parent->org_len / 2 );
-            par_cur_center = parent->cur_pos + ( parent->cur_len / 2 );
-            cur_org_center = hint->org_pos   + ( hint->org_len   / 2 );
-
-            cur_delta = FT_MulFix( cur_org_center - par_org_center, scale );
-            pos       = par_cur_center + cur_delta - ( len >> 1 );
-          }
-
-          /* Stems less than one pixel wide are easy -- we want to
-           * make them as dark as possible, so they must fall within
-           * one pixel.  If the stem is split between two pixels
-           * then snap the edge that is nearer to the pixel boundary
-           * to the pixel boundary.
-           */
-          if ( len <= 64 )
-          {
-            if ( ( pos + len + 63 ) / 64  != pos / 64 + 1 )
-              pos += psh_hint_snap_stem_side_delta ( pos, len );
-          }
-
-          /* Position stems other to minimize the amount of mid-grays.
-           * There are, in general, two positions that do this,
-           * illustrated as A) and B) below.
-           *
-           *   +                   +                   +                   +
-           *
-           * A)             |--------------------------------|
-           * B)   |--------------------------------|
-           * C)       |--------------------------------|
-           *
-           * Position A) (split the excess stem equally) should be better
-           * for stems of width N + f where f < 0.5.
-           *
-           * Position B) (split the deficiency equally) should be better
-           * for stems of width N + f where f > 0.5.
-           *
-           * It turns out though that minimizing the total number of lit
-           * pixels is also important, so position C), with one edge
-           * aligned with a pixel boundary is actually preferable
-           * to A).  There are also more possible positions for C) than
-           * for A) or B), so it involves less distortion of the overall
-           * character shape.
-           */
-          else /* len > 64 */
-          {
-            FT_Fixed  frac_len = len & 63;
-            FT_Fixed  center = pos + ( len >> 1 );
-            FT_Fixed  delta_a, delta_b;
-
-
-            if ( ( len / 64 ) & 1 )
-            {
-              delta_a = FT_PIX_FLOOR( center ) + 32 - center;
-              delta_b = FT_PIX_ROUND( center ) - center;
-            }
-            else
-            {
-              delta_a = FT_PIX_ROUND( center ) - center;
-              delta_b = FT_PIX_FLOOR( center ) + 32 - center;
-            }
-
-            /* We choose between B) and C) above based on the amount
-             * of fractional stem width; for small amounts, choose
-             * C) always, for large amounts, B) always, and inbetween,
-             * pick whichever one involves less stem movement.
-             */
-            if ( frac_len < 32 )
-            {
-              pos += psh_hint_snap_stem_side_delta ( pos, len );
-            }
-            else if ( frac_len < 48 )
-            {
-              FT_Fixed  side_delta = psh_hint_snap_stem_side_delta ( pos,
-                                                                     len );
-
-              if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) )
-                pos += side_delta;
-              else
-                pos += delta_b;
-            }
-            else
-            {
-              pos += delta_b;
-            }
-          }
-
-          hint->cur_pos = pos;
-        }
-      }  /* switch */
-
-      psh_hint_set_fitted( hint );
-
-#ifdef DEBUG_HINTER
-      if ( ps_debug_hint_func )
-        ps_debug_hint_func( hint, dimension );
-#endif
-    }
-  }
-
-#endif /* 0 */
-
-
-  static void
-  psh_hint_table_align_hints( PSH_Hint_Table  table,
-                              PSH_Globals     globals,
-                              FT_Int          dimension,
-                              PSH_Glyph       glyph )
-  {
-    PSH_Hint       hint;
-    FT_UInt        count;
-
-#ifdef DEBUG_HINTER
-
-    PSH_Dimension  dim   = &globals->dimension[dimension];
-    FT_Fixed       scale = dim->scale_mult;
-    FT_Fixed       delta = dim->scale_delta;
-
-
-    if ( ps_debug_no_vert_hints && dimension == 0 )
-    {
-      ps_simple_scale( table, scale, delta, dimension );
-      return;
-    }
-
-    if ( ps_debug_no_horz_hints && dimension == 1 )
-    {
-      ps_simple_scale( table, scale, delta, dimension );
-      return;
-    }
-
-#endif /* DEBUG_HINTER*/
-
-    hint  = table->hints;
-    count = table->max_hints;
-
-    for ( ; count > 0; count--, hint++ )
-      psh_hint_align( hint, globals, dimension, glyph );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                POINTS INTERPOLATION ROUTINES                  *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#define xxDEBUG_ZONES
-
-
-#ifdef DEBUG_ZONES
-
-#include FT_CONFIG_STANDARD_LIBRARY_H
-
-  static void
-  psh_print_zone( PSH_Zone  zone )
-  {
-    printf( "zone [scale,delta,min,max] = [%.5f,%.2f,%d,%d]\n",
-             zone->scale / 65536.0,
-             zone->delta / 64.0,
-             zone->min,
-             zone->max );
-  }
-
-#endif /* DEBUG_ZONES */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    HINTER GLYPH MANAGEMENT                    *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#define  psh_corner_is_flat      ft_corner_is_flat
-#define  psh_corner_orientation  ft_corner_orientation
-
-
-#ifdef COMPUTE_INFLEXS
-
-  /* compute all inflex points in a given glyph */
-  static void
-  psh_glyph_compute_inflections( PSH_Glyph  glyph )
-  {
-    FT_UInt  n;
-
-
-    for ( n = 0; n < glyph->num_contours; n++ )
-    {
-      PSH_Point  first, start, end, before, after;
-      FT_Pos     in_x, in_y, out_x, out_y;
-      FT_Int     orient_prev, orient_cur;
-      FT_Int     finished = 0;
-
-
-      /* we need at least 4 points to create an inflection point */
-      if ( glyph->contours[n].count < 4 )
-        continue;
-
-      /* compute first segment in contour */
-      first = glyph->contours[n].start;
-
-      start = end = first;
-      do
-      {
-        end = end->next;
-        if ( end == first )
-          goto Skip;
-
-        in_x = end->org_u - start->org_u;
-        in_y = end->org_v - start->org_v;
-
-      } while ( in_x == 0 && in_y == 0 );
-
-      /* extend the segment start whenever possible */
-      before = start;
-      do
-      {
-        do
-        {
-          start  = before;
-          before = before->prev;
-          if ( before == first )
-            goto Skip;
-
-          out_x = start->org_u - before->org_u;
-          out_y = start->org_v - before->org_v;
-
-        } while ( out_x == 0 && out_y == 0 );
-
-        orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
-      } while ( orient_prev == 0 );
-
-      first = start;
-      in_x  = out_x;
-      in_y  = out_y;
-
-      /* now, process all segments in the contour */
-      do
-      {
-        /* first, extend current segment's end whenever possible */
-        after = end;
-        do
-        {
-          do
-          {
-            end   = after;
-            after = after->next;
-            if ( after == first )
-              finished = 1;
-
-            out_x = after->org_u - end->org_u;
-            out_y = after->org_v - end->org_v;
-
-          } while ( out_x == 0 && out_y == 0 );
-
-          orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y );
-
-        } while ( orient_cur == 0 );
-
-        if ( ( orient_cur ^ orient_prev ) < 0 )
-        {
-          do
-          {
-            psh_point_set_inflex( start );
-            start = start->next;
-          }
-          while ( start != end );
-
-          psh_point_set_inflex( start );
-        }
-
-        start       = end;
-        end         = after;
-        orient_prev = orient_cur;
-        in_x        = out_x;
-        in_y        = out_y;
-
-      } while ( !finished );
-
-    Skip:
-      ;
-    }
-  }
-
-#endif /* COMPUTE_INFLEXS */
-
-
-  static void
-  psh_glyph_done( PSH_Glyph  glyph )
-  {
-    FT_Memory  memory = glyph->memory;
-
-
-    psh_hint_table_done( &glyph->hint_tables[1], memory );
-    psh_hint_table_done( &glyph->hint_tables[0], memory );
-
-    FT_FREE( glyph->points );
-    FT_FREE( glyph->contours );
-
-    glyph->num_points   = 0;
-    glyph->num_contours = 0;
-
-    glyph->memory = NULL;
-  }
-
-
-  static int
-  psh_compute_dir( FT_Pos  dx,
-                   FT_Pos  dy )
-  {
-    FT_Pos  ax, ay;
-    int     result = PSH_DIR_NONE;
-
-
-    ax = FT_ABS( dx );
-    ay = FT_ABS( dy );
-
-    if ( ay * 12 < ax )
-    {
-      /* |dy| <<< |dx|  means a near-horizontal segment */
-      result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT;
-    }
-    else if ( ax * 12 < ay )
-    {
-      /* |dx| <<< |dy|  means a near-vertical segment */
-      result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN;
-    }
-
-    return result;
-  }
-
-
-  /* load outline point coordinates into hinter glyph */
-  static void
-  psh_glyph_load_points( PSH_Glyph  glyph,
-                         FT_Int     dimension )
-  {
-    FT_Vector*  vec   = glyph->outline->points;
-    PSH_Point   point = glyph->points;
-    FT_UInt     count = glyph->num_points;
-
-
-    for ( ; count > 0; count--, point++, vec++ )
-    {
-      point->flags2 = 0;
-      point->hint   = NULL;
-      if ( dimension == 0 )
-      {
-        point->org_u = vec->x;
-        point->org_v = vec->y;
-      }
-      else
-      {
-        point->org_u = vec->y;
-        point->org_v = vec->x;
-      }
-
-#ifdef DEBUG_HINTER
-      point->org_x = vec->x;
-      point->org_y = vec->y;
-#endif
-
-    }
-  }
-
-
-  /* save hinted point coordinates back to outline */
-  static void
-  psh_glyph_save_points( PSH_Glyph  glyph,
-                         FT_Int     dimension )
-  {
-    FT_UInt     n;
-    PSH_Point   point = glyph->points;
-    FT_Vector*  vec   = glyph->outline->points;
-    char*       tags  = glyph->outline->tags;
-
-
-    for ( n = 0; n < glyph->num_points; n++ )
-    {
-      if ( dimension == 0 )
-        vec[n].x = point->cur_u;
-      else
-        vec[n].y = point->cur_u;
-
-      if ( psh_point_is_strong( point ) )
-        tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 );
-
-#ifdef DEBUG_HINTER
-
-      if ( dimension == 0 )
-      {
-        point->cur_x   = point->cur_u;
-        point->flags_x = point->flags2 | point->flags;
-      }
-      else
-      {
-        point->cur_y   = point->cur_u;
-        point->flags_y = point->flags2 | point->flags;
-      }
-
-#endif
-
-      point++;
-    }
-  }
-
-
-  static FT_Error
-  psh_glyph_init( PSH_Glyph    glyph,
-                  FT_Outline*  outline,
-                  PS_Hints     ps_hints,
-                  PSH_Globals  globals )
-  {
-    FT_Error   error;
-    FT_Memory  memory;
-
-
-    /* clear all fields */
-    FT_ZERO( glyph );
-
-    memory = glyph->memory = globals->memory;
-
-    /* allocate and setup points + contours arrays */
-    if ( FT_NEW_ARRAY( glyph->points,   outline->n_points   ) ||
-         FT_NEW_ARRAY( glyph->contours, outline->n_contours ) )
-      goto Exit;
-
-    glyph->num_points   = (FT_UInt)outline->n_points;
-    glyph->num_contours = (FT_UInt)outline->n_contours;
-
-    {
-      FT_UInt      first = 0, next, n;
-      PSH_Point    points  = glyph->points;
-      PSH_Contour  contour = glyph->contours;
-
-
-      for ( n = 0; n < glyph->num_contours; n++ )
-      {
-        FT_UInt    count;
-        PSH_Point  point;
-
-
-        next  = (FT_UInt)outline->contours[n] + 1;
-        count = next - first;
-
-        contour->start = points + first;
-        contour->count = count;
-
-        if ( count > 0 )
-        {
-          point = points + first;
-
-          point->prev    = points + next - 1;
-          point->contour = contour;
-
-          for ( ; count > 1; count-- )
-          {
-            point[0].next = point + 1;
-            point[1].prev = point;
-            point++;
-            point->contour = contour;
-          }
-          point->next = points + first;
-        }
-
-        contour++;
-        first = next;
-      }
-    }
-
-    {
-      PSH_Point   points = glyph->points;
-      PSH_Point   point  = points;
-      FT_Vector*  vec    = outline->points;
-      FT_UInt     n;
-
-
-      for ( n = 0; n < glyph->num_points; n++, point++ )
-      {
-        FT_Int  n_prev = (FT_Int)( point->prev - points );
-        FT_Int  n_next = (FT_Int)( point->next - points );
-        FT_Pos  dxi, dyi, dxo, dyo;
-
-
-        if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) )
-          point->flags = PSH_POINT_OFF;
-
-        dxi = vec[n].x - vec[n_prev].x;
-        dyi = vec[n].y - vec[n_prev].y;
-
-        point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi );
-
-        dxo = vec[n_next].x - vec[n].x;
-        dyo = vec[n_next].y - vec[n].y;
-
-        point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo );
-
-        /* detect smooth points */
-        if ( point->flags & PSH_POINT_OFF )
-          point->flags |= PSH_POINT_SMOOTH;
-
-        else if ( point->dir_in == point->dir_out )
-        {
-          if ( point->dir_out != PSH_DIR_NONE           ||
-               psh_corner_is_flat( dxi, dyi, dxo, dyo ) )
-            point->flags |= PSH_POINT_SMOOTH;
-        }
-      }
-    }
-
-    glyph->outline = outline;
-    glyph->globals = globals;
-
-#ifdef COMPUTE_INFLEXS
-    psh_glyph_load_points( glyph, 0 );
-    psh_glyph_compute_inflections( glyph );
-#endif /* COMPUTE_INFLEXS */
-
-    /* now deal with hints tables */
-    error = psh_hint_table_init( &glyph->hint_tables [0],
-                                 &ps_hints->dimension[0].hints,
-                                 &ps_hints->dimension[0].masks,
-                                 &ps_hints->dimension[0].counters,
-                                 memory );
-    if ( error )
-      goto Exit;
-
-    error = psh_hint_table_init( &glyph->hint_tables [1],
-                                 &ps_hints->dimension[1].hints,
-                                 &ps_hints->dimension[1].masks,
-                                 &ps_hints->dimension[1].counters,
-                                 memory );
-    if ( error )
-      goto Exit;
-
-  Exit:
-    return error;
-  }
-
-
-  /* compute all extrema in a glyph for a given dimension */
-  static void
-  psh_glyph_compute_extrema( PSH_Glyph  glyph )
-  {
-    FT_UInt  n;
-
-
-    /* first of all, compute all local extrema */
-    for ( n = 0; n < glyph->num_contours; n++ )
-    {
-      PSH_Point  first = glyph->contours[n].start;
-      PSH_Point  point, before, after;
-
-
-      if ( glyph->contours[n].count == 0 )
-        continue;
-
-      point  = first;
-      before = point;
-
-      do
-      {
-        before = before->prev;
-        if ( before == first )
-          goto Skip;
-
-      } while ( before->org_u == point->org_u );
-
-      first = point = before->next;
-
-      for (;;)
-      {
-        after = point;
-        do
-        {
-          after = after->next;
-          if ( after == first )
-            goto Next;
-
-        } while ( after->org_u == point->org_u );
-
-        if ( before->org_u < point->org_u )
-        {
-          if ( after->org_u < point->org_u )
-          {
-            /* local maximum */
-            goto Extremum;
-          }
-        }
-        else /* before->org_u > point->org_u */
-        {
-          if ( after->org_u > point->org_u )
-          {
-            /* local minimum */
-          Extremum:
-            do
-            {
-              psh_point_set_extremum( point );
-              point = point->next;
-
-            } while ( point != after );
-          }
-        }
-
-        before = after->prev;
-        point  = after;
-
-      } /* for  */
-
-    Next:
-      ;
-    }
-
-    /* for each extremum, determine its direction along the */
-    /* orthogonal axis                                      */
-    for ( n = 0; n < glyph->num_points; n++ )
-    {
-      PSH_Point  point, before, after;
-
-
-      point  = &glyph->points[n];
-      before = point;
-      after  = point;
-
-      if ( psh_point_is_extremum( point ) )
-      {
-        do
-        {
-          before = before->prev;
-          if ( before == point )
-            goto Skip;
-
-        } while ( before->org_v == point->org_v );
-
-        do
-        {
-          after = after->next;
-          if ( after == point )
-            goto Skip;
-
-        } while ( after->org_v == point->org_v );
-      }
-
-      if ( before->org_v < point->org_v &&
-           after->org_v  > point->org_v )
-      {
-        psh_point_set_positive( point );
-      }
-      else if ( before->org_v > point->org_v &&
-                after->org_v  < point->org_v )
-      {
-        psh_point_set_negative( point );
-      }
-
-    Skip:
-      ;
-    }
-  }
-
-
-  /* major_dir is the direction for points on the bottom/left of the stem; */
-  /* Points on the top/right of the stem will have a direction of          */
-  /* -major_dir.                                                           */
-
-  static void
-  psh_hint_table_find_strong_points( PSH_Hint_Table  table,
-                                     PSH_Point       point,
-                                     FT_UInt         count,
-                                     FT_Int          threshold,
-                                     FT_Int          major_dir )
-  {
-    PSH_Hint*  sort      = table->sort;
-    FT_UInt    num_hints = table->num_hints;
-
-
-    for ( ; count > 0; count--, point++ )
-    {
-      FT_Int  point_dir = 0;
-      FT_Pos  org_u     = point->org_u;
-
-
-      if ( psh_point_is_strong( point ) )
-        continue;
-
-      if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) )
-        point_dir = point->dir_in;
-
-      else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) )
-        point_dir = point->dir_out;
-
-      if ( point_dir )
-      {
-        if ( point_dir == major_dir )
-        {
-          FT_UInt  nn;
-
-
-          for ( nn = 0; nn < num_hints; nn++ )
-          {
-            PSH_Hint  hint = sort[nn];
-            FT_Pos    d    = org_u - hint->org_pos;
-
-
-            if ( d < threshold && -d < threshold )
-            {
-              psh_point_set_strong( point );
-              point->flags2 |= PSH_POINT_EDGE_MIN;
-              point->hint    = hint;
-              break;
-            }
-          }
-        }
-        else if ( point_dir == -major_dir )
-        {
-          FT_UInt  nn;
-
-
-          for ( nn = 0; nn < num_hints; nn++ )
-          {
-            PSH_Hint  hint = sort[nn];
-            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
-
-
-            if ( d < threshold && -d < threshold )
-            {
-              psh_point_set_strong( point );
-              point->flags2 |= PSH_POINT_EDGE_MAX;
-              point->hint    = hint;
-              break;
-            }
-          }
-        }
-      }
-
-#if 1
-      else if ( psh_point_is_extremum( point ) )
-      {
-        /* treat extrema as special cases for stem edge alignment */
-        FT_UInt  nn, min_flag, max_flag;
-
-
-        if ( major_dir == PSH_DIR_HORIZONTAL )
-        {
-          min_flag = PSH_POINT_POSITIVE;
-          max_flag = PSH_POINT_NEGATIVE;
-        }
-        else
-        {
-          min_flag = PSH_POINT_NEGATIVE;
-          max_flag = PSH_POINT_POSITIVE;
-        }
-
-        if ( point->flags2 & min_flag )
-        {
-          for ( nn = 0; nn < num_hints; nn++ )
-          {
-            PSH_Hint  hint = sort[nn];
-            FT_Pos    d    = org_u - hint->org_pos;
-
-
-            if ( d < threshold && -d < threshold )
-            {
-              point->flags2 |= PSH_POINT_EDGE_MIN;
-              point->hint    = hint;
-              psh_point_set_strong( point );
-              break;
-            }
-          }
-        }
-        else if ( point->flags2 & max_flag )
-        {
-          for ( nn = 0; nn < num_hints; nn++ )
-          {
-            PSH_Hint  hint = sort[nn];
-            FT_Pos    d    = org_u - hint->org_pos - hint->org_len;
-
-
-            if ( d < threshold && -d < threshold )
-            {
-              point->flags2 |= PSH_POINT_EDGE_MAX;
-              point->hint    = hint;
-              psh_point_set_strong( point );
-              break;
-            }
-          }
-        }
-
-        if ( !point->hint )
-        {
-          for ( nn = 0; nn < num_hints; nn++ )
-          {
-            PSH_Hint  hint = sort[nn];
-
-
-            if ( org_u >= hint->org_pos                 &&
-                org_u <= hint->org_pos + hint->org_len )
-            {
-              point->hint = hint;
-              break;
-            }
-          }
-        }
-      }
-
-#endif /* 1 */
-    }
-  }
-
-
-  /* the accepted shift for strong points in fractional pixels */
-#define PSH_STRONG_THRESHOLD  32
-
-  /* the maximum shift value in font units */
-#define PSH_STRONG_THRESHOLD_MAXIMUM  30
-
-
-  /* find strong points in a glyph */
-  static void
-  psh_glyph_find_strong_points( PSH_Glyph  glyph,
-                                FT_Int     dimension )
-  {
-    /* a point is `strong' if it is located on a stem edge and       */
-    /* has an `in' or `out' tangent parallel to the hint's direction */
-
-    PSH_Hint_Table  table     = &glyph->hint_tables[dimension];
-    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;
-    PSH_Dimension   dim       = &glyph->globals->dimension[dimension];
-    FT_Fixed        scale     = dim->scale_mult;
-    FT_Int          threshold;
-
-
-    threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale );
-    if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM )
-      threshold = PSH_STRONG_THRESHOLD_MAXIMUM;
-
-    /* process secondary hints to `selected' points */
-    if ( num_masks > 1 && glyph->num_points > 0 )
-    {
-      /* the `endchar' op can reduce the number of points */
-      first = mask->end_point > glyph->num_points
-                ? glyph->num_points
-                : mask->end_point;
-      mask++;
-      for ( ; num_masks > 1; num_masks--, mask++ )
-      {
-        FT_UInt  next = FT_MIN( mask->end_point, glyph->num_points );
-
-
-        if ( next > first )
-        {
-          FT_UInt    count = next - first;
-          PSH_Point  point = glyph->points + first;
-
-
-          psh_hint_table_activate_mask( table, mask );
-
-          psh_hint_table_find_strong_points( table, point, count,
-                                             threshold, major_dir );
-        }
-        first = next;
-      }
-    }
-
-    /* process primary hints for all points */
-    if ( num_masks == 1 )
-    {
-      FT_UInt    count = glyph->num_points;
-      PSH_Point  point = glyph->points;
-
-
-      psh_hint_table_activate_mask( table, table->hint_masks->masks );
-
-      psh_hint_table_find_strong_points( table, point, count,
-                                         threshold, major_dir );
-    }
-
-    /* now, certain points may have been attached to a hint and */
-    /* not marked as strong; update their flags then            */
-    {
-      FT_UInt    count = glyph->num_points;
-      PSH_Point  point = glyph->points;
-
-
-      for ( ; count > 0; count--, point++ )
-        if ( point->hint && !psh_point_is_strong( point ) )
-          psh_point_set_strong( point );
-    }
-  }
-
-
-  /* find points in a glyph which are in a blue zone and have `in' or */
-  /* `out' tangents parallel to the horizontal axis                   */
-  static void
-  psh_glyph_find_blue_points( PSH_Blues  blues,
-                              PSH_Glyph  glyph )
-  {
-    PSH_Blue_Table  table;
-    PSH_Blue_Zone   zone;
-    FT_UInt         glyph_count = glyph->num_points;
-    FT_UInt         blue_count;
-    PSH_Point       point = glyph->points;
-
-
-    for ( ; glyph_count > 0; glyph_count--, point++ )
-    {
-      FT_Pos  y;
-
-
-      /* check tangents */
-      if ( !PSH_DIR_COMPARE( point->dir_in,  PSH_DIR_HORIZONTAL ) &&
-           !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) )
-        continue;
-
-      /* skip strong points */
-      if ( psh_point_is_strong( point ) )
-        continue;
-
-      y = point->org_u;
-
-      /* look up top zones */
-      table      = &blues->normal_top;
-      blue_count = table->count;
-      zone       = table->zones;
-
-      for ( ; blue_count > 0; blue_count--, zone++ )
-      {
-        FT_Pos  delta = y - zone->org_bottom;
-
-
-        if ( delta < -blues->blue_fuzz )
-          break;
-
-        if ( y <= zone->org_top + blues->blue_fuzz )
-          if ( blues->no_overshoots || delta <= blues->blue_threshold )
-          {
-            point->cur_u = zone->cur_bottom;
-            psh_point_set_strong( point );
-            psh_point_set_fitted( point );
-          }
-      }
-
-      /* look up bottom zones */
-      table      = &blues->normal_bottom;
-      blue_count = table->count;
-      zone       = table->zones + blue_count - 1;
-
-      for ( ; blue_count > 0; blue_count--, zone-- )
-      {
-        FT_Pos  delta = zone->org_top - y;
-
-
-        if ( delta < -blues->blue_fuzz )
-          break;
-
-        if ( y >= zone->org_bottom - blues->blue_fuzz )
-          if ( blues->no_overshoots || delta < blues->blue_threshold )
-          {
-            point->cur_u = zone->cur_top;
-            psh_point_set_strong( point );
-            psh_point_set_fitted( point );
-          }
-      }
-    }
-  }
-
-
-  /* interpolate strong points with the help of hinted coordinates */
-  static void
-  psh_glyph_interpolate_strong_points( PSH_Glyph  glyph,
-                                       FT_Int     dimension )
-  {
-    PSH_Dimension  dim   = &glyph->globals->dimension[dimension];
-    FT_Fixed       scale = dim->scale_mult;
-
-    FT_UInt        count = glyph->num_points;
-    PSH_Point      point = glyph->points;
-
-
-    for ( ; count > 0; count--, point++ )
-    {
-      PSH_Hint  hint = point->hint;
-
-
-      if ( hint )
-      {
-        FT_Pos  delta;
-
-
-        if ( psh_point_is_edge_min( point ) )
-          point->cur_u = hint->cur_pos;
-
-        else if ( psh_point_is_edge_max( point ) )
-          point->cur_u = hint->cur_pos + hint->cur_len;
-
-        else
-        {
-          delta = point->org_u - hint->org_pos;
-
-          if ( delta <= 0 )
-            point->cur_u = hint->cur_pos + FT_MulFix( delta, scale );
-
-          else if ( delta >= hint->org_len )
-            point->cur_u = hint->cur_pos + hint->cur_len +
-                             FT_MulFix( delta - hint->org_len, scale );
-
-          else /* hint->org_len > 0 */
-            point->cur_u = hint->cur_pos +
-                             FT_MulDiv( delta, hint->cur_len,
-                                        hint->org_len );
-        }
-        psh_point_set_fitted( point );
-      }
-    }
-  }
-
-
-#define  PSH_MAX_STRONG_INTERNAL  16
-
-  static void
-  psh_glyph_interpolate_normal_points( PSH_Glyph  glyph,
-                                       FT_Int     dimension )
-  {
-
-#if 1
-    /* first technique: a point is strong if it is a local extremum */
-
-    PSH_Dimension  dim    = &glyph->globals->dimension[dimension];
-    FT_Fixed       scale  = dim->scale_mult;
-    FT_Memory      memory = glyph->memory;
-
-    PSH_Point*     strongs     = NULL;
-    PSH_Point      strongs_0[PSH_MAX_STRONG_INTERNAL];
-    FT_UInt        num_strongs = 0;
-
-    PSH_Point      points = glyph->points;
-    PSH_Point      points_end = points + glyph->num_points;
-    PSH_Point      point;
-
-
-    /* first count the number of strong points */
-    for ( point = points; point < points_end; point++ )
-    {
-      if ( psh_point_is_strong( point ) )
-        num_strongs++;
-    }
-
-    if ( num_strongs == 0 )  /* nothing to do here */
-      return;
-
-    /* allocate an array to store a list of points, */
-    /* stored in increasing org_u order             */
-    if ( num_strongs <= PSH_MAX_STRONG_INTERNAL )
-      strongs = strongs_0;
-    else
-    {
-      FT_Error  error;
-
-
-      if ( FT_NEW_ARRAY( strongs, num_strongs ) )
-        return;
-    }
-
-    num_strongs = 0;
-    for ( point = points; point < points_end; point++ )
-    {
-      PSH_Point*  insert;
-
-
-      if ( !psh_point_is_strong( point ) )
-        continue;
-
-      for ( insert = strongs + num_strongs; insert > strongs; insert-- )
-      {
-        if ( insert[-1]->org_u <= point->org_u )
-          break;
-
-        insert[0] = insert[-1];
-      }
-      insert[0] = point;
-      num_strongs++;
-    }
-
-    /* now try to interpolate all normal points */
-    for ( point = points; point < points_end; point++ )
-    {
-      if ( psh_point_is_strong( point ) )
-        continue;
-
-      /* sometimes, some local extrema are smooth points */
-      if ( psh_point_is_smooth( point ) )
-      {
-        if ( point->dir_in == PSH_DIR_NONE   ||
-             point->dir_in != point->dir_out )
-          continue;
-
-        if ( !psh_point_is_extremum( point ) &&
-             !psh_point_is_inflex( point )   )
-          continue;
-
-        point->flags &= ~PSH_POINT_SMOOTH;
-      }
-
-      /* find best enclosing point coordinates then interpolate */
-      {
-        PSH_Point   before, after;
-        FT_UInt     nn;
-
-
-        for ( nn = 0; nn < num_strongs; nn++ )
-          if ( strongs[nn]->org_u > point->org_u )
-            break;
-
-        if ( nn == 0 )  /* point before the first strong point */
-        {
-          after = strongs[0];
-
-          point->cur_u = after->cur_u +
-                           FT_MulFix( point->org_u - after->org_u,
-                                      scale );
-        }
-        else
-        {
-          before = strongs[nn - 1];
-
-          for ( nn = num_strongs; nn > 0; nn-- )
-            if ( strongs[nn - 1]->org_u < point->org_u )
-              break;
-
-          if ( nn == num_strongs )  /* point is after last strong point */
-          {
-            before = strongs[nn - 1];
-
-            point->cur_u = before->cur_u +
-                             FT_MulFix( point->org_u - before->org_u,
-                                        scale );
-          }
-          else
-          {
-            FT_Pos  u;
-
-
-            after = strongs[nn];
-
-            /* now interpolate point between before and after */
-            u = point->org_u;
-
-            if ( u == before->org_u )
-              point->cur_u = before->cur_u;
-
-            else if ( u == after->org_u )
-              point->cur_u = after->cur_u;
-
-            else
-              point->cur_u = before->cur_u +
-                               FT_MulDiv( u - before->org_u,
-                                          after->cur_u - before->cur_u,
-                                          after->org_u - before->org_u );
-          }
-        }
-        psh_point_set_fitted( point );
-      }
-    }
-
-    if ( strongs != strongs_0 )
-      FT_FREE( strongs );
-
-#endif /* 1 */
-
-  }
-
-
-  /* interpolate other points */
-  static void
-  psh_glyph_interpolate_other_points( PSH_Glyph  glyph,
-                                      FT_Int     dimension )
-  {
-    PSH_Dimension  dim          = &glyph->globals->dimension[dimension];
-    FT_Fixed       scale        = dim->scale_mult;
-    FT_Fixed       delta        = dim->scale_delta;
-    PSH_Contour    contour      = glyph->contours;
-    FT_UInt        num_contours = glyph->num_contours;
-
-
-    for ( ; num_contours > 0; num_contours--, contour++ )
-    {
-      PSH_Point  start = contour->start;
-      PSH_Point  first, next, point;
-      FT_UInt    fit_count;
-
-
-      /* count the number of strong points in this contour */
-      next      = start + contour->count;
-      fit_count = 0;
-      first     = NULL;
-
-      for ( point = start; point < next; point++ )
-        if ( psh_point_is_fitted( point ) )
-        {
-          if ( !first )
-            first = point;
-
-          fit_count++;
-        }
-
-      /* if there are less than 2 fitted points in the contour, we */
-      /* simply scale and eventually translate the contour points  */
-      if ( fit_count < 2 )
-      {
-        if ( fit_count == 1 )
-          delta = first->cur_u - FT_MulFix( first->org_u, scale );
-
-        for ( point = start; point < next; point++ )
-          if ( point != first )
-            point->cur_u = FT_MulFix( point->org_u, scale ) + delta;
-
-        goto Next_Contour;
-      }
-
-      /* there are more than 2 strong points in this contour; we */
-      /* need to interpolate weak points between them            */
-      start = first;
-      do
-      {
-        /* skip consecutive fitted points */
-        for (;;)
-        {
-          next = first->next;
-          if ( next == start )
-            goto Next_Contour;
-
-          if ( !psh_point_is_fitted( next ) )
-            break;
-
-          first = next;
-        }
-
-        /* find next fitted point after unfitted one */
-        for (;;)
-        {
-          next = next->next;
-          if ( psh_point_is_fitted( next ) )
-            break;
-        }
-
-        /* now interpolate between them */
-        {
-          FT_Pos    org_a, org_ab, cur_a, cur_ab;
-          FT_Pos    org_c, org_ac, cur_c;
-          FT_Fixed  scale_ab;
-
-
-          if ( first->org_u <= next->org_u )
-          {
-            org_a  = first->org_u;
-            cur_a  = first->cur_u;
-            org_ab = next->org_u - org_a;
-            cur_ab = next->cur_u - cur_a;
-          }
-          else
-          {
-            org_a  = next->org_u;
-            cur_a  = next->cur_u;
-            org_ab = first->org_u - org_a;
-            cur_ab = first->cur_u - cur_a;
-          }
-
-          scale_ab = 0x10000L;
-          if ( org_ab > 0 )
-            scale_ab = FT_DivFix( cur_ab, org_ab );
-
-          point = first->next;
-          do
-          {
-            org_c  = point->org_u;
-            org_ac = org_c - org_a;
-
-            if ( org_ac <= 0 )
-            {
-              /* on the left of the interpolation zone */
-              cur_c = cur_a + FT_MulFix( org_ac, scale );
-            }
-            else if ( org_ac >= org_ab )
-            {
-              /* on the right on the interpolation zone */
-              cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale );
-            }
-            else
-            {
-              /* within the interpolation zone */
-              cur_c = cur_a + FT_MulFix( org_ac, scale_ab );
-            }
-
-            point->cur_u = cur_c;
-
-            point = point->next;
-
-          } while ( point != next );
-        }
-
-        /* keep going until all points in the contours have been processed */
-        first = next;
-
-      } while ( first != start );
-
-    Next_Contour:
-      ;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                     HIGH-LEVEL INTERFACE                      *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  FT_Error
-  ps_hints_apply( PS_Hints        ps_hints,
-                  FT_Outline*     outline,
-                  PSH_Globals     globals,
-                  FT_Render_Mode  hint_mode )
-  {
-    PSH_GlyphRec  glyphrec;
-    PSH_Glyph     glyph = &glyphrec;
-    FT_Error      error;
-#ifdef DEBUG_HINTER
-    FT_Memory     memory;
-#endif
-    FT_Int        dimension;
-
-
-    /* something to do? */
-    if ( outline->n_points == 0 || outline->n_contours == 0 )
-      return FT_Err_Ok;
-
-#ifdef DEBUG_HINTER
-
-    memory = globals->memory;
-
-    if ( ps_debug_glyph )
-    {
-      psh_glyph_done( ps_debug_glyph );
-      FT_FREE( ps_debug_glyph );
-    }
-
-    if ( FT_NEW( glyph ) )
-      return error;
-
-    ps_debug_glyph = glyph;
-
-#endif /* DEBUG_HINTER */
-
-    error = psh_glyph_init( glyph, outline, ps_hints, globals );
-    if ( error )
-      goto Exit;
-
-    /* try to optimize the y_scale so that the top of non-capital letters
-     * is aligned on a pixel boundary whenever possible
-     */
-    {
-      PSH_Dimension  dim_x = &glyph->globals->dimension[0];
-      PSH_Dimension  dim_y = &glyph->globals->dimension[1];
-
-      FT_Fixed  x_scale = dim_x->scale_mult;
-      FT_Fixed  y_scale = dim_y->scale_mult;
-
-      FT_Fixed  old_x_scale = x_scale;
-      FT_Fixed  old_y_scale = y_scale;
-
-      FT_Fixed  scaled;
-      FT_Fixed  fitted;
-
-      FT_Bool  rescale = FALSE;
-
-
-      scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale );
-      fitted = FT_PIX_ROUND( scaled );
-
-      if ( fitted != 0 && scaled != fitted )
-      {
-        rescale = TRUE;
-
-        y_scale = FT_MulDiv( y_scale, fitted, scaled );
-
-        if ( fitted < scaled )
-          x_scale -= x_scale / 50;
-
-        psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 );
-      }
-
-      glyph->do_horz_hints = 1;
-      glyph->do_vert_hints = 1;
-
-      glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO ||
-                                         hint_mode == FT_RENDER_MODE_LCD  );
-
-      glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO  ||
-                                         hint_mode == FT_RENDER_MODE_LCD_V );
-
-      glyph->do_stem_adjust   = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT );
-
-      for ( dimension = 0; dimension < 2; dimension++ )
-      {
-        /* load outline coordinates into glyph */
-        psh_glyph_load_points( glyph, dimension );
-
-        /* compute local extrema */
-        psh_glyph_compute_extrema( glyph );
-
-        /* compute aligned stem/hints positions */
-        psh_hint_table_align_hints( &glyph->hint_tables[dimension],
-                                    glyph->globals,
-                                    dimension,
-                                    glyph );
-
-        /* find strong points, align them, then interpolate others */
-        psh_glyph_find_strong_points( glyph, dimension );
-        if ( dimension == 1 )
-          psh_glyph_find_blue_points( &globals->blues, glyph );
-        psh_glyph_interpolate_strong_points( glyph, dimension );
-        psh_glyph_interpolate_normal_points( glyph, dimension );
-        psh_glyph_interpolate_other_points( glyph, dimension );
-
-        /* save hinted coordinates back to outline */
-        psh_glyph_save_points( glyph, dimension );
-
-        if ( rescale )
-          psh_globals_set_scale( glyph->globals,
-                                 old_x_scale, old_y_scale, 0, 0 );
-      }
-    }
-
-  Exit:
-
-#ifndef DEBUG_HINTER
-    psh_glyph_done( glyph );
-#endif
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshalgo.h b/third_party/freetype/src/pshinter/pshalgo.h
deleted file mode 100644
index 62e97d1..0000000
--- a/third_party/freetype/src/pshinter/pshalgo.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshalgo.h                                                              */
-/*                                                                         */
-/*    PostScript hinting algorithm (specification).                        */
-/*                                                                         */
-/*  Copyright 2001-2017 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 PSHALGO_H_
-#define PSHALGO_H_
-
-
-#include "pshrec.h"
-#include "pshglob.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /* handle to Hint structure */
-  typedef struct PSH_HintRec_*  PSH_Hint;
-
-
-  /* hint bit-flags */
-#define PSH_HINT_GHOST   PS_HINT_FLAG_GHOST
-#define PSH_HINT_BOTTOM  PS_HINT_FLAG_BOTTOM
-#define PSH_HINT_ACTIVE  4U
-#define PSH_HINT_FITTED  8U
-
-
-#define psh_hint_is_active( x )  ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 )
-#define psh_hint_is_ghost( x )   ( ( (x)->flags & PSH_HINT_GHOST  ) != 0 )
-#define psh_hint_is_fitted( x )  ( ( (x)->flags & PSH_HINT_FITTED ) != 0 )
-
-#define psh_hint_activate( x )    (x)->flags |=  PSH_HINT_ACTIVE
-#define psh_hint_deactivate( x )  (x)->flags &= ~PSH_HINT_ACTIVE
-#define psh_hint_set_fitted( x )  (x)->flags |=  PSH_HINT_FITTED
-
-
-  /* hint structure */
-  typedef struct  PSH_HintRec_
-  {
-    FT_Int    org_pos;
-    FT_Int    org_len;
-    FT_Pos    cur_pos;
-    FT_Pos    cur_len;
-    FT_UInt   flags;
-    PSH_Hint  parent;
-    FT_Int    order;
-
-  } PSH_HintRec;
-
-
-  /* this is an interpolation zone used for strong points;  */
-  /* weak points are interpolated according to their strong */
-  /* neighbours                                             */
-  typedef struct  PSH_ZoneRec_
-  {
-    FT_Fixed  scale;
-    FT_Fixed  delta;
-    FT_Pos    min;
-    FT_Pos    max;
-
-  } PSH_ZoneRec, *PSH_Zone;
-
-
-  typedef struct  PSH_Hint_TableRec_
-  {
-    FT_UInt        max_hints;
-    FT_UInt        num_hints;
-    PSH_Hint       hints;
-    PSH_Hint*      sort;
-    PSH_Hint*      sort_global;
-    FT_UInt        num_zones;
-    PSH_ZoneRec*   zones;
-    PSH_Zone       zone;
-    PS_Mask_Table  hint_masks;
-    PS_Mask_Table  counter_masks;
-
-  } PSH_Hint_TableRec, *PSH_Hint_Table;
-
-
-  typedef struct PSH_PointRec_*    PSH_Point;
-  typedef struct PSH_ContourRec_*  PSH_Contour;
-
-  enum
-  {
-    PSH_DIR_NONE  =  4,
-    PSH_DIR_UP    = -1,
-    PSH_DIR_DOWN  =  1,
-    PSH_DIR_LEFT  = -2,
-    PSH_DIR_RIGHT =  2
-  };
-
-#define PSH_DIR_HORIZONTAL  2
-#define PSH_DIR_VERTICAL    1
-
-#define PSH_DIR_COMPARE( d1, d2 )   ( (d1) == (d2) || (d1) == -(d2) )
-#define PSH_DIR_IS_HORIZONTAL( d )  PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL )
-#define PSH_DIR_IS_VERTICAL( d )    PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL )
-
-
-  /* the following bit-flags are computed once by the glyph */
-  /* analyzer, for both dimensions                          */
-#define PSH_POINT_OFF     1U      /* point is off the curve */
-#define PSH_POINT_SMOOTH  2U      /* point is smooth        */
-#define PSH_POINT_INFLEX  4U      /* point is inflection    */
-
-
-#define psh_point_is_smooth( p )  ( (p)->flags & PSH_POINT_SMOOTH )
-#define psh_point_is_off( p )     ( (p)->flags & PSH_POINT_OFF    )
-#define psh_point_is_inflex( p )  ( (p)->flags & PSH_POINT_INFLEX )
-
-#define psh_point_set_smooth( p )  (p)->flags |= PSH_POINT_SMOOTH
-#define psh_point_set_off( p )     (p)->flags |= PSH_POINT_OFF
-#define psh_point_set_inflex( p )  (p)->flags |= PSH_POINT_INFLEX
-
-
-  /* the following bit-flags are re-computed for each dimension */
-#define PSH_POINT_STRONG      16U /* point is strong                           */
-#define PSH_POINT_FITTED      32U /* point is already fitted                   */
-#define PSH_POINT_EXTREMUM    64U /* point is local extremum                   */
-#define PSH_POINT_POSITIVE   128U /* extremum has positive contour flow        */
-#define PSH_POINT_NEGATIVE   256U /* extremum has negative contour flow        */
-#define PSH_POINT_EDGE_MIN   512U /* point is aligned to left/bottom stem edge */
-#define PSH_POINT_EDGE_MAX  1024U /* point is aligned to top/right stem edge   */
-
-
-#define psh_point_is_strong( p )    ( (p)->flags2 & PSH_POINT_STRONG )
-#define psh_point_is_fitted( p )    ( (p)->flags2 & PSH_POINT_FITTED )
-#define psh_point_is_extremum( p )  ( (p)->flags2 & PSH_POINT_EXTREMUM )
-#define psh_point_is_positive( p )  ( (p)->flags2 & PSH_POINT_POSITIVE )
-#define psh_point_is_negative( p )  ( (p)->flags2 & PSH_POINT_NEGATIVE )
-#define psh_point_is_edge_min( p )  ( (p)->flags2 & PSH_POINT_EDGE_MIN )
-#define psh_point_is_edge_max( p )  ( (p)->flags2 & PSH_POINT_EDGE_MAX )
-
-#define psh_point_set_strong( p )    (p)->flags2 |= PSH_POINT_STRONG
-#define psh_point_set_fitted( p )    (p)->flags2 |= PSH_POINT_FITTED
-#define psh_point_set_extremum( p )  (p)->flags2 |= PSH_POINT_EXTREMUM
-#define psh_point_set_positive( p )  (p)->flags2 |= PSH_POINT_POSITIVE
-#define psh_point_set_negative( p )  (p)->flags2 |= PSH_POINT_NEGATIVE
-#define psh_point_set_edge_min( p )  (p)->flags2 |= PSH_POINT_EDGE_MIN
-#define psh_point_set_edge_max( p )  (p)->flags2 |= PSH_POINT_EDGE_MAX
-
-
-  typedef struct  PSH_PointRec_
-  {
-    PSH_Point    prev;
-    PSH_Point    next;
-    PSH_Contour  contour;
-    FT_UInt      flags;
-    FT_UInt      flags2;
-    FT_Char      dir_in;
-    FT_Char      dir_out;
-    PSH_Hint     hint;
-    FT_Pos       org_u;
-    FT_Pos       org_v;
-    FT_Pos       cur_u;
-#ifdef DEBUG_HINTER
-    FT_Pos       org_x;
-    FT_Pos       cur_x;
-    FT_Pos       org_y;
-    FT_Pos       cur_y;
-    FT_UInt      flags_x;
-    FT_UInt      flags_y;
-#endif
-
-  } PSH_PointRec;
-
-
-  typedef struct  PSH_ContourRec_
-  {
-    PSH_Point  start;
-    FT_UInt    count;
-
-  } PSH_ContourRec;
-
-
-  typedef struct  PSH_GlyphRec_
-  {
-    FT_UInt            num_points;
-    FT_UInt            num_contours;
-
-    PSH_Point          points;
-    PSH_Contour        contours;
-
-    FT_Memory          memory;
-    FT_Outline*        outline;
-    PSH_Globals        globals;
-    PSH_Hint_TableRec  hint_tables[2];
-
-    FT_Bool            vertical;
-    FT_Int             major_dir;
-    FT_Int             minor_dir;
-
-    FT_Bool            do_horz_hints;
-    FT_Bool            do_vert_hints;
-    FT_Bool            do_horz_snapping;
-    FT_Bool            do_vert_snapping;
-    FT_Bool            do_stem_adjust;
-
-  } PSH_GlyphRec, *PSH_Glyph;
-
-
-#ifdef DEBUG_HINTER
-  extern PSH_Hint_Table  ps_debug_hint_table;
-
-  typedef void
-  (*PSH_HintFunc)( PSH_Hint  hint,
-                   FT_Bool   vertical );
-
-  extern PSH_HintFunc    ps_debug_hint_func;
-
-  extern PSH_Glyph       ps_debug_glyph;
-#endif
-
-
-  extern FT_Error
-  ps_hints_apply( PS_Hints        ps_hints,
-                  FT_Outline*     outline,
-                  PSH_Globals     globals,
-                  FT_Render_Mode  hint_mode );
-
-
-FT_END_HEADER
-
-
-#endif /* PSHALGO_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshglob.c b/third_party/freetype/src/pshinter/pshglob.c
deleted file mode 100644
index c68770c..0000000
--- a/third_party/freetype/src/pshinter/pshglob.c
+++ /dev/null
@@ -1,795 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshglob.c                                                              */
-/*                                                                         */
-/*    PostScript hinter global hinting management (body).                  */
-/*    Inspired by the new auto-hinter module.                              */
-/*                                                                         */
-/*  Copyright 2001-2017 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_OBJECTS_H
-#include "pshglob.h"
-
-#ifdef DEBUG_HINTER
-  PSH_Globals  ps_debug_globals = NULL;
-#endif
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       STANDARD WIDTHS                         *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* scale the widths/heights table */
-  static void
-  psh_globals_scale_widths( PSH_Globals  globals,
-                            FT_UInt      direction )
-  {
-    PSH_Dimension  dim   = &globals->dimension[direction];
-    PSH_Widths     stdw  = &dim->stdw;
-    FT_UInt        count = stdw->count;
-    PSH_Width      width = stdw->widths;
-    PSH_Width      stand = width;               /* standard width/height */
-    FT_Fixed       scale = dim->scale_mult;
-
-
-    if ( count > 0 )
-    {
-      width->cur = FT_MulFix( width->org, scale );
-      width->fit = FT_PIX_ROUND( width->cur );
-
-      width++;
-      count--;
-
-      for ( ; count > 0; count--, width++ )
-      {
-        FT_Pos  w, dist;
-
-
-        w    = FT_MulFix( width->org, scale );
-        dist = w - stand->cur;
-
-        if ( dist < 0 )
-          dist = -dist;
-
-        if ( dist < 128 )
-          w = stand->cur;
-
-        width->cur = w;
-        width->fit = FT_PIX_ROUND( w );
-      }
-    }
-  }
-
-
-#if 0
-
-  /* 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 )
-  {
-    FT_UInt  n;
-    FT_Pos   width     = FT_MulFix( org_width, dimension->scale_mult );
-    FT_Pos   best      = 64 + 32 + 2;
-    FT_Pos   reference = width;
-
-
-    for ( n = 0; n < dimension->stdw.count; n++ )
-    {
-      FT_Pos  w;
-      FT_Pos  dist;
-
-
-      w = dimension->stdw.widths[n].cur;
-      dist = width - w;
-      if ( dist < 0 )
-        dist = -dist;
-      if ( dist < best )
-      {
-        best      = dist;
-        reference = w;
-      }
-    }
-
-    if ( width >= reference )
-    {
-      width -= 0x21;
-      if ( width < reference )
-        width = reference;
-    }
-    else
-    {
-      width += 0x21;
-      if ( width > reference )
-        width = reference;
-    }
-
-    return width;
-  }
-
-#endif /* 0 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       BLUE ZONES                              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static void
-  psh_blues_set_zones_0( PSH_Blues       target,
-                         FT_Bool         is_others,
-                         FT_UInt         read_count,
-                         FT_Short*       read,
-                         PSH_Blue_Table  top_table,
-                         PSH_Blue_Table  bot_table )
-  {
-    FT_UInt  count_top = top_table->count;
-    FT_UInt  count_bot = bot_table->count;
-    FT_Bool  first     = 1;
-
-    FT_UNUSED( target );
-
-
-    for ( ; read_count > 1; read_count -= 2 )
-    {
-      FT_Int         reference, delta;
-      FT_UInt        count;
-      PSH_Blue_Zone  zones, zone;
-      FT_Bool        top;
-
-
-      /* read blue zone entry, and select target top/bottom zone */
-      top = 0;
-      if ( first || is_others )
-      {
-        reference = read[1];
-        delta     = read[0] - reference;
-
-        zones = bot_table->zones;
-        count = count_bot;
-        first = 0;
-      }
-      else
-      {
-        reference = read[0];
-        delta     = read[1] - reference;
-
-        zones = top_table->zones;
-        count = count_top;
-        top   = 1;
-      }
-
-      /* insert into sorted table */
-      zone = zones;
-      for ( ; count > 0; count--, zone++ )
-      {
-        if ( reference < zone->org_ref )
-          break;
-
-        if ( reference == zone->org_ref )
-        {
-          FT_Int  delta0 = zone->org_delta;
-
-
-          /* we have two zones on the same reference position -- */
-          /* only keep the largest one                           */
-          if ( delta < 0 )
-          {
-            if ( delta < delta0 )
-              zone->org_delta = delta;
-          }
-          else
-          {
-            if ( delta > delta0 )
-              zone->org_delta = delta;
-          }
-          goto Skip;
-        }
-      }
-
-      for ( ; count > 0; count-- )
-        zone[count] = zone[count-1];
-
-      zone->org_ref   = reference;
-      zone->org_delta = delta;
-
-      if ( top )
-        count_top++;
-      else
-        count_bot++;
-
-    Skip:
-      read += 2;
-    }
-
-    top_table->count = count_top;
-    bot_table->count = count_bot;
-  }
-
-
-  /* Re-read blue zones from the original fonts and store them into out */
-  /* private structure.  This function re-orders, sanitizes and         */
-  /* fuzz-expands the zones as well.                                    */
-  static void
-  psh_blues_set_zones( PSH_Blues  target,
-                       FT_UInt    count,
-                       FT_Short*  blues,
-                       FT_UInt    count_others,
-                       FT_Short*  other_blues,
-                       FT_Int     fuzz,
-                       FT_Int     family )
-  {
-    PSH_Blue_Table  top_table, bot_table;
-    FT_UInt         count_top, count_bot;
-
-
-    if ( family )
-    {
-      top_table = &target->family_top;
-      bot_table = &target->family_bottom;
-    }
-    else
-    {
-      top_table = &target->normal_top;
-      bot_table = &target->normal_bottom;
-    }
-
-    /* read the input blue zones, and build two sorted tables  */
-    /* (one for the top zones, the other for the bottom zones) */
-    top_table->count = 0;
-    bot_table->count = 0;
-
-    /* first, the blues */
-    psh_blues_set_zones_0( target, 0,
-                           count, blues, top_table, bot_table );
-    psh_blues_set_zones_0( target, 1,
-                           count_others, other_blues, top_table, bot_table );
-
-    count_top = top_table->count;
-    count_bot = bot_table->count;
-
-    /* sanitize top table */
-    if ( count_top > 0 )
-    {
-      PSH_Blue_Zone  zone = top_table->zones;
-
-
-      for ( count = count_top; count > 0; count--, zone++ )
-      {
-        FT_Int  delta;
-
-
-        if ( count > 1 )
-        {
-          delta = zone[1].org_ref - zone[0].org_ref;
-          if ( zone->org_delta > delta )
-            zone->org_delta = delta;
-        }
-
-        zone->org_bottom = zone->org_ref;
-        zone->org_top    = zone->org_delta + zone->org_ref;
-      }
-    }
-
-    /* sanitize bottom table */
-    if ( count_bot > 0 )
-    {
-      PSH_Blue_Zone  zone = bot_table->zones;
-
-
-      for ( count = count_bot; count > 0; count--, zone++ )
-      {
-        FT_Int  delta;
-
-
-        if ( count > 1 )
-        {
-          delta = zone[0].org_ref - zone[1].org_ref;
-          if ( zone->org_delta < delta )
-            zone->org_delta = delta;
-        }
-
-        zone->org_top    = zone->org_ref;
-        zone->org_bottom = zone->org_delta + zone->org_ref;
-      }
-    }
-
-    /* expand top and bottom tables with blue fuzz */
-    {
-      FT_Int         dim, top, bot, delta;
-      PSH_Blue_Zone  zone;
-
-
-      zone  = top_table->zones;
-      count = count_top;
-
-      for ( dim = 1; dim >= 0; dim-- )
-      {
-        if ( count > 0 )
-        {
-          /* expand the bottom of the lowest zone normally */
-          zone->org_bottom -= fuzz;
-
-          /* expand the top and bottom of intermediate zones;    */
-          /* checking that the interval is smaller than the fuzz */
-          top = zone->org_top;
-
-          for ( count--; count > 0; count-- )
-          {
-            bot   = zone[1].org_bottom;
-            delta = bot - top;
-
-            if ( delta / 2 < fuzz )
-              zone[0].org_top = zone[1].org_bottom = top + delta / 2;
-            else
-            {
-              zone[0].org_top    = top + fuzz;
-              zone[1].org_bottom = bot - fuzz;
-            }
-
-            zone++;
-            top = zone->org_top;
-          }
-
-          /* expand the top of the highest zone normally */
-          zone->org_top = top + fuzz;
-        }
-        zone  = bot_table->zones;
-        count = count_bot;
-      }
-    }
-  }
-
-
-  /* reset the blues table when the device transform changes */
-  static void
-  psh_blues_scale_zones( PSH_Blues  blues,
-                         FT_Fixed   scale,
-                         FT_Pos     delta )
-  {
-    FT_UInt         count;
-    FT_UInt         num;
-    PSH_Blue_Table  table = NULL;
-
-    /*                                                        */
-    /* Determine whether we need to suppress overshoots or    */
-    /* not.  We simply need to compare the vertical scale     */
-    /* parameter to the raw bluescale value.  Here is why:    */
-    /*                                                        */
-    /*   We need to suppress overshoots for all pointsizes.   */
-    /*   At 300dpi that satisfies:                            */
-    /*                                                        */
-    /*      pointsize < 240*bluescale + 0.49                  */
-    /*                                                        */
-    /*   This corresponds to:                                 */
-    /*                                                        */
-    /*      pixelsize < 1000*bluescale + 49/24                */
-    /*                                                        */
-    /*      scale*EM_Size < 1000*bluescale + 49/24            */
-    /*                                                        */
-    /*   However, for normal Type 1 fonts, EM_Size is 1000!   */
-    /*   We thus only check:                                  */
-    /*                                                        */
-    /*      scale < bluescale + 49/24000                      */
-    /*                                                        */
-    /*   which we shorten to                                  */
-    /*                                                        */
-    /*      "scale < bluescale"                               */
-    /*                                                        */
-    /* Note that `blue_scale' is stored 1000 times its real   */
-    /* value, and that `scale' converts from font units to    */
-    /* fractional pixels.                                     */
-    /*                                                        */
-
-    /* 1000 / 64 = 125 / 8 */
-    if ( scale >= 0x20C49BAL )
-      blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 );
-    else
-      blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 );
-
-    /*                                                        */
-    /*  The blue threshold is the font units distance under   */
-    /*  which overshoots are suppressed due to the BlueShift  */
-    /*  even if the scale is greater than BlueScale.          */
-    /*                                                        */
-    /*  It is the smallest distance such that                 */
-    /*                                                        */
-    /*    dist <= BlueShift && dist*scale <= 0.5 pixels       */
-    /*                                                        */
-    {
-      FT_Int  threshold = blues->blue_shift;
-
-
-      while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 )
-        threshold--;
-
-      blues->blue_threshold = threshold;
-    }
-
-    for ( num = 0; num < 4; num++ )
-    {
-      PSH_Blue_Zone  zone;
-
-
-      switch ( num )
-      {
-      case 0:
-        table = &blues->normal_top;
-        break;
-      case 1:
-        table = &blues->normal_bottom;
-        break;
-      case 2:
-        table = &blues->family_top;
-        break;
-      default:
-        table = &blues->family_bottom;
-        break;
-      }
-
-      zone  = table->zones;
-      count = table->count;
-      for ( ; count > 0; count--, zone++ )
-      {
-        zone->cur_top    = FT_MulFix( zone->org_top,    scale ) + delta;
-        zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta;
-        zone->cur_ref    = FT_MulFix( zone->org_ref,    scale ) + delta;
-        zone->cur_delta  = FT_MulFix( zone->org_delta,  scale );
-
-        /* round scaled reference position */
-        zone->cur_ref = FT_PIX_ROUND( zone->cur_ref );
-
-#if 0
-        if ( zone->cur_ref > zone->cur_top )
-          zone->cur_ref -= 64;
-        else if ( zone->cur_ref < zone->cur_bottom )
-          zone->cur_ref += 64;
-#endif
-      }
-    }
-
-    /* process the families now */
-
-    for ( num = 0; num < 2; num++ )
-    {
-      PSH_Blue_Zone   zone1, zone2;
-      FT_UInt         count1, count2;
-      PSH_Blue_Table  normal, family;
-
-
-      switch ( num )
-      {
-      case 0:
-        normal = &blues->normal_top;
-        family = &blues->family_top;
-        break;
-
-      default:
-        normal = &blues->normal_bottom;
-        family = &blues->family_bottom;
-      }
-
-      zone1  = normal->zones;
-      count1 = normal->count;
-
-      for ( ; count1 > 0; count1--, zone1++ )
-      {
-        /* try to find a family zone whose reference position is less */
-        /* than 1 pixel far from the current zone                     */
-        zone2  = family->zones;
-        count2 = family->count;
-
-        for ( ; count2 > 0; count2--, zone2++ )
-        {
-          FT_Pos  Delta;
-
-
-          Delta = zone1->org_ref - zone2->org_ref;
-          if ( Delta < 0 )
-            Delta = -Delta;
-
-          if ( FT_MulFix( Delta, scale ) < 64 )
-          {
-            zone1->cur_top    = zone2->cur_top;
-            zone1->cur_bottom = zone2->cur_bottom;
-            zone1->cur_ref    = zone2->cur_ref;
-            zone1->cur_delta  = zone2->cur_delta;
-            break;
-          }
-        }
-      }
-    }
-  }
-
-
-  /* calculate the maximum height of given blue zones */
-  static FT_Short
-  psh_calc_max_height( FT_UInt          num,
-                       const FT_Short*  values,
-                       FT_Short         cur_max )
-  {
-    FT_UInt  count;
-
-
-    for ( count = 0; count < num; count += 2 )
-    {
-      FT_Short  cur_height = values[count + 1] - values[count];
-
-
-      if ( cur_height > cur_max )
-        cur_max = cur_height;
-    }
-
-    return cur_max;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  psh_blues_snap_stem( PSH_Blues      blues,
-                       FT_Int         stem_top,
-                       FT_Int         stem_bot,
-                       PSH_Alignment  alignment )
-  {
-    PSH_Blue_Table  table;
-    FT_UInt         count;
-    FT_Pos          delta;
-    PSH_Blue_Zone   zone;
-    FT_Int          no_shoots;
-
-
-    alignment->align = PSH_BLUE_ALIGN_NONE;
-
-    no_shoots = blues->no_overshoots;
-
-    /* look up stem top in top zones table */
-    table = &blues->normal_top;
-    count = table->count;
-    zone  = table->zones;
-
-    for ( ; count > 0; count--, zone++ )
-    {
-      delta = stem_top - zone->org_bottom;
-      if ( delta < -blues->blue_fuzz )
-        break;
-
-      if ( stem_top <= zone->org_top + blues->blue_fuzz )
-      {
-        if ( no_shoots || delta <= blues->blue_threshold )
-        {
-          alignment->align    |= PSH_BLUE_ALIGN_TOP;
-          alignment->align_top = zone->cur_ref;
-        }
-        break;
-      }
-    }
-
-    /* look up stem bottom in bottom zones table */
-    table = &blues->normal_bottom;
-    count = table->count;
-    zone  = table->zones + count-1;
-
-    for ( ; count > 0; count--, zone-- )
-    {
-      delta = zone->org_top - stem_bot;
-      if ( delta < -blues->blue_fuzz )
-        break;
-
-      if ( stem_bot >= zone->org_bottom - blues->blue_fuzz )
-      {
-        if ( no_shoots || delta < blues->blue_threshold )
-        {
-          alignment->align    |= PSH_BLUE_ALIGN_BOT;
-          alignment->align_bot = zone->cur_ref;
-        }
-        break;
-      }
-    }
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                        GLOBAL HINTS                           *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static void
-  psh_globals_destroy( PSH_Globals  globals )
-  {
-    if ( globals )
-    {
-      FT_Memory  memory;
-
-
-      memory = globals->memory;
-      globals->dimension[0].stdw.count = 0;
-      globals->dimension[1].stdw.count = 0;
-
-      globals->blues.normal_top.count    = 0;
-      globals->blues.normal_bottom.count = 0;
-      globals->blues.family_top.count    = 0;
-      globals->blues.family_bottom.count = 0;
-
-      FT_FREE( globals );
-
-#ifdef DEBUG_HINTER
-      ps_debug_globals = NULL;
-#endif
-    }
-  }
-
-
-  static FT_Error
-  psh_globals_new( FT_Memory     memory,
-                   T1_Private*   priv,
-                   PSH_Globals  *aglobals )
-  {
-    PSH_Globals  globals = NULL;
-    FT_Error     error;
-
-
-    if ( !FT_NEW( globals ) )
-    {
-      FT_UInt    count;
-      FT_Short*  read;
-
-
-      globals->memory = memory;
-
-      /* copy standard widths */
-      {
-        PSH_Dimension  dim   = &globals->dimension[1];
-        PSH_Width      write = dim->stdw.widths;
-
-
-        write->org = priv->standard_width[0];
-        write++;
-
-        read = priv->snap_widths;
-        for ( count = priv->num_snap_widths; count > 0; count-- )
-        {
-          write->org = *read;
-          write++;
-          read++;
-        }
-
-        dim->stdw.count = priv->num_snap_widths + 1;
-      }
-
-      /* copy standard heights */
-      {
-        PSH_Dimension  dim = &globals->dimension[0];
-        PSH_Width      write = dim->stdw.widths;
-
-
-        write->org = priv->standard_height[0];
-        write++;
-        read = priv->snap_heights;
-        for ( count = priv->num_snap_heights; count > 0; count-- )
-        {
-          write->org = *read;
-          write++;
-          read++;
-        }
-
-        dim->stdw.count = priv->num_snap_heights + 1;
-      }
-
-      /* copy blue zones */
-      psh_blues_set_zones( &globals->blues, priv->num_blue_values,
-                           priv->blue_values, priv->num_other_blues,
-                           priv->other_blues, priv->blue_fuzz, 0 );
-
-      psh_blues_set_zones( &globals->blues, priv->num_family_blues,
-                           priv->family_blues, priv->num_family_other_blues,
-                           priv->family_other_blues, priv->blue_fuzz, 1 );
-
-      /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */
-      {
-        FT_Fixed  max_scale;
-        FT_Short  max_height = 1;
-
-
-        max_height = psh_calc_max_height( priv->num_blue_values,
-                                          priv->blue_values,
-                                          max_height );
-        max_height = psh_calc_max_height( priv->num_other_blues,
-                                          priv->other_blues,
-                                          max_height );
-        max_height = psh_calc_max_height( priv->num_family_blues,
-                                          priv->family_blues,
-                                          max_height );
-        max_height = psh_calc_max_height( priv->num_family_other_blues,
-                                          priv->family_other_blues,
-                                          max_height );
-
-        /* BlueScale is scaled 1000 times */
-        max_scale = FT_DivFix( 1000, max_height );
-        globals->blues.blue_scale = priv->blue_scale < max_scale
-                                      ? priv->blue_scale
-                                      : max_scale;
-      }
-
-      globals->blues.blue_shift = priv->blue_shift;
-      globals->blues.blue_fuzz  = priv->blue_fuzz;
-
-      globals->dimension[0].scale_mult  = 0;
-      globals->dimension[0].scale_delta = 0;
-      globals->dimension[1].scale_mult  = 0;
-      globals->dimension[1].scale_delta = 0;
-
-#ifdef DEBUG_HINTER
-      ps_debug_globals = globals;
-#endif
-    }
-
-    *aglobals = globals;
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  psh_globals_set_scale( PSH_Globals  globals,
-                         FT_Fixed     x_scale,
-                         FT_Fixed     y_scale,
-                         FT_Fixed     x_delta,
-                         FT_Fixed     y_delta )
-  {
-    PSH_Dimension  dim;
-
-
-    dim = &globals->dimension[0];
-    if ( x_scale != dim->scale_mult  ||
-         x_delta != dim->scale_delta )
-    {
-      dim->scale_mult  = x_scale;
-      dim->scale_delta = x_delta;
-
-      psh_globals_scale_widths( globals, 0 );
-    }
-
-    dim = &globals->dimension[1];
-    if ( y_scale != dim->scale_mult  ||
-         y_delta != dim->scale_delta )
-    {
-      dim->scale_mult  = y_scale;
-      dim->scale_delta = y_delta;
-
-      psh_globals_scale_widths( globals, 1 );
-      psh_blues_scale_zones( &globals->blues, y_scale, y_delta );
-    }
-  }
-
-
-  FT_LOCAL_DEF( void )
-  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs )
-  {
-    funcs->create    = psh_globals_new;
-    funcs->set_scale = psh_globals_set_scale;
-    funcs->destroy   = psh_globals_destroy;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshglob.h b/third_party/freetype/src/pshinter/pshglob.h
deleted file mode 100644
index 8801cba..0000000
--- a/third_party/freetype/src/pshinter/pshglob.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshglob.h                                                              */
-/*                                                                         */
-/*    PostScript hinter global hinting management.                         */
-/*                                                                         */
-/*  Copyright 2001-2017 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 PSHGLOB_H_
-#define PSHGLOB_H_
-
-
-#include FT_FREETYPE_H
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    GLOBAL HINTS INTERNALS                     *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* @constant:                                                            */
-  /*    PS_GLOBALS_MAX_BLUE_ZONES                                          */
-  /*                                                                       */
-  /* @description:                                                         */
-  /*    The maximum number of blue zones in a font global hints structure. */
-  /*    See @PS_Globals_BluesRec.                                          */
-  /*                                                                       */
-#define PS_GLOBALS_MAX_BLUE_ZONES  16
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* @constant:                                                            */
-  /*    PS_GLOBALS_MAX_STD_WIDTHS                                          */
-  /*                                                                       */
-  /* @description:                                                         */
-  /*    The maximum number of standard and snap widths in either the       */
-  /*    horizontal or vertical direction.  See @PS_Globals_WidthsRec.      */
-  /*                                                                       */
-#define PS_GLOBALS_MAX_STD_WIDTHS  16
-
-
-  /* standard and snap width */
-  typedef struct  PSH_WidthRec_
-  {
-    FT_Int  org;
-    FT_Pos  cur;
-    FT_Pos  fit;
-
-  } PSH_WidthRec, *PSH_Width;
-
-
-  /* standard and snap widths table */
-  typedef struct  PSH_WidthsRec_
-  {
-    FT_UInt       count;
-    PSH_WidthRec  widths[PS_GLOBALS_MAX_STD_WIDTHS];
-
-  } PSH_WidthsRec, *PSH_Widths;
-
-
-  typedef struct  PSH_DimensionRec_
-  {
-    PSH_WidthsRec  stdw;
-    FT_Fixed       scale_mult;
-    FT_Fixed       scale_delta;
-
-  } PSH_DimensionRec, *PSH_Dimension;
-
-
-  /* blue zone descriptor */
-  typedef struct  PSH_Blue_ZoneRec_
-  {
-    FT_Int  org_ref;
-    FT_Int  org_delta;
-    FT_Int  org_top;
-    FT_Int  org_bottom;
-
-    FT_Pos  cur_ref;
-    FT_Pos  cur_delta;
-    FT_Pos  cur_bottom;
-    FT_Pos  cur_top;
-
-  } PSH_Blue_ZoneRec, *PSH_Blue_Zone;
-
-
-  typedef struct  PSH_Blue_TableRec_
-  {
-    FT_UInt           count;
-    PSH_Blue_ZoneRec  zones[PS_GLOBALS_MAX_BLUE_ZONES];
-
-  } PSH_Blue_TableRec, *PSH_Blue_Table;
-
-
-  /* blue zones table */
-  typedef struct  PSH_BluesRec_
-  {
-    PSH_Blue_TableRec  normal_top;
-    PSH_Blue_TableRec  normal_bottom;
-    PSH_Blue_TableRec  family_top;
-    PSH_Blue_TableRec  family_bottom;
-
-    FT_Fixed           blue_scale;
-    FT_Int             blue_shift;
-    FT_Int             blue_threshold;
-    FT_Int             blue_fuzz;
-    FT_Bool            no_overshoots;
-
-  } PSH_BluesRec, *PSH_Blues;
-
-
-  /* font globals.                                         */
-  /* dimension 0 => X coordinates + vertical hints/stems   */
-  /* dimension 1 => Y coordinates + horizontal hints/stems */
-  typedef struct  PSH_GlobalsRec_
-  {
-    FT_Memory         memory;
-    PSH_DimensionRec  dimension[2];
-    PSH_BluesRec      blues;
-
-  } PSH_GlobalsRec;
-
-
-#define PSH_BLUE_ALIGN_NONE  0
-#define PSH_BLUE_ALIGN_TOP   1
-#define PSH_BLUE_ALIGN_BOT   2
-
-
-  typedef struct  PSH_AlignmentRec_
-  {
-    int     align;
-    FT_Pos  align_top;
-    FT_Pos  align_bot;
-
-  } PSH_AlignmentRec, *PSH_Alignment;
-
-
-  FT_LOCAL( void )
-  psh_globals_funcs_init( PSH_Globals_FuncsRec*  funcs );
-
-
-#if 0
-  /* snap a stem width to fitter coordinates.  `org_width' is in font */
-  /* units.  The result is in device pixels (26.6 format).            */
-  FT_LOCAL( FT_Pos )
-  psh_dimension_snap_width( PSH_Dimension  dimension,
-                            FT_Int         org_width );
-#endif
-
-  FT_LOCAL( void )
-  psh_globals_set_scale( PSH_Globals  globals,
-                         FT_Fixed     x_scale,
-                         FT_Fixed     y_scale,
-                         FT_Fixed     x_delta,
-                         FT_Fixed     y_delta );
-
-  /* snap a stem to one or two blue zones */
-  FT_LOCAL( void )
-  psh_blues_snap_stem( PSH_Blues      blues,
-                       FT_Int         stem_top,
-                       FT_Int         stem_bot,
-                       PSH_Alignment  alignment );
-  /* */
-
-#ifdef DEBUG_HINTER
-  extern PSH_Globals  ps_debug_globals;
-#endif
-
-
-FT_END_HEADER
-
-
-#endif /* PSHGLOB_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshinter.c b/third_party/freetype/src/pshinter/pshinter.c
deleted file mode 100644
index e6727ae..0000000
--- a/third_party/freetype/src/pshinter/pshinter.c
+++ /dev/null
@@ -1,29 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshinter.c                                                             */
-/*                                                                         */
-/*    FreeType PostScript Hinting module                                   */
-/*                                                                         */
-/*  Copyright 2001-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "pshpic.c"
-#include "pshrec.c"
-#include "pshglob.c"
-#include "pshalgo.c"
-#include "pshmod.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshmod.c b/third_party/freetype/src/pshinter/pshmod.c
deleted file mode 100644
index 860dc0a..0000000
--- a/third_party/freetype/src/pshinter/pshmod.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshmod.c                                                               */
-/*                                                                         */
-/*    FreeType PostScript hinter module implementation (body).             */
-/*                                                                         */
-/*  Copyright 2001-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include "pshrec.h"
-#include "pshalgo.h"
-#include "pshpic.h"
-
-
-  /* the Postscript Hinter module structure */
-  typedef struct  PS_Hinter_Module_Rec_
-  {
-    FT_ModuleRec          root;
-    PS_HintsRec           ps_hints;
-
-    PSH_Globals_FuncsRec  globals_funcs;
-    T1_Hints_FuncsRec     t1_funcs;
-    T2_Hints_FuncsRec     t2_funcs;
-
-  } PS_Hinter_ModuleRec, *PS_Hinter_Module;
-
-
-  /* finalize module */
-  FT_CALLBACK_DEF( void )
-  ps_hinter_done( PS_Hinter_Module  module )
-  {
-    module->t1_funcs.hints = NULL;
-    module->t2_funcs.hints = NULL;
-
-    ps_hints_done( &module->ps_hints );
-  }
-
-
-  /* initialize module, create hints recorder and the interface */
-  FT_CALLBACK_DEF( FT_Error )
-  ps_hinter_init( PS_Hinter_Module  module )
-  {
-    FT_Memory  memory = module->root.memory;
-    void*      ph     = &module->ps_hints;
-
-
-    ps_hints_init( &module->ps_hints, memory );
-
-    psh_globals_funcs_init( &module->globals_funcs );
-
-    t1_hints_funcs_init( &module->t1_funcs );
-    module->t1_funcs.hints = (T1_Hints)ph;
-
-    t2_hints_funcs_init( &module->t2_funcs );
-    module->t2_funcs.hints = (T2_Hints)ph;
-
-    return 0;
-  }
-
-
-  /* returns global hints interface */
-  FT_CALLBACK_DEF( PSH_Globals_Funcs )
-  pshinter_get_globals_funcs( FT_Module  module )
-  {
-    return &((PS_Hinter_Module)module)->globals_funcs;
-  }
-
-
-  /* return Type 1 hints interface */
-  FT_CALLBACK_DEF( T1_Hints_Funcs )
-  pshinter_get_t1_funcs( FT_Module  module )
-  {
-    return &((PS_Hinter_Module)module)->t1_funcs;
-  }
-
-
-  /* return Type 2 hints interface */
-  FT_CALLBACK_DEF( T2_Hints_Funcs )
-  pshinter_get_t2_funcs( FT_Module  module )
-  {
-    return &((PS_Hinter_Module)module)->t2_funcs;
-  }
-
-
-  FT_DEFINE_PSHINTER_INTERFACE(
-    pshinter_interface,
-
-    pshinter_get_globals_funcs,
-    pshinter_get_t1_funcs,
-    pshinter_get_t2_funcs
-  )
-
-
-  FT_DEFINE_MODULE(
-    pshinter_module_class,
-
-    0,
-    sizeof ( PS_Hinter_ModuleRec ),
-    "pshinter",
-    0x10000L,
-    0x20000L,
-
-    &PSHINTER_INTERFACE_GET,              /* module-specific interface */
-
-    (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/third_party/freetype/src/pshinter/pshmod.h b/third_party/freetype/src/pshinter/pshmod.h
deleted file mode 100644
index 1d2b40f..0000000
--- a/third_party/freetype/src/pshinter/pshmod.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshmod.h                                                               */
-/*                                                                         */
-/*    PostScript hinter module interface (specification).                  */
-/*                                                                         */
-/*  Copyright 2001-2017 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 PSHMOD_H_
-#define PSHMOD_H_
-
-
-#include <ft2build.h>
-#include FT_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_MODULE( pshinter_module_class )
-
-
-FT_END_HEADER
-
-
-#endif /* PSHMOD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshnterr.h b/third_party/freetype/src/pshinter/pshnterr.h
deleted file mode 100644
index 73d144e..0000000
--- a/third_party/freetype/src/pshinter/pshnterr.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshnterr.h                                                             */
-/*                                                                         */
-/*    PS Hinter error codes (specification only).                          */
-/*                                                                         */
-/*  Copyright 2003-2017 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 used to define the PSHinter error enumeration constants. */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef PSHNTERR_H_
-#define PSHNTERR_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  PSH_Err_
-#define FT_ERR_BASE    FT_Mod_Err_PShinter
-
-#include FT_ERRORS_H
-
-#endif /* PSHNTERR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshpic.c b/third_party/freetype/src/pshinter/pshpic.c
deleted file mode 100644
index c0d3a64..0000000
--- a/third_party/freetype/src/pshinter/pshpic.c
+++ /dev/null
@@ -1,76 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshpic.c                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for pshinter module. */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "pshpic.h"
-#include "pshnterr.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from pshmod.c */
-  void
-  FT_Init_Class_pshinter_interface( FT_Library           library,
-                                    PSHinter_Interface*  clazz );
-
-  void
-  pshinter_module_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->pshinter )
-    {
-      FT_FREE( pic_container->pshinter );
-      pic_container->pshinter = NULL;
-    }
-  }
-
-
-  FT_Error
-  pshinter_module_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    PSHinterPIC*       container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->pshinter = container;
-
-    /* add call to initialization function when you add new scripts */
-    FT_Init_Class_pshinter_interface(
-      library, &container->pshinter_interface );
-
-    if ( error )
-      pshinter_module_class_pic_free( library );
-
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshpic.h b/third_party/freetype/src/pshinter/pshpic.h
deleted file mode 100644
index 8d9a01c..0000000
--- a/third_party/freetype/src/pshinter/pshpic.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshpic.h                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for pshinter module. */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 PSHPIC_H_
-#define PSHPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define PSHINTER_INTERFACE_GET  pshinter_interface
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
-
-FT_BEGIN_HEADER
-
-  typedef struct  PSHinterPIC_
-  {
-    PSHinter_Interface  pshinter_interface;
-
-  } PSHinterPIC;
-
-
-#define GET_PIC( lib )  ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) )
-
-#define PSHINTER_INTERFACE_GET  ( GET_PIC( library )->pshinter_interface )
-
-  /* see pshpic.c for the implementation */
-  void
-  pshinter_module_class_pic_free( FT_Library  library );
-
-  FT_Error
-  pshinter_module_class_pic_init( FT_Library  library );
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-#endif /* PSHPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshrec.c b/third_party/freetype/src/pshinter/pshrec.c
deleted file mode 100644
index fff6d34..0000000
--- a/third_party/freetype/src/pshinter/pshrec.c
+++ /dev/null
@@ -1,1220 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshrec.c                                                               */
-/*                                                                         */
-/*    FreeType PostScript hints recorder (body).                           */
-/*                                                                         */
-/*  Copyright 2001-2017 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_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_CALC_H
-
-#include "pshrec.h"
-#include "pshalgo.h"
-
-#include "pshnterr.h"
-
-#undef  FT_COMPONENT
-#define FT_COMPONENT  trace_pshrec
-
-#ifdef DEBUG_HINTER
-  PS_Hints  ps_debug_hints         = NULL;
-  int       ps_debug_no_horz_hints = 0;
-  int       ps_debug_no_vert_hints = 0;
-#endif
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                      PS_HINT MANAGEMENT                       *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* destroy hints table */
-  static void
-  ps_hint_table_done( PS_Hint_Table  table,
-                      FT_Memory      memory )
-  {
-    FT_FREE( table->hints );
-    table->num_hints = 0;
-    table->max_hints = 0;
-  }
-
-
-  /* ensure that a table can contain "count" elements */
-  static FT_Error
-  ps_hint_table_ensure( PS_Hint_Table  table,
-                        FT_UInt        count,
-                        FT_Memory      memory )
-  {
-    FT_UInt   old_max = table->max_hints;
-    FT_UInt   new_max = count;
-    FT_Error  error   = FT_Err_Ok;
-
-
-    if ( new_max > old_max )
-    {
-      /* try to grow the table */
-      new_max = FT_PAD_CEIL( new_max, 8 );
-      if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) )
-        table->max_hints = new_max;
-    }
-    return error;
-  }
-
-
-  static FT_Error
-  ps_hint_table_alloc( PS_Hint_Table  table,
-                       FT_Memory      memory,
-                       PS_Hint       *ahint )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UInt   count;
-    PS_Hint   hint = NULL;
-
-
-    count = table->num_hints;
-    count++;
-
-    if ( count >= table->max_hints )
-    {
-      error = ps_hint_table_ensure( table, count, memory );
-      if ( error )
-        goto Exit;
-    }
-
-    hint        = table->hints + count - 1;
-    hint->pos   = 0;
-    hint->len   = 0;
-    hint->flags = 0;
-
-    table->num_hints = count;
-
-  Exit:
-    *ahint = hint;
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                      PS_MASK MANAGEMENT                       *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* destroy mask */
-  static void
-  ps_mask_done( PS_Mask    mask,
-                FT_Memory  memory )
-  {
-    FT_FREE( mask->bytes );
-    mask->num_bits  = 0;
-    mask->max_bits  = 0;
-    mask->end_point = 0;
-  }
-
-
-  /* ensure that a mask can contain "count" bits */
-  static FT_Error
-  ps_mask_ensure( PS_Mask    mask,
-                  FT_UInt    count,
-                  FT_Memory  memory )
-  {
-    FT_UInt   old_max = ( mask->max_bits + 7 ) >> 3;
-    FT_UInt   new_max = ( count          + 7 ) >> 3;
-    FT_Error  error   = FT_Err_Ok;
-
-
-    if ( new_max > old_max )
-    {
-      new_max = FT_PAD_CEIL( new_max, 8 );
-      if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) )
-        mask->max_bits = new_max * 8;
-    }
-    return error;
-  }
-
-
-  /* test a bit value in a given mask */
-  static FT_Int
-  ps_mask_test_bit( PS_Mask  mask,
-                    FT_Int   idx )
-  {
-    if ( (FT_UInt)idx >= mask->num_bits )
-      return 0;
-
-    return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) );
-  }
-
-
-  /* clear a given bit */
-  static void
-  ps_mask_clear_bit( PS_Mask  mask,
-                     FT_UInt  idx )
-  {
-    FT_Byte*  p;
-
-
-    if ( idx >= mask->num_bits )
-      return;
-
-    p    = mask->bytes + ( idx >> 3 );
-    p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) );
-  }
-
-
-  /* set a given bit, possibly grow the mask */
-  static FT_Error
-  ps_mask_set_bit( PS_Mask    mask,
-                   FT_UInt    idx,
-                   FT_Memory  memory )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_Byte*  p;
-
-
-    if ( idx >= mask->num_bits )
-    {
-      error = ps_mask_ensure( mask, idx + 1, memory );
-      if ( error )
-        goto Exit;
-
-      mask->num_bits = idx + 1;
-    }
-
-    p    = mask->bytes + ( idx >> 3 );
-    p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) );
-
-  Exit:
-    return error;
-  }
-
-
-  /* destroy mask table */
-  static void
-  ps_mask_table_done( PS_Mask_Table  table,
-                      FT_Memory      memory )
-  {
-    FT_UInt  count = table->max_masks;
-    PS_Mask  mask  = table->masks;
-
-
-    for ( ; count > 0; count--, mask++ )
-      ps_mask_done( mask, memory );
-
-    FT_FREE( table->masks );
-    table->num_masks = 0;
-    table->max_masks = 0;
-  }
-
-
-  /* ensure that a mask table can contain "count" masks */
-  static FT_Error
-  ps_mask_table_ensure( PS_Mask_Table  table,
-                        FT_UInt        count,
-                        FT_Memory      memory )
-  {
-    FT_UInt   old_max = table->max_masks;
-    FT_UInt   new_max = count;
-    FT_Error  error   = FT_Err_Ok;
-
-
-    if ( new_max > old_max )
-    {
-      new_max = FT_PAD_CEIL( new_max, 8 );
-      if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) )
-        table->max_masks = new_max;
-    }
-    return error;
-  }
-
-
-  /* allocate a new mask in a table */
-  static FT_Error
-  ps_mask_table_alloc( PS_Mask_Table  table,
-                       FT_Memory      memory,
-                       PS_Mask       *amask )
-  {
-    FT_UInt   count;
-    FT_Error  error = FT_Err_Ok;
-    PS_Mask   mask  = NULL;
-
-
-    count = table->num_masks;
-    count++;
-
-    if ( count > table->max_masks )
-    {
-      error = ps_mask_table_ensure( table, count, memory );
-      if ( error )
-        goto Exit;
-    }
-
-    mask             = table->masks + count - 1;
-    mask->num_bits   = 0;
-    mask->end_point  = 0;
-    table->num_masks = count;
-
-  Exit:
-    *amask = mask;
-    return error;
-  }
-
-
-  /* return last hint mask in a table, create one if the table is empty */
-  static FT_Error
-  ps_mask_table_last( PS_Mask_Table  table,
-                      FT_Memory      memory,
-                      PS_Mask       *amask )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UInt   count;
-    PS_Mask   mask;
-
-
-    count = table->num_masks;
-    if ( count == 0 )
-    {
-      error = ps_mask_table_alloc( table, memory, &mask );
-      if ( error )
-        goto Exit;
-    }
-    else
-      mask = table->masks + count - 1;
-
-  Exit:
-    *amask = mask;
-    return error;
-  }
-
-
-  /* set a new mask to a given bit range */
-  static FT_Error
-  ps_mask_table_set_bits( PS_Mask_Table   table,
-                          const FT_Byte*  source,
-                          FT_UInt         bit_pos,
-                          FT_UInt         bit_count,
-                          FT_Memory       memory )
-  {
-    FT_Error  error;
-    PS_Mask   mask;
-
-
-    error = ps_mask_table_last( table, memory, &mask );
-    if ( error )
-      goto Exit;
-
-    error = ps_mask_ensure( mask, bit_count, memory );
-    if ( error )
-      goto Exit;
-
-    mask->num_bits = bit_count;
-
-    /* now, copy bits */
-    {
-      FT_Byte*  read  = (FT_Byte*)source + ( bit_pos >> 3 );
-      FT_Int    rmask = 0x80 >> ( bit_pos & 7 );
-      FT_Byte*  write = mask->bytes;
-      FT_Int    wmask = 0x80;
-      FT_Int    val;
-
-
-      for ( ; bit_count > 0; bit_count-- )
-      {
-        val = write[0] & ~wmask;
-
-        if ( read[0] & rmask )
-          val |= wmask;
-
-        write[0] = (FT_Byte)val;
-
-        rmask >>= 1;
-        if ( rmask == 0 )
-        {
-          read++;
-          rmask = 0x80;
-        }
-
-        wmask >>= 1;
-        if ( wmask == 0 )
-        {
-          write++;
-          wmask = 0x80;
-        }
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* test whether two masks in a table intersect */
-  static FT_Int
-  ps_mask_table_test_intersect( PS_Mask_Table  table,
-                                FT_UInt        index1,
-                                FT_UInt        index2 )
-  {
-    PS_Mask   mask1  = table->masks + index1;
-    PS_Mask   mask2  = table->masks + index2;
-    FT_Byte*  p1     = mask1->bytes;
-    FT_Byte*  p2     = mask2->bytes;
-    FT_UInt   count1 = mask1->num_bits;
-    FT_UInt   count2 = mask2->num_bits;
-    FT_UInt   count;
-
-
-    count = FT_MIN( count1, count2 );
-    for ( ; count >= 8; count -= 8 )
-    {
-      if ( p1[0] & p2[0] )
-        return 1;
-
-      p1++;
-      p2++;
-    }
-
-    if ( count == 0 )
-      return 0;
-
-    return ( p1[0] & p2[0] ) & ~( 0xFF >> count );
-  }
-
-
-  /* merge two masks, used by ps_mask_table_merge_all */
-  static FT_Error
-  ps_mask_table_merge( PS_Mask_Table  table,
-                       FT_UInt        index1,
-                       FT_UInt        index2,
-                       FT_Memory      memory )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* swap index1 and index2 so that index1 < index2 */
-    if ( index1 > index2 )
-    {
-      FT_UInt  temp;
-
-
-      temp   = index1;
-      index1 = index2;
-      index2 = temp;
-    }
-
-    if ( index1 < index2 && index2 < table->num_masks )
-    {
-      /* we need to merge the bitsets of index1 and index2 with a */
-      /* simple union                                             */
-      PS_Mask  mask1  = table->masks + index1;
-      PS_Mask  mask2  = table->masks + index2;
-      FT_UInt  count1 = mask1->num_bits;
-      FT_UInt  count2 = mask2->num_bits;
-      FT_Int   delta;
-
-
-      if ( count2 > 0 )
-      {
-        FT_UInt   pos;
-        FT_Byte*  read;
-        FT_Byte*  write;
-
-
-        /* if "count2" is greater than "count1", we need to grow the */
-        /* first bitset, and clear the highest bits                  */
-        if ( count2 > count1 )
-        {
-          error = ps_mask_ensure( mask1, count2, memory );
-          if ( error )
-            goto Exit;
-
-          for ( pos = count1; pos < count2; pos++ )
-            ps_mask_clear_bit( mask1, pos );
-        }
-
-        /* merge (unite) the bitsets */
-        read  = mask2->bytes;
-        write = mask1->bytes;
-        pos   = ( count2 + 7 ) >> 3;
-
-        for ( ; pos > 0; pos-- )
-        {
-          write[0] = (FT_Byte)( write[0] | read[0] );
-          write++;
-          read++;
-        }
-      }
-
-      /* Now, remove "mask2" from the list.  We need to keep the masks */
-      /* sorted in order of importance, so move table elements.        */
-      mask2->num_bits  = 0;
-      mask2->end_point = 0;
-
-      /* number of masks to move */
-      delta = (FT_Int)( table->num_masks - 1 - index2 );
-      if ( delta > 0 )
-      {
-        /* move to end of table for reuse */
-        PS_MaskRec  dummy = *mask2;
-
-
-        ft_memmove( mask2,
-                    mask2 + 1,
-                    (FT_UInt)delta * sizeof ( PS_MaskRec ) );
-
-        mask2[delta] = dummy;
-      }
-
-      table->num_masks--;
-    }
-    else
-      FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n",
-                  index1, index2 ));
-
-  Exit:
-    return error;
-  }
-
-
-  /* Try to merge all masks in a given table.  This is used to merge */
-  /* all counter masks into independent counter "paths".             */
-  /*                                                                 */
-  static FT_Error
-  ps_mask_table_merge_all( PS_Mask_Table  table,
-                           FT_Memory      memory )
-  {
-    FT_Int    index1, index2;
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* both loops go down to 0, thus FT_Int for index1 and index2 */
-    for ( index1 = (FT_Int)table->num_masks - 1; index1 > 0; index1-- )
-    {
-      for ( index2 = index1 - 1; index2 >= 0; index2-- )
-      {
-        if ( ps_mask_table_test_intersect( table,
-                                           (FT_UInt)index1,
-                                           (FT_UInt)index2 ) )
-        {
-          error = ps_mask_table_merge( table,
-                                       (FT_UInt)index2,
-                                       (FT_UInt)index1,
-                                       memory );
-          if ( error )
-            goto Exit;
-
-          break;
-        }
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    PS_DIMENSION MANAGEMENT                    *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* finalize a given dimension */
-  static void
-  ps_dimension_done( PS_Dimension  dimension,
-                     FT_Memory     memory )
-  {
-    ps_mask_table_done( &dimension->counters, memory );
-    ps_mask_table_done( &dimension->masks,    memory );
-    ps_hint_table_done( &dimension->hints,    memory );
-  }
-
-
-  /* initialize a given dimension */
-  static void
-  ps_dimension_init( PS_Dimension  dimension )
-  {
-    dimension->hints.num_hints    = 0;
-    dimension->masks.num_masks    = 0;
-    dimension->counters.num_masks = 0;
-  }
-
-
-#if 0
-
-  /* set a bit at a given index in the current hint mask */
-  static FT_Error
-  ps_dimension_set_mask_bit( PS_Dimension  dim,
-                             FT_UInt       idx,
-                             FT_Memory     memory )
-  {
-    PS_Mask   mask;
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* get last hint mask */
-    error = ps_mask_table_last( &dim->masks, memory, &mask );
-    if ( error )
-      goto Exit;
-
-    error = ps_mask_set_bit( mask, idx, memory );
-
-  Exit:
-    return error;
-  }
-
-#endif
-
-  /* set the end point in a mask, called from "End" & "Reset" methods */
-  static void
-  ps_dimension_end_mask( PS_Dimension  dim,
-                         FT_UInt       end_point )
-  {
-    FT_UInt  count = dim->masks.num_masks;
-
-
-    if ( count > 0 )
-    {
-      PS_Mask  mask = dim->masks.masks + count - 1;
-
-
-      mask->end_point = end_point;
-    }
-  }
-
-
-  /* set the end point in the current mask, then create a new empty one */
-  /* (called by "Reset" method)                                         */
-  static FT_Error
-  ps_dimension_reset_mask( PS_Dimension  dim,
-                           FT_UInt       end_point,
-                           FT_Memory     memory )
-  {
-    PS_Mask  mask;
-
-
-    /* end current mask */
-    ps_dimension_end_mask( dim, end_point );
-
-    /* allocate new one */
-    return ps_mask_table_alloc( &dim->masks, memory, &mask );
-  }
-
-
-  /* set a new mask, called from the "T2Stem" method */
-  static FT_Error
-  ps_dimension_set_mask_bits( PS_Dimension    dim,
-                              const FT_Byte*  source,
-                              FT_UInt         source_pos,
-                              FT_UInt         source_bits,
-                              FT_UInt         end_point,
-                              FT_Memory       memory )
-  {
-    FT_Error  error;
-
-
-    /* reset current mask, if any */
-    error = ps_dimension_reset_mask( dim, end_point, memory );
-    if ( error )
-      goto Exit;
-
-    /* set bits in new mask */
-    error = ps_mask_table_set_bits( &dim->masks, source,
-                                    source_pos, source_bits, memory );
-
-  Exit:
-    return error;
-  }
-
-
-  /* add a new single stem (called from "T1Stem" method) */
-  static FT_Error
-  ps_dimension_add_t1stem( PS_Dimension  dim,
-                           FT_Int        pos,
-                           FT_Int        len,
-                           FT_Memory     memory,
-                           FT_Int       *aindex )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UInt   flags = 0;
-
-
-    /* detect ghost stem */
-    if ( len < 0 )
-    {
-      flags |= PS_HINT_FLAG_GHOST;
-      if ( len == -21 )
-      {
-        flags |= PS_HINT_FLAG_BOTTOM;
-        pos   += len;
-      }
-      len = 0;
-    }
-
-    if ( aindex )
-      *aindex = -1;
-
-    /* now, lookup stem in the current hints table */
-    {
-      PS_Mask  mask;
-      FT_UInt  idx;
-      FT_UInt  max  = dim->hints.num_hints;
-      PS_Hint  hint = dim->hints.hints;
-
-
-      for ( idx = 0; idx < max; idx++, hint++ )
-      {
-        if ( hint->pos == pos && hint->len == len )
-          break;
-      }
-
-      /* we need to create a new hint in the table */
-      if ( idx >= max )
-      {
-        error = ps_hint_table_alloc( &dim->hints, memory, &hint );
-        if ( error )
-          goto Exit;
-
-        hint->pos   = pos;
-        hint->len   = len;
-        hint->flags = flags;
-      }
-
-      /* now, store the hint in the current mask */
-      error = ps_mask_table_last( &dim->masks, memory, &mask );
-      if ( error )
-        goto Exit;
-
-      error = ps_mask_set_bit( mask, idx, memory );
-      if ( error )
-        goto Exit;
-
-      if ( aindex )
-        *aindex = (FT_Int)idx;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* add a "hstem3/vstem3" counter to our dimension table */
-  static FT_Error
-  ps_dimension_add_counter( PS_Dimension  dim,
-                            FT_Int        hint1,
-                            FT_Int        hint2,
-                            FT_Int        hint3,
-                            FT_Memory     memory )
-  {
-    FT_Error  error   = FT_Err_Ok;
-    FT_UInt   count   = dim->counters.num_masks;
-    PS_Mask   counter = dim->counters.masks;
-
-
-    /* try to find an existing counter mask that already uses */
-    /* one of these stems here                                */
-    for ( ; count > 0; count--, counter++ )
-    {
-      if ( ps_mask_test_bit( counter, hint1 ) ||
-           ps_mask_test_bit( counter, hint2 ) ||
-           ps_mask_test_bit( counter, hint3 ) )
-        break;
-    }
-
-    /* create a new counter when needed */
-    if ( count == 0 )
-    {
-      error = ps_mask_table_alloc( &dim->counters, memory, &counter );
-      if ( error )
-        goto Exit;
-    }
-
-    /* now, set the bits for our hints in the counter mask */
-    if ( hint1 >= 0 )
-    {
-      error = ps_mask_set_bit( counter, (FT_UInt)hint1, memory );
-      if ( error )
-        goto Exit;
-    }
-
-    if ( hint2 >= 0 )
-    {
-      error = ps_mask_set_bit( counter, (FT_UInt)hint2, memory );
-      if ( error )
-        goto Exit;
-    }
-
-    if ( hint3 >= 0 )
-    {
-      error = ps_mask_set_bit( counter, (FT_UInt)hint3, memory );
-      if ( error )
-        goto Exit;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* end of recording session for a given dimension */
-  static FT_Error
-  ps_dimension_end( PS_Dimension  dim,
-                    FT_UInt       end_point,
-                    FT_Memory     memory )
-  {
-    /* end hint mask table */
-    ps_dimension_end_mask( dim, end_point );
-
-    /* merge all counter masks into independent "paths" */
-    return ps_mask_table_merge_all( &dim->counters, memory );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    PS_RECORDER MANAGEMENT                     *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* destroy hints */
-  FT_LOCAL( void )
-  ps_hints_done( PS_Hints  hints )
-  {
-    FT_Memory  memory = hints->memory;
-
-
-    ps_dimension_done( &hints->dimension[0], memory );
-    ps_dimension_done( &hints->dimension[1], memory );
-
-    hints->error  = FT_Err_Ok;
-    hints->memory = NULL;
-  }
-
-
-  FT_LOCAL( void )
-  ps_hints_init( PS_Hints   hints,
-                 FT_Memory  memory )
-  {
-    FT_ZERO( hints );
-    hints->memory = memory;
-  }
-
-
-  /* initialize a hints for a new session */
-  static void
-  ps_hints_open( PS_Hints      hints,
-                 PS_Hint_Type  hint_type )
-  {
-    hints->error     = FT_Err_Ok;
-    hints->hint_type = hint_type;
-
-    ps_dimension_init( &hints->dimension[0] );
-    ps_dimension_init( &hints->dimension[1] );
-  }
-
-
-  /* add one or more stems to the current hints table */
-  static void
-  ps_hints_stem( PS_Hints  hints,
-                 FT_UInt   dimension,
-                 FT_Int    count,
-                 FT_Long*  stems )
-  {
-    PS_Dimension  dim;
-
-
-    if ( hints->error )
-      return;
-
-    /* limit "dimension" to 0..1 */
-    if ( dimension > 1 )
-    {
-      FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n",
-                  dimension ));
-      dimension = ( dimension != 0 );
-    }
-
-    /* record the stems in the current hints/masks table */
-    /* (Type 1 & 2's `hstem' or `vstem' operators)       */
-    dim = &hints->dimension[dimension];
-
-    for ( ; count > 0; count--, stems += 2 )
-    {
-      FT_Error   error;
-      FT_Memory  memory = hints->memory;
-
-
-      error = ps_dimension_add_t1stem( dim,
-                                       (FT_Int)stems[0],
-                                       (FT_Int)stems[1],
-                                       memory,
-                                       NULL );
-      if ( error )
-      {
-        FT_ERROR(( "ps_hints_stem: could not add stem"
-                   " (%d,%d) to hints table\n", stems[0], stems[1] ));
-
-        hints->error = error;
-        return;
-      }
-    }
-  }
-
-
-  /* add one Type1 counter stem to the current hints table */
-  static void
-  ps_hints_t1stem3( PS_Hints   hints,
-                    FT_UInt    dimension,
-                    FT_Fixed*  stems )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( !hints->error )
-    {
-      PS_Dimension  dim;
-      FT_Memory     memory = hints->memory;
-      FT_Int        count;
-      FT_Int        idx[3];
-
-
-      /* limit "dimension" to 0..1 */
-      if ( dimension > 1 )
-      {
-        FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n",
-                    dimension ));
-        dimension = ( dimension != 0 );
-      }
-
-      dim = &hints->dimension[dimension];
-
-      /* there must be 6 elements in the 'stem' array */
-      if ( hints->hint_type == PS_HINT_TYPE_1 )
-      {
-        /* add the three stems to our hints/masks table */
-        for ( count = 0; count < 3; count++, stems += 2 )
-        {
-          error = ps_dimension_add_t1stem( dim,
-                                           (FT_Int)FIXED_TO_INT( stems[0] ),
-                                           (FT_Int)FIXED_TO_INT( stems[1] ),
-                                           memory, &idx[count] );
-          if ( error )
-            goto Fail;
-        }
-
-        /* now, add the hints to the counters table */
-        error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2],
-                                          memory );
-        if ( error )
-          goto Fail;
-      }
-      else
-      {
-        FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" ));
-        error = FT_THROW( Invalid_Argument );
-        goto Fail;
-      }
-    }
-
-    return;
-
-  Fail:
-    FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" ));
-    hints->error = error;
-  }
-
-
-  /* reset hints (only with Type 1 hints) */
-  static void
-  ps_hints_t1reset( PS_Hints  hints,
-                    FT_UInt   end_point )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( !hints->error )
-    {
-      FT_Memory  memory = hints->memory;
-
-
-      if ( hints->hint_type == PS_HINT_TYPE_1 )
-      {
-        error = ps_dimension_reset_mask( &hints->dimension[0],
-                                         end_point, memory );
-        if ( error )
-          goto Fail;
-
-        error = ps_dimension_reset_mask( &hints->dimension[1],
-                                         end_point, memory );
-        if ( error )
-          goto Fail;
-      }
-      else
-      {
-        /* invalid hint type */
-        error = FT_THROW( Invalid_Argument );
-        goto Fail;
-      }
-    }
-    return;
-
-  Fail:
-    hints->error = error;
-  }
-
-
-  /* Type2 "hintmask" operator, add a new hintmask to each direction */
-  static void
-  ps_hints_t2mask( PS_Hints        hints,
-                   FT_UInt         end_point,
-                   FT_UInt         bit_count,
-                   const FT_Byte*  bytes )
-  {
-    FT_Error  error;
-
-
-    if ( !hints->error )
-    {
-      PS_Dimension  dim    = hints->dimension;
-      FT_Memory     memory = hints->memory;
-      FT_UInt       count1 = dim[0].hints.num_hints;
-      FT_UInt       count2 = dim[1].hints.num_hints;
-
-
-      /* check bit count; must be equal to current total hint count */
-      if ( bit_count !=  count1 + count2 )
-      {
-        FT_TRACE0(( "ps_hints_t2mask:"
-                    " called with invalid bitcount %d (instead of %d)\n",
-                   bit_count, count1 + count2 ));
-
-        /* simply ignore the operator */
-        return;
-      }
-
-      /* set-up new horizontal and vertical hint mask now */
-      error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1,
-                                          end_point, memory );
-      if ( error )
-        goto Fail;
-
-      error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2,
-                                          end_point, memory );
-      if ( error )
-        goto Fail;
-    }
-    return;
-
-  Fail:
-    hints->error = error;
-  }
-
-
-  static void
-  ps_hints_t2counter( PS_Hints        hints,
-                      FT_UInt         bit_count,
-                      const FT_Byte*  bytes )
-  {
-    FT_Error  error;
-
-
-    if ( !hints->error )
-    {
-      PS_Dimension  dim    = hints->dimension;
-      FT_Memory     memory = hints->memory;
-      FT_UInt       count1 = dim[0].hints.num_hints;
-      FT_UInt       count2 = dim[1].hints.num_hints;
-
-
-      /* check bit count, must be equal to current total hint count */
-      if ( bit_count !=  count1 + count2 )
-      {
-        FT_TRACE0(( "ps_hints_t2counter:"
-                    " called with invalid bitcount %d (instead of %d)\n",
-                   bit_count, count1 + count2 ));
-
-        /* simply ignore the operator */
-        return;
-      }
-
-      /* set-up new horizontal and vertical hint mask now */
-      error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1,
-                                          0, memory );
-      if ( error )
-        goto Fail;
-
-      error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2,
-                                          0, memory );
-      if ( error )
-        goto Fail;
-    }
-    return;
-
-  Fail:
-    hints->error = error;
-  }
-
-
-  /* end recording session */
-  static FT_Error
-  ps_hints_close( PS_Hints  hints,
-                  FT_UInt   end_point )
-  {
-    FT_Error  error;
-
-
-    error = hints->error;
-    if ( !error )
-    {
-      FT_Memory     memory = hints->memory;
-      PS_Dimension  dim    = hints->dimension;
-
-
-      error = ps_dimension_end( &dim[0], end_point, memory );
-      if ( !error )
-      {
-        error = ps_dimension_end( &dim[1], end_point, memory );
-      }
-    }
-
-#ifdef DEBUG_HINTER
-    if ( !error )
-      ps_debug_hints = hints;
-#endif
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                TYPE 1 HINTS RECORDING INTERFACE               *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static void
-  t1_hints_open( T1_Hints  hints )
-  {
-    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 );
-  }
-
-  static void
-  t1_hints_stem( T1_Hints   hints,
-                 FT_UInt    dimension,
-                 FT_Fixed*  coords )
-  {
-    FT_Pos  stems[2];
-
-
-    stems[0] = FIXED_TO_INT( coords[0] );
-    stems[1] = FIXED_TO_INT( coords[1] );
-
-    ps_hints_stem( (PS_Hints)hints, dimension, 1, stems );
-  }
-
-
-  FT_LOCAL_DEF( void )
-  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs )
-  {
-    FT_ZERO( funcs );
-
-    funcs->open  = (T1_Hints_OpenFunc)    t1_hints_open;
-    funcs->close = (T1_Hints_CloseFunc)   ps_hints_close;
-    funcs->stem  = (T1_Hints_SetStemFunc) t1_hints_stem;
-    funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3;
-    funcs->reset = (T1_Hints_ResetFunc)   ps_hints_t1reset;
-    funcs->apply = (T1_Hints_ApplyFunc)   ps_hints_apply;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                TYPE 2 HINTS RECORDING INTERFACE               *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static void
-  t2_hints_open( T2_Hints  hints )
-  {
-    ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 );
-  }
-
-
-  static void
-  t2_hints_stems( T2_Hints   hints,
-                  FT_UInt    dimension,
-                  FT_Int     count,
-                  FT_Fixed*  coords )
-  {
-    FT_Pos  stems[32], y;
-    FT_Int  total = count, n;
-
-
-    y = 0;
-    while ( total > 0 )
-    {
-      /* determine number of stems to write */
-      count = total;
-      if ( count > 16 )
-        count = 16;
-
-      /* compute integer stem positions in font units */
-      for ( n = 0; n < count * 2; n++ )
-      {
-        y       += coords[n];
-        stems[n] = FIXED_TO_INT( y );
-      }
-
-      /* compute lengths */
-      for ( n = 0; n < count * 2; n += 2 )
-        stems[n + 1] = stems[n + 1] - stems[n];
-
-      /* add them to the current dimension */
-      ps_hints_stem( (PS_Hints)hints, dimension, count, stems );
-
-      total -= count;
-    }
-  }
-
-
-  FT_LOCAL_DEF( void )
-  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs )
-  {
-    FT_ZERO( funcs );
-
-    funcs->open    = (T2_Hints_OpenFunc)   t2_hints_open;
-    funcs->close   = (T2_Hints_CloseFunc)  ps_hints_close;
-    funcs->stems   = (T2_Hints_StemsFunc)  t2_hints_stems;
-    funcs->hintmask= (T2_Hints_MaskFunc)   ps_hints_t2mask;
-    funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter;
-    funcs->apply   = (T2_Hints_ApplyFunc)  ps_hints_apply;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/pshinter/pshrec.h b/third_party/freetype/src/pshinter/pshrec.h
deleted file mode 100644
index e10bc2b..0000000
--- a/third_party/freetype/src/pshinter/pshrec.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pshrec.h                                                               */
-/*                                                                         */
-/*    Postscript (Type1/Type2) hints recorder (specification).             */
-/*                                                                         */
-/*  Copyright 2001-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /**************************************************************************/
-  /*                                                                        */
-  /*  The functions defined here are called from the Type 1, CID and CFF    */
-  /*  font drivers to record the hints of a given character/glyph.          */
-  /*                                                                        */
-  /*  The hints are recorded in a unified format, and are later processed   */
-  /*  by the `optimizer' and `fitter' to adjust the outlines to the pixel   */
-  /*  grid.                                                                 */
-  /*                                                                        */
-  /**************************************************************************/
-
-
-#ifndef PSHREC_H_
-#define PSHREC_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_POSTSCRIPT_HINTS_H
-#include "pshglob.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                 GLYPH HINTS RECORDER INTERNALS                *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* handle to hint record */
-  typedef struct PS_HintRec_*  PS_Hint;
-
-  /* hint types */
-  typedef enum  PS_Hint_Type_
-  {
-    PS_HINT_TYPE_1 = 1,
-    PS_HINT_TYPE_2 = 2
-
-  } PS_Hint_Type;
-
-
-  /* hint flags */
-#define PS_HINT_FLAG_GHOST   1U
-#define PS_HINT_FLAG_BOTTOM  2U
-
-
-  /* hint descriptor */
-  typedef struct  PS_HintRec_
-  {
-    FT_Int   pos;
-    FT_Int   len;
-    FT_UInt  flags;
-
-  } PS_HintRec;
-
-
-#define ps_hint_is_active( x )  ( (x)->flags & PS_HINT_FLAG_ACTIVE )
-#define ps_hint_is_ghost( x )   ( (x)->flags & PS_HINT_FLAG_GHOST  )
-#define ps_hint_is_bottom( x )  ( (x)->flags & PS_HINT_FLAG_BOTTOM )
-
-
-  /* hints table descriptor */
-  typedef struct  PS_Hint_TableRec_
-  {
-    FT_UInt  num_hints;
-    FT_UInt  max_hints;
-    PS_Hint  hints;
-
-  } PS_Hint_TableRec, *PS_Hint_Table;
-
-
-  /* hint and counter mask descriptor */
-  typedef struct  PS_MaskRec_
-  {
-    FT_UInt   num_bits;
-    FT_UInt   max_bits;
-    FT_Byte*  bytes;
-    FT_UInt   end_point;
-
-  } PS_MaskRec, *PS_Mask;
-
-
-  /* masks and counters table descriptor */
-  typedef struct  PS_Mask_TableRec_
-  {
-    FT_UInt  num_masks;
-    FT_UInt  max_masks;
-    PS_Mask  masks;
-
-  } PS_Mask_TableRec, *PS_Mask_Table;
-
-
- /* dimension-specific hints descriptor */
-  typedef struct  PS_DimensionRec_
-  {
-    PS_Hint_TableRec  hints;
-    PS_Mask_TableRec  masks;
-    PS_Mask_TableRec  counters;
-
-  } PS_DimensionRec, *PS_Dimension;
-
-
-  /* glyph hints descriptor                                */
-  /* dimension 0 => X coordinates + vertical hints/stems   */
-  /* dimension 1 => Y coordinates + horizontal hints/stems */
-  typedef struct  PS_HintsRec_
-  {
-    FT_Memory        memory;
-    FT_Error         error;
-    FT_UInt32        magic;
-    PS_Hint_Type     hint_type;
-    PS_DimensionRec  dimension[2];
-
-  } PS_HintsRec, *PS_Hints;
-
-  /* */
-
-  /* initialize hints recorder */
-  FT_LOCAL( void )
-  ps_hints_init( PS_Hints   hints,
-                 FT_Memory  memory );
-
-  /* finalize hints recorder */
-  FT_LOCAL( void )
-  ps_hints_done( PS_Hints  hints );
-
-  /* initialize Type1 hints recorder interface */
-  FT_LOCAL( void )
-  t1_hints_funcs_init( T1_Hints_FuncsRec*  funcs );
-
-  /* initialize Type2 hints recorder interface */
-  FT_LOCAL( void )
-  t2_hints_funcs_init( T2_Hints_FuncsRec*  funcs );
-
-
-#ifdef DEBUG_HINTER
-  extern PS_Hints  ps_debug_hints;
-  extern  int      ps_debug_no_horz_hints;
-  extern  int      ps_debug_no_vert_hints;
-#endif
-
- /* */
-
-
-FT_END_HEADER
-
-
-#endif /* PSHREC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psnames/psmodule.c b/third_party/freetype/src/psnames/psmodule.c
deleted file mode 100644
index 3ff8cb9..0000000
--- a/third_party/freetype/src/psnames/psmodule.c
+++ /dev/null
@@ -1,619 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psmodule.c                                                             */
-/*                                                                         */
-/*    PSNames module implementation (body).                                */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-
-#include "psmodule.h"
-
-#include "pstables.h"
-#define  DEFINE_PS_TABLES
-#include "pstables.h"
-
-#include "psnamerr.h"
-#include "pspic.h"
-
-
-#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
-
-
-#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
-
-
-#define VARIANT_BIT         0x80000000UL
-#define BASE_GLYPH( code )  ( (FT_UInt32)( (code) & ~VARIANT_BIT ) )
-
-
-  /* Return the Unicode value corresponding to a given glyph.  Note that */
-  /* we do deal with glyph variants by detecting a non-initial dot in    */
-  /* the name, as in `A.swash' or `e.final'; in this case, the           */
-  /* VARIANT_BIT is set in the return value.                             */
-  /*                                                                     */
-  static FT_UInt32
-  ps_unicode_value( const char*  glyph_name )
-  {
-    /* If the name begins with `uni', then the glyph name may be a */
-    /* hard-coded unicode character code.                          */
-    if ( glyph_name[0] == 'u' &&
-         glyph_name[1] == 'n' &&
-         glyph_name[2] == 'i' )
-    {
-      /* determine whether the next four characters following are */
-      /* hexadecimal.                                             */
-
-      /* XXX: Add code to deal with ligatures, i.e. glyph names like */
-      /*      `uniXXXXYYYYZZZZ'...                                   */
-
-      FT_Int       count;
-      FT_UInt32    value = 0;
-      const char*  p     = glyph_name + 3;
-
-
-      for ( count = 4; count > 0; count--, p++ )
-      {
-        char          c = *p;
-        unsigned int  d;
-
-
-        d = (unsigned char)c - '0';
-        if ( d >= 10 )
-        {
-          d = (unsigned char)c - 'A';
-          if ( d >= 6 )
-            d = 16;
-          else
-            d += 10;
-        }
-
-        /* Exit if a non-uppercase hexadecimal character was found   */
-        /* -- this also catches character codes below `0' since such */
-        /* negative numbers cast to `unsigned int' are far too big.  */
-        if ( d >= 16 )
-          break;
-
-        value = ( value << 4 ) + d;
-      }
-
-      /* there must be exactly four hex digits */
-      if ( count == 0 )
-      {
-        if ( *p == '\0' )
-          return value;
-        if ( *p == '.' )
-          return (FT_UInt32)( value | VARIANT_BIT );
-      }
-    }
-
-    /* If the name begins with `u', followed by four to six uppercase */
-    /* hexadecimal digits, it is a hard-coded unicode character code. */
-    if ( glyph_name[0] == 'u' )
-    {
-      FT_Int       count;
-      FT_UInt32    value = 0;
-      const char*  p     = glyph_name + 1;
-
-
-      for ( count = 6; count > 0; count--, p++ )
-      {
-        char          c = *p;
-        unsigned int  d;
-
-
-        d = (unsigned char)c - '0';
-        if ( d >= 10 )
-        {
-          d = (unsigned char)c - 'A';
-          if ( d >= 6 )
-            d = 16;
-          else
-            d += 10;
-        }
-
-        if ( d >= 16 )
-          break;
-
-        value = ( value << 4 ) + d;
-      }
-
-      if ( count <= 2 )
-      {
-        if ( *p == '\0' )
-          return value;
-        if ( *p == '.' )
-          return (FT_UInt32)( value | VARIANT_BIT );
-      }
-    }
-
-    /* Look for a non-initial dot in the glyph name in order to */
-    /* find variants like `A.swash', `e.final', etc.            */
-    {
-      const char*  p   = glyph_name;
-      const char*  dot = NULL;
-
-
-      for ( ; *p; p++ )
-      {
-        if ( *p == '.' && p > glyph_name )
-        {
-          dot = p;
-          break;
-        }
-      }
-
-      /* now look up the glyph in the Adobe Glyph List */
-      if ( !dot )
-        return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p );
-      else
-        return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) |
-                            VARIANT_BIT );
-    }
-  }
-
-
-  /* ft_qsort callback to sort the unicode map */
-  FT_CALLBACK_DEF( int )
-  compare_uni_maps( const void*  a,
-                    const void*  b )
-  {
-    PS_UniMap*  map1 = (PS_UniMap*)a;
-    PS_UniMap*  map2 = (PS_UniMap*)b;
-    FT_UInt32   unicode1 = BASE_GLYPH( map1->unicode );
-    FT_UInt32   unicode2 = BASE_GLYPH( map2->unicode );
-
-
-    /* sort base glyphs before glyph variants */
-    if ( unicode1 == unicode2 )
-    {
-      if ( map1->unicode > map2->unicode )
-        return 1;
-      else if ( map1->unicode < map2->unicode )
-        return -1;
-      else
-        return 0;
-    }
-    else
-    {
-      if ( unicode1 > unicode2 )
-        return 1;
-      else if ( unicode1 < unicode2 )
-        return -1;
-      else
-        return 0;
-    }
-  }
-
-
-  /* support for extra glyphs not handled (well) in AGL; */
-  /* we add extra mappings for them if necessary         */
-
-#define EXTRA_GLYPH_LIST_SIZE  10
-
-  static const FT_UInt32  ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] =
-  {
-    /* WGL 4 */
-    0x0394,
-    0x03A9,
-    0x2215,
-    0x00AD,
-    0x02C9,
-    0x03BC,
-    0x2219,
-    0x00A0,
-    /* Romanian */
-    0x021A,
-    0x021B
-  };
-
-  static const char  ft_extra_glyph_names[] =
-  {
-    'D','e','l','t','a',0,
-    'O','m','e','g','a',0,
-    'f','r','a','c','t','i','o','n',0,
-    'h','y','p','h','e','n',0,
-    'm','a','c','r','o','n',0,
-    'm','u',0,
-    'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0,
-    's','p','a','c','e',0,
-    'T','c','o','m','m','a','a','c','c','e','n','t',0,
-    't','c','o','m','m','a','a','c','c','e','n','t',0
-  };
-
-  static const FT_Int
-  ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] =
-  {
-     0,
-     6,
-    12,
-    21,
-    28,
-    35,
-    38,
-    53,
-    59,
-    72
-  };
-
-
-  static void
-  ps_check_extra_glyph_name( const char*  gname,
-                             FT_UInt      glyph,
-                             FT_UInt*     extra_glyphs,
-                             FT_UInt     *states )
-  {
-    FT_UInt  n;
-
-
-    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
-    {
-      if ( ft_strcmp( ft_extra_glyph_names +
-                        ft_extra_glyph_name_offsets[n], gname ) == 0 )
-      {
-        if ( states[n] == 0 )
-        {
-          /* mark this extra glyph as a candidate for the cmap */
-          states[n]     = 1;
-          extra_glyphs[n] = glyph;
-        }
-
-        return;
-      }
-    }
-  }
-
-
-  static void
-  ps_check_extra_glyph_unicode( FT_UInt32  uni_char,
-                                FT_UInt   *states )
-  {
-    FT_UInt  n;
-
-
-    for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
-    {
-      if ( uni_char == ft_extra_glyph_unicodes[n] )
-      {
-        /* disable this extra glyph from being added to the cmap */
-        states[n] = 2;
-
-        return;
-      }
-    }
-  }
-
-
-  /* Build a table that maps Unicode values to glyph indices. */
-  static FT_Error
-  ps_unicodes_init( FT_Memory             memory,
-                    PS_Unicodes           table,
-                    FT_UInt               num_glyphs,
-                    PS_GetGlyphNameFunc   get_glyph_name,
-                    PS_FreeGlyphNameFunc  free_glyph_name,
-                    FT_Pointer            glyph_data )
-  {
-    FT_Error  error;
-
-    FT_UInt  extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-    FT_UInt  extra_glyphs[EXTRA_GLYPH_LIST_SIZE];
-
-
-    /* we first allocate the table */
-    table->num_maps = 0;
-    table->maps     = NULL;
-
-    if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) )
-    {
-      FT_UInt     n;
-      FT_UInt     count;
-      PS_UniMap*  map;
-      FT_UInt32   uni_char;
-
-
-      map = table->maps;
-
-      for ( n = 0; n < num_glyphs; n++ )
-      {
-        const char*  gname = get_glyph_name( glyph_data, n );
-
-
-        if ( gname )
-        {
-          ps_check_extra_glyph_name( gname, n,
-                                     extra_glyphs, extra_glyph_list_states );
-          uni_char = ps_unicode_value( gname );
-
-          if ( BASE_GLYPH( uni_char ) != 0 )
-          {
-            ps_check_extra_glyph_unicode( uni_char,
-                                          extra_glyph_list_states );
-            map->unicode     = uni_char;
-            map->glyph_index = n;
-            map++;
-          }
-
-          if ( free_glyph_name )
-            free_glyph_name( glyph_data, gname );
-        }
-      }
-
-      for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ )
-      {
-        if ( extra_glyph_list_states[n] == 1 )
-        {
-          /* This glyph name has an additional representation. */
-          /* Add it to the cmap.                               */
-
-          map->unicode     = ft_extra_glyph_unicodes[n];
-          map->glyph_index = extra_glyphs[n];
-          map++;
-        }
-      }
-
-      /* now compress the table a bit */
-      count = (FT_UInt)( map - table->maps );
-
-      if ( count == 0 )
-      {
-        /* No unicode chars here! */
-        FT_FREE( table->maps );
-        if ( !error )
-          error = FT_THROW( No_Unicode_Glyph_Name );
-      }
-      else
-      {
-        /* Reallocate if the number of used entries is much smaller. */
-        if ( count < num_glyphs / 2 )
-        {
-          (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count );
-          error = FT_Err_Ok;
-        }
-
-        /* Sort the table in increasing order of unicode values, */
-        /* taking care of glyph variants.                        */
-        ft_qsort( table->maps, count, sizeof ( PS_UniMap ),
-                  compare_uni_maps );
-      }
-
-      table->num_maps = count;
-    }
-
-    return error;
-  }
-
-
-  static FT_UInt
-  ps_unicodes_char_index( PS_Unicodes  table,
-                          FT_UInt32    unicode )
-  {
-    PS_UniMap  *min, *max, *mid, *result = NULL;
-
-
-    /* Perform a binary search on the table. */
-
-    min = table->maps;
-    max = min + table->num_maps - 1;
-
-    while ( min <= max )
-    {
-      FT_UInt32  base_glyph;
-
-
-      mid = min + ( ( max - min ) >> 1 );
-
-      if ( mid->unicode == unicode )
-      {
-        result = mid;
-        break;
-      }
-
-      base_glyph = BASE_GLYPH( mid->unicode );
-
-      if ( base_glyph == unicode )
-        result = mid; /* remember match but continue search for base glyph */
-
-      if ( min == max )
-        break;
-
-      if ( base_glyph < unicode )
-        min = mid + 1;
-      else
-        max = mid - 1;
-    }
-
-    if ( result )
-      return result->glyph_index;
-    else
-      return 0;
-  }
-
-
-  static FT_UInt32
-  ps_unicodes_char_next( PS_Unicodes  table,
-                         FT_UInt32   *unicode )
-  {
-    FT_UInt    result    = 0;
-    FT_UInt32  char_code = *unicode + 1;
-
-
-    {
-      FT_UInt     min = 0;
-      FT_UInt     max = table->num_maps;
-      FT_UInt     mid;
-      PS_UniMap*  map;
-      FT_UInt32   base_glyph;
-
-
-      while ( min < max )
-      {
-        mid = min + ( ( max - min ) >> 1 );
-        map = table->maps + mid;
-
-        if ( map->unicode == char_code )
-        {
-          result = map->glyph_index;
-          goto Exit;
-        }
-
-        base_glyph = BASE_GLYPH( map->unicode );
-
-        if ( base_glyph == char_code )
-          result = map->glyph_index;
-
-        if ( base_glyph < char_code )
-          min = mid + 1;
-        else
-          max = mid;
-      }
-
-      if ( result )
-        goto Exit;               /* we have a variant glyph */
-
-      /* we didn't find it; check whether we have a map just above it */
-      char_code = 0;
-
-      if ( min < table->num_maps )
-      {
-        map       = table->maps + min;
-        result    = map->glyph_index;
-        char_code = BASE_GLYPH( map->unicode );
-      }
-    }
-
-  Exit:
-    *unicode = char_code;
-    return result;
-  }
-
-
-#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
-
-
-  static const char*
-  ps_get_macintosh_name( FT_UInt  name_index )
-  {
-    if ( name_index >= FT_NUM_MAC_NAMES )
-      name_index = 0;
-
-    return ft_standard_glyph_names + ft_mac_names[name_index];
-  }
-
-
-  static const char*
-  ps_get_standard_strings( FT_UInt  sid )
-  {
-    if ( sid >= FT_NUM_SID_NAMES )
-      return 0;
-
-    return ft_standard_glyph_names + ft_sid_names[sid];
-  }
-
-
-#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
-
-  FT_DEFINE_SERVICE_PSCMAPSREC(
-    pscmaps_interface,
-
-    (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    */
-
-    (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,                                               /* unicode_value         */
-    NULL,                                               /* unicodes_init         */
-    NULL,                                               /* unicodes_char_index   */
-    NULL,                                               /* unicodes_char_next    */
-
-    (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 )
-
-
-  static FT_Pointer
-  psnames_get_service( FT_Module    module,
-                       const char*  service_id )
-  {
-    /* PSCMAPS_SERVICES_GET dereferences `library' in PIC mode */
-#ifdef FT_CONFIG_OPTION_PIC
-    FT_Library  library;
-
-
-    if ( !module )
-      return NULL;
-    library = module->library;
-    if ( !library )
-      return NULL;
-#else
-    FT_UNUSED( module );
-#endif
-
-    return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id );
-  }
-
-#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
-
-
-#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
-#define PUT_PS_NAMES_SERVICE( a )  NULL
-#else
-#define PUT_PS_NAMES_SERVICE( a )  a
-#endif
-
-  FT_DEFINE_MODULE(
-    psnames_module_class,
-
-    0,  /* this is not a font driver, nor a renderer */
-    sizeof ( FT_ModuleRec ),
-
-    "psnames",  /* driver name                         */
-    0x10000L,   /* driver version                      */
-    0x20000L,   /* driver requires FreeType 2 or above */
-
-    PUT_PS_NAMES_SERVICE(
-      (void*)&PSCMAPS_INTERFACE_GET ),   /* module specific interface */
-
-    (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/third_party/freetype/src/psnames/psmodule.h b/third_party/freetype/src/psnames/psmodule.h
deleted file mode 100644
index 6983b79..0000000
--- a/third_party/freetype/src/psnames/psmodule.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psmodule.h                                                             */
-/*                                                                         */
-/*    High-level PSNames module interface (specification).                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 PSMODULE_H_
-#define PSMODULE_H_
-
-
-#include <ft2build.h>
-#include FT_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_MODULE( psnames_module_class )
-
-
-FT_END_HEADER
-
-#endif /* PSMODULE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psnames/psnamerr.h b/third_party/freetype/src/psnames/psnamerr.h
deleted file mode 100644
index f90bf5e..0000000
--- a/third_party/freetype/src/psnames/psnamerr.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psnamerr.h                                                             */
-/*                                                                         */
-/*    PS names module error codes (specification only).                    */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the PS names module error enumeration     */
-  /* constants.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef PSNAMERR_H_
-#define PSNAMERR_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  PSnames_Err_
-#define FT_ERR_BASE    FT_Mod_Err_PSnames
-
-#include FT_ERRORS_H
-
-#endif /* PSNAMERR_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psnames/pspic.c b/third_party/freetype/src/psnames/pspic.c
deleted file mode 100644
index 8b90034..0000000
--- a/third_party/freetype/src/psnames/pspic.c
+++ /dev/null
@@ -1,97 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pspic.c                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services for psnames module.  */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "pspic.h"
-#include "psnamerr.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from psmodule.c */
-  FT_Error
-  FT_Create_Class_pscmaps_services( FT_Library           library,
-                                    FT_ServiceDescRec**  output_class );
-  void
-  FT_Destroy_Class_pscmaps_services( FT_Library          library,
-                                     FT_ServiceDescRec*  clazz );
-
-  void
-  FT_Init_Class_pscmaps_interface( FT_Library              library,
-                                   FT_Service_PsCMapsRec*  clazz );
-
-
-  void
-  psnames_module_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->psnames )
-    {
-      PSModulePIC*  container = (PSModulePIC*)pic_container->psnames;
-
-
-      if ( container->pscmaps_services )
-        FT_Destroy_Class_pscmaps_services( library,
-                                           container->pscmaps_services );
-      container->pscmaps_services = NULL;
-      FT_FREE( container );
-      pic_container->psnames = NULL;
-    }
-  }
-
-
-  FT_Error
-  psnames_module_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    PSModulePIC*       container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->psnames = container;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    error = FT_Create_Class_pscmaps_services(
-              library, &container->pscmaps_services );
-    if ( error )
-      goto Exit;
-    FT_Init_Class_pscmaps_interface( library,
-                                     &container->pscmaps_interface );
-
-  Exit:
-    if ( error )
-      psnames_module_class_pic_free( library );
-    return error;
-  }
-
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/psnames/pspic.h b/third_party/freetype/src/psnames/pspic.h
deleted file mode 100644
index 14497e7..0000000
--- a/third_party/freetype/src/psnames/pspic.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pspic.h                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services for psnames module.  */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 PSPIC_H_
-#define PSPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define PSCMAPS_SERVICES_GET   pscmaps_services
-#define PSCMAPS_INTERFACE_GET  pscmaps_interface
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-
-
-FT_BEGIN_HEADER
-
-  typedef struct  PSModulePIC_
-  {
-    FT_ServiceDescRec*     pscmaps_services;
-    FT_Service_PsCMapsRec  pscmaps_interface;
-
-  } PSModulePIC;
-
-
-#define GET_PIC( lib )                                     \
-          ( (PSModulePIC*)((lib)->pic_container.psnames) )
-#define PSCMAPS_SERVICES_GET   ( GET_PIC( library )->pscmaps_services )
-#define PSCMAPS_INTERFACE_GET  ( GET_PIC( library )->pscmaps_interface )
-
-
-  /* see pspic.c for the implementation */
-  void
-  psnames_module_class_pic_free( FT_Library  library );
-
-  FT_Error
-  psnames_module_class_pic_init( FT_Library  library );
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-#endif /* PSPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/psnames/pstables.h b/third_party/freetype/src/psnames/pstables.h
deleted file mode 100644
index e0f5e30..0000000
--- a/third_party/freetype/src/psnames/pstables.h
+++ /dev/null
@@ -1,4238 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pstables.h                                                             */
-/*                                                                         */
-/*    PostScript glyph names.                                              */
-/*                                                                         */
-/*  Copyright 2005-2017 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 has been generated automatically -- do not edit! */
-
-
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const char  ft_standard_glyph_names[3696]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-    '.','n','u','l','l', 0,
-    'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0,
-    'n','o','t','e','q','u','a','l', 0,
-    'i','n','f','i','n','i','t','y', 0,
-    'l','e','s','s','e','q','u','a','l', 0,
-    'g','r','e','a','t','e','r','e','q','u','a','l', 0,
-    'p','a','r','t','i','a','l','d','i','f','f', 0,
-    's','u','m','m','a','t','i','o','n', 0,
-    'p','r','o','d','u','c','t', 0,
-    'p','i', 0,
-    'i','n','t','e','g','r','a','l', 0,
-    'O','m','e','g','a', 0,
-    'r','a','d','i','c','a','l', 0,
-    'a','p','p','r','o','x','e','q','u','a','l', 0,
-    'D','e','l','t','a', 0,
-    'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0,
-    'l','o','z','e','n','g','e', 0,
-    'a','p','p','l','e', 0,
-    'f','r','a','n','c', 0,
-    'G','b','r','e','v','e', 0,
-    'g','b','r','e','v','e', 0,
-    'I','d','o','t','a','c','c','e','n','t', 0,
-    'S','c','e','d','i','l','l','a', 0,
-    's','c','e','d','i','l','l','a', 0,
-    'C','a','c','u','t','e', 0,
-    'c','a','c','u','t','e', 0,
-    'C','c','a','r','o','n', 0,
-    'c','c','a','r','o','n', 0,
-    'd','c','r','o','a','t', 0,
-    '.','n','o','t','d','e','f', 0,
-    's','p','a','c','e', 0,
-    'e','x','c','l','a','m', 0,
-    'q','u','o','t','e','d','b','l', 0,
-    'n','u','m','b','e','r','s','i','g','n', 0,
-    'd','o','l','l','a','r', 0,
-    'p','e','r','c','e','n','t', 0,
-    'a','m','p','e','r','s','a','n','d', 0,
-    'q','u','o','t','e','r','i','g','h','t', 0,
-    'p','a','r','e','n','l','e','f','t', 0,
-    'p','a','r','e','n','r','i','g','h','t', 0,
-    'a','s','t','e','r','i','s','k', 0,
-    'p','l','u','s', 0,
-    'c','o','m','m','a', 0,
-    'h','y','p','h','e','n', 0,
-    'p','e','r','i','o','d', 0,
-    's','l','a','s','h', 0,
-    'z','e','r','o', 0,
-    'o','n','e', 0,
-    't','w','o', 0,
-    't','h','r','e','e', 0,
-    'f','o','u','r', 0,
-    'f','i','v','e', 0,
-    's','i','x', 0,
-    's','e','v','e','n', 0,
-    'e','i','g','h','t', 0,
-    'n','i','n','e', 0,
-    'c','o','l','o','n', 0,
-    's','e','m','i','c','o','l','o','n', 0,
-    'l','e','s','s', 0,
-    'e','q','u','a','l', 0,
-    'g','r','e','a','t','e','r', 0,
-    'q','u','e','s','t','i','o','n', 0,
-    'a','t', 0,
-    'A', 0,
-    'B', 0,
-    'C', 0,
-    'D', 0,
-    'E', 0,
-    'F', 0,
-    'G', 0,
-    'H', 0,
-    'I', 0,
-    'J', 0,
-    'K', 0,
-    'L', 0,
-    'M', 0,
-    'N', 0,
-    'O', 0,
-    'P', 0,
-    'Q', 0,
-    'R', 0,
-    'S', 0,
-    'T', 0,
-    'U', 0,
-    'V', 0,
-    'W', 0,
-    'X', 0,
-    'Y', 0,
-    'Z', 0,
-    'b','r','a','c','k','e','t','l','e','f','t', 0,
-    'b','a','c','k','s','l','a','s','h', 0,
-    'b','r','a','c','k','e','t','r','i','g','h','t', 0,
-    'a','s','c','i','i','c','i','r','c','u','m', 0,
-    'u','n','d','e','r','s','c','o','r','e', 0,
-    'q','u','o','t','e','l','e','f','t', 0,
-    'a', 0,
-    'b', 0,
-    'c', 0,
-    'd', 0,
-    'e', 0,
-    'f', 0,
-    'g', 0,
-    'h', 0,
-    'i', 0,
-    'j', 0,
-    'k', 0,
-    'l', 0,
-    'm', 0,
-    'n', 0,
-    'o', 0,
-    'p', 0,
-    'q', 0,
-    'r', 0,
-    's', 0,
-    't', 0,
-    'u', 0,
-    'v', 0,
-    'w', 0,
-    'x', 0,
-    'y', 0,
-    'z', 0,
-    'b','r','a','c','e','l','e','f','t', 0,
-    'b','a','r', 0,
-    'b','r','a','c','e','r','i','g','h','t', 0,
-    'a','s','c','i','i','t','i','l','d','e', 0,
-    'e','x','c','l','a','m','d','o','w','n', 0,
-    'c','e','n','t', 0,
-    's','t','e','r','l','i','n','g', 0,
-    'f','r','a','c','t','i','o','n', 0,
-    'y','e','n', 0,
-    'f','l','o','r','i','n', 0,
-    's','e','c','t','i','o','n', 0,
-    'c','u','r','r','e','n','c','y', 0,
-    'q','u','o','t','e','s','i','n','g','l','e', 0,
-    'q','u','o','t','e','d','b','l','l','e','f','t', 0,
-    'g','u','i','l','l','e','m','o','t','l','e','f','t', 0,
-    'g','u','i','l','s','i','n','g','l','l','e','f','t', 0,
-    'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0,
-    'f','i', 0,
-    'f','l', 0,
-    'e','n','d','a','s','h', 0,
-    'd','a','g','g','e','r', 0,
-    'd','a','g','g','e','r','d','b','l', 0,
-    'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0,
-    'p','a','r','a','g','r','a','p','h', 0,
-    'b','u','l','l','e','t', 0,
-    'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0,
-    'q','u','o','t','e','d','b','l','b','a','s','e', 0,
-    'q','u','o','t','e','d','b','l','r','i','g','h','t', 0,
-    'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0,
-    'e','l','l','i','p','s','i','s', 0,
-    'p','e','r','t','h','o','u','s','a','n','d', 0,
-    'q','u','e','s','t','i','o','n','d','o','w','n', 0,
-    'g','r','a','v','e', 0,
-    'a','c','u','t','e', 0,
-    'c','i','r','c','u','m','f','l','e','x', 0,
-    't','i','l','d','e', 0,
-    'm','a','c','r','o','n', 0,
-    'b','r','e','v','e', 0,
-    'd','o','t','a','c','c','e','n','t', 0,
-    'd','i','e','r','e','s','i','s', 0,
-    'r','i','n','g', 0,
-    'c','e','d','i','l','l','a', 0,
-    'h','u','n','g','a','r','u','m','l','a','u','t', 0,
-    'o','g','o','n','e','k', 0,
-    'c','a','r','o','n', 0,
-    'e','m','d','a','s','h', 0,
-    'A','E', 0,
-    'o','r','d','f','e','m','i','n','i','n','e', 0,
-    'L','s','l','a','s','h', 0,
-    'O','s','l','a','s','h', 0,
-    'O','E', 0,
-    'o','r','d','m','a','s','c','u','l','i','n','e', 0,
-    'a','e', 0,
-    'd','o','t','l','e','s','s','i', 0,
-    'l','s','l','a','s','h', 0,
-    'o','s','l','a','s','h', 0,
-    'o','e', 0,
-    'g','e','r','m','a','n','d','b','l','s', 0,
-    'o','n','e','s','u','p','e','r','i','o','r', 0,
-    'l','o','g','i','c','a','l','n','o','t', 0,
-    'm','u', 0,
-    't','r','a','d','e','m','a','r','k', 0,
-    'E','t','h', 0,
-    'o','n','e','h','a','l','f', 0,
-    'p','l','u','s','m','i','n','u','s', 0,
-    'T','h','o','r','n', 0,
-    'o','n','e','q','u','a','r','t','e','r', 0,
-    'd','i','v','i','d','e', 0,
-    'b','r','o','k','e','n','b','a','r', 0,
-    'd','e','g','r','e','e', 0,
-    't','h','o','r','n', 0,
-    't','h','r','e','e','q','u','a','r','t','e','r','s', 0,
-    't','w','o','s','u','p','e','r','i','o','r', 0,
-    'r','e','g','i','s','t','e','r','e','d', 0,
-    'm','i','n','u','s', 0,
-    'e','t','h', 0,
-    'm','u','l','t','i','p','l','y', 0,
-    't','h','r','e','e','s','u','p','e','r','i','o','r', 0,
-    'c','o','p','y','r','i','g','h','t', 0,
-    'A','a','c','u','t','e', 0,
-    'A','c','i','r','c','u','m','f','l','e','x', 0,
-    'A','d','i','e','r','e','s','i','s', 0,
-    'A','g','r','a','v','e', 0,
-    'A','r','i','n','g', 0,
-    'A','t','i','l','d','e', 0,
-    'C','c','e','d','i','l','l','a', 0,
-    'E','a','c','u','t','e', 0,
-    'E','c','i','r','c','u','m','f','l','e','x', 0,
-    'E','d','i','e','r','e','s','i','s', 0,
-    'E','g','r','a','v','e', 0,
-    'I','a','c','u','t','e', 0,
-    'I','c','i','r','c','u','m','f','l','e','x', 0,
-    'I','d','i','e','r','e','s','i','s', 0,
-    'I','g','r','a','v','e', 0,
-    'N','t','i','l','d','e', 0,
-    'O','a','c','u','t','e', 0,
-    'O','c','i','r','c','u','m','f','l','e','x', 0,
-    'O','d','i','e','r','e','s','i','s', 0,
-    'O','g','r','a','v','e', 0,
-    'O','t','i','l','d','e', 0,
-    'S','c','a','r','o','n', 0,
-    'U','a','c','u','t','e', 0,
-    'U','c','i','r','c','u','m','f','l','e','x', 0,
-    'U','d','i','e','r','e','s','i','s', 0,
-    'U','g','r','a','v','e', 0,
-    'Y','a','c','u','t','e', 0,
-    'Y','d','i','e','r','e','s','i','s', 0,
-    'Z','c','a','r','o','n', 0,
-    'a','a','c','u','t','e', 0,
-    'a','c','i','r','c','u','m','f','l','e','x', 0,
-    'a','d','i','e','r','e','s','i','s', 0,
-    'a','g','r','a','v','e', 0,
-    'a','r','i','n','g', 0,
-    'a','t','i','l','d','e', 0,
-    'c','c','e','d','i','l','l','a', 0,
-    'e','a','c','u','t','e', 0,
-    'e','c','i','r','c','u','m','f','l','e','x', 0,
-    'e','d','i','e','r','e','s','i','s', 0,
-    'e','g','r','a','v','e', 0,
-    'i','a','c','u','t','e', 0,
-    'i','c','i','r','c','u','m','f','l','e','x', 0,
-    'i','d','i','e','r','e','s','i','s', 0,
-    'i','g','r','a','v','e', 0,
-    'n','t','i','l','d','e', 0,
-    'o','a','c','u','t','e', 0,
-    'o','c','i','r','c','u','m','f','l','e','x', 0,
-    'o','d','i','e','r','e','s','i','s', 0,
-    'o','g','r','a','v','e', 0,
-    'o','t','i','l','d','e', 0,
-    's','c','a','r','o','n', 0,
-    'u','a','c','u','t','e', 0,
-    'u','c','i','r','c','u','m','f','l','e','x', 0,
-    'u','d','i','e','r','e','s','i','s', 0,
-    'u','g','r','a','v','e', 0,
-    'y','a','c','u','t','e', 0,
-    'y','d','i','e','r','e','s','i','s', 0,
-    'z','c','a','r','o','n', 0,
-    'e','x','c','l','a','m','s','m','a','l','l', 0,
-    'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0,
-    'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0,
-    'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0,
-    'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0,
-    'A','c','u','t','e','s','m','a','l','l', 0,
-    'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0,
-    'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0,
-    't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0,
-    'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0,
-    'z','e','r','o','o','l','d','s','t','y','l','e', 0,
-    'o','n','e','o','l','d','s','t','y','l','e', 0,
-    't','w','o','o','l','d','s','t','y','l','e', 0,
-    't','h','r','e','e','o','l','d','s','t','y','l','e', 0,
-    'f','o','u','r','o','l','d','s','t','y','l','e', 0,
-    'f','i','v','e','o','l','d','s','t','y','l','e', 0,
-    's','i','x','o','l','d','s','t','y','l','e', 0,
-    's','e','v','e','n','o','l','d','s','t','y','l','e', 0,
-    'e','i','g','h','t','o','l','d','s','t','y','l','e', 0,
-    'n','i','n','e','o','l','d','s','t','y','l','e', 0,
-    'c','o','m','m','a','s','u','p','e','r','i','o','r', 0,
-    't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0,
-    'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0,
-    'q','u','e','s','t','i','o','n','s','m','a','l','l', 0,
-    'a','s','u','p','e','r','i','o','r', 0,
-    'b','s','u','p','e','r','i','o','r', 0,
-    'c','e','n','t','s','u','p','e','r','i','o','r', 0,
-    'd','s','u','p','e','r','i','o','r', 0,
-    'e','s','u','p','e','r','i','o','r', 0,
-    'i','s','u','p','e','r','i','o','r', 0,
-    'l','s','u','p','e','r','i','o','r', 0,
-    'm','s','u','p','e','r','i','o','r', 0,
-    'n','s','u','p','e','r','i','o','r', 0,
-    'o','s','u','p','e','r','i','o','r', 0,
-    'r','s','u','p','e','r','i','o','r', 0,
-    's','s','u','p','e','r','i','o','r', 0,
-    't','s','u','p','e','r','i','o','r', 0,
-    'f','f', 0,
-    'f','f','i', 0,
-    'f','f','l', 0,
-    'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0,
-    'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0,
-    'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0,
-    'G','r','a','v','e','s','m','a','l','l', 0,
-    'A','s','m','a','l','l', 0,
-    'B','s','m','a','l','l', 0,
-    'C','s','m','a','l','l', 0,
-    'D','s','m','a','l','l', 0,
-    'E','s','m','a','l','l', 0,
-    'F','s','m','a','l','l', 0,
-    'G','s','m','a','l','l', 0,
-    'H','s','m','a','l','l', 0,
-    'I','s','m','a','l','l', 0,
-    'J','s','m','a','l','l', 0,
-    'K','s','m','a','l','l', 0,
-    'L','s','m','a','l','l', 0,
-    'M','s','m','a','l','l', 0,
-    'N','s','m','a','l','l', 0,
-    'O','s','m','a','l','l', 0,
-    'P','s','m','a','l','l', 0,
-    'Q','s','m','a','l','l', 0,
-    'R','s','m','a','l','l', 0,
-    'S','s','m','a','l','l', 0,
-    'T','s','m','a','l','l', 0,
-    'U','s','m','a','l','l', 0,
-    'V','s','m','a','l','l', 0,
-    'W','s','m','a','l','l', 0,
-    'X','s','m','a','l','l', 0,
-    'Y','s','m','a','l','l', 0,
-    'Z','s','m','a','l','l', 0,
-    'c','o','l','o','n','m','o','n','e','t','a','r','y', 0,
-    'o','n','e','f','i','t','t','e','d', 0,
-    'r','u','p','i','a','h', 0,
-    'T','i','l','d','e','s','m','a','l','l', 0,
-    'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0,
-    'c','e','n','t','o','l','d','s','t','y','l','e', 0,
-    'L','s','l','a','s','h','s','m','a','l','l', 0,
-    'S','c','a','r','o','n','s','m','a','l','l', 0,
-    'Z','c','a','r','o','n','s','m','a','l','l', 0,
-    'D','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'B','r','e','v','e','s','m','a','l','l', 0,
-    'C','a','r','o','n','s','m','a','l','l', 0,
-    'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0,
-    'M','a','c','r','o','n','s','m','a','l','l', 0,
-    'f','i','g','u','r','e','d','a','s','h', 0,
-    'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0,
-    'O','g','o','n','e','k','s','m','a','l','l', 0,
-    'R','i','n','g','s','m','a','l','l', 0,
-    'C','e','d','i','l','l','a','s','m','a','l','l', 0,
-    'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0,
-    'o','n','e','e','i','g','h','t','h', 0,
-    't','h','r','e','e','e','i','g','h','t','h','s', 0,
-    'f','i','v','e','e','i','g','h','t','h','s', 0,
-    's','e','v','e','n','e','i','g','h','t','h','s', 0,
-    'o','n','e','t','h','i','r','d', 0,
-    't','w','o','t','h','i','r','d','s', 0,
-    'z','e','r','o','s','u','p','e','r','i','o','r', 0,
-    'f','o','u','r','s','u','p','e','r','i','o','r', 0,
-    'f','i','v','e','s','u','p','e','r','i','o','r', 0,
-    's','i','x','s','u','p','e','r','i','o','r', 0,
-    's','e','v','e','n','s','u','p','e','r','i','o','r', 0,
-    'e','i','g','h','t','s','u','p','e','r','i','o','r', 0,
-    'n','i','n','e','s','u','p','e','r','i','o','r', 0,
-    'z','e','r','o','i','n','f','e','r','i','o','r', 0,
-    'o','n','e','i','n','f','e','r','i','o','r', 0,
-    't','w','o','i','n','f','e','r','i','o','r', 0,
-    't','h','r','e','e','i','n','f','e','r','i','o','r', 0,
-    'f','o','u','r','i','n','f','e','r','i','o','r', 0,
-    'f','i','v','e','i','n','f','e','r','i','o','r', 0,
-    's','i','x','i','n','f','e','r','i','o','r', 0,
-    's','e','v','e','n','i','n','f','e','r','i','o','r', 0,
-    'e','i','g','h','t','i','n','f','e','r','i','o','r', 0,
-    'n','i','n','e','i','n','f','e','r','i','o','r', 0,
-    'c','e','n','t','i','n','f','e','r','i','o','r', 0,
-    'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0,
-    'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0,
-    'c','o','m','m','a','i','n','f','e','r','i','o','r', 0,
-    'A','g','r','a','v','e','s','m','a','l','l', 0,
-    'A','a','c','u','t','e','s','m','a','l','l', 0,
-    'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'A','t','i','l','d','e','s','m','a','l','l', 0,
-    'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'A','r','i','n','g','s','m','a','l','l', 0,
-    'A','E','s','m','a','l','l', 0,
-    'C','c','e','d','i','l','l','a','s','m','a','l','l', 0,
-    'E','g','r','a','v','e','s','m','a','l','l', 0,
-    'E','a','c','u','t','e','s','m','a','l','l', 0,
-    'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'I','g','r','a','v','e','s','m','a','l','l', 0,
-    'I','a','c','u','t','e','s','m','a','l','l', 0,
-    'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'E','t','h','s','m','a','l','l', 0,
-    'N','t','i','l','d','e','s','m','a','l','l', 0,
-    'O','g','r','a','v','e','s','m','a','l','l', 0,
-    'O','a','c','u','t','e','s','m','a','l','l', 0,
-    'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'O','t','i','l','d','e','s','m','a','l','l', 0,
-    'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'O','E','s','m','a','l','l', 0,
-    'O','s','l','a','s','h','s','m','a','l','l', 0,
-    'U','g','r','a','v','e','s','m','a','l','l', 0,
-    'U','a','c','u','t','e','s','m','a','l','l', 0,
-    'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0,
-    'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    'Y','a','c','u','t','e','s','m','a','l','l', 0,
-    'T','h','o','r','n','s','m','a','l','l', 0,
-    'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0,
-    '0','0','1','.','0','0','0', 0,
-    '0','0','1','.','0','0','1', 0,
-    '0','0','1','.','0','0','2', 0,
-    '0','0','1','.','0','0','3', 0,
-    'B','l','a','c','k', 0,
-    'B','o','l','d', 0,
-    'B','o','o','k', 0,
-    'L','i','g','h','t', 0,
-    'M','e','d','i','u','m', 0,
-    '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 */
-  ;
-
-
-#define FT_NUM_MAC_NAMES  258
-
-  /* Values are offsets into the `ft_standard_glyph_names' table */
-
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const short  ft_mac_names[FT_NUM_MAC_NAMES]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-     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,
-     436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498,
-     500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526,
-     528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610,
-     612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638,
-     640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685,
-    1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652,
-    1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776,
-    1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346,
-    1197, 985,1031,  23,1086,1108,  32,1219,  41,  51, 730,1194,  64,  76,
-      86,  94,  97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120,
-     132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916,
-     598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856,
-     888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500,
-     163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053,
-    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 */
-  ;
-
-
-#define FT_NUM_SID_NAMES  391
-
-  /* Values are offsets into the `ft_standard_glyph_names' table */
-
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const short  ft_sid_names[FT_NUM_SID_NAMES]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-     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,
-     447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502,
-     504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530,
-     532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614,
-     616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642,
-     644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707,
-     712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832,
-     839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985,
-     991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089,
-    1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197,
-    1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319,
-    1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443,
-    1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562,
-    1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680,
-    1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797,
-    1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973,
-    1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167,
-    2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319,
-    2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454,
-    2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552,
-    2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684,
-    2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860,
-    2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034,
-    3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220,
-    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 */
-  ;
-
-
-  /* the following are indices into the SID name table */
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const unsigned short  t1_standard_encoding[256]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-      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,
-      1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
-     17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
-     33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
-     49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
-     65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
-     81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,  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,  0,
-      0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,
-      0,111,112,113,114,  0,115,116,117,118,119,120,121,122,  0,123,
-      0,124,125,126,127,128,129,130,131,  0,132,133,  0,134,135,136,
-    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 */
-  ;
-
-
-  /* the following are indices into the SID name table */
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const unsigned short  t1_expert_encoding[256]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-      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,
-      1,229,230,  0,231,232,233,234,235,236,237,238, 13, 14, 15, 99,
-    239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252,
-      0,253,254,255,256,257,  0,  0,  0,258,  0,  0,259,260,261,262,
-      0,  0,263,264,265,  0,266,109,110,267,268,269,  0,270,271,272,
-    273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,
-    289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,  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,  0,
-      0,304,305,306,  0,  0,307,308,309,310,311,  0,312,  0,  0,313,
-      0,  0,314,315,  0,  0,316,317,318,  0,  0,  0,158,155,163,319,
-    320,321,322,323,324,325,  0,  0,326,150,164,169,327,328,329,330,
-    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 */
-  ;
-
-
-  /*
-   *  This table is a compressed version of the Adobe Glyph List (AGL),
-   *  optimized for efficient searching.  It has been generated by the
-   *  `glnames.py' python script located in the `src/tools' directory.
-   *
-   *  The lookup function to get the Unicode value for a given string
-   *  is defined below the table.
-   */
-
-#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST
-
-#ifndef  DEFINE_PS_TABLES
-#ifdef  __cplusplus
-  extern "C"
-#else
-  extern
-#endif
-#endif
-  const unsigned char  ft_adobe_glyph_list[55997L]
-#ifdef  DEFINE_PS_TABLES
-  =
-  {
-      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,
-     22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107,
-     32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109,
-     88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255,
-    135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199,
-    202, 25,204,166,208,209,209, 81,215, 26, 65,143,  0, 65,  0,140,
-      0,175,  0,193,  1, 15,  1,147,  1,233,  1,251,  2,  7,  2, 40,
-      2, 57,  2, 82,  2, 91,  2,128,  2,136,  2,154, 69,131,  0,198,
-      0,150,  0,158,  0,167,225,227,245,244,101,128,  1,252,237,225,
-    227,242,239,110,128,  1,226,243,237,225,236,108,128,247,230,225,
-    227,245,244,101,129,  0,193,  0,185,243,237,225,236,108,128,247,
-    225,226,242,229,246,101,134,  1,  2,  0,213,  0,221,  0,232,  0,
-    243,  0,251,  1,  7,225,227,245,244,101,128, 30,174,227,249,242,
-    233,236,236,233, 99,128,  4,208,228,239,244,226,229,236,239,119,
-    128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225,
-    226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99,
-      4,  1, 25,  1, 32,  1,121,  1,137,225,242,239,110,128,  1,205,
-    233,242, 99,  2,  1, 40,  1, 45,236,101,128, 36,182,245,237,230,
-    236,229,120,134,  0,194,  1, 66,  1, 74,  1, 85,  1, 93,  1,105,
-      1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236,
-    239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239,
-    235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247,
-    226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201,  1,
-    129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99,
-    128,  4, 16,100,  3,  1,155,  1,165,  1,209,226,236,231,242,225,
-    246,101,128,  2,  0,233,229,242,229,243,233,115,131,  0,196,  1,
-    181,  1,192,  1,201,227,249,242,233,236,236,233, 99,128,  4,210,
-    237,225,227,242,239,110,128,  1,222,243,237,225,236,108,128,247,
-    228,239,116,  2,  1,216,  1,224,226,229,236,239,119,128, 30,160,
-    237,225,227,242,239,110,128,  1,224,231,242,225,246,101,129,  0,
-    192,  1,243,243,237,225,236,108,128,247,224,232,239,239,235,225,
-    226,239,246,101,128, 30,162,105,  2,  2, 13,  2, 25,229,227,249,
-    242,233,236,236,233, 99,128,  4,212,238,246,229,242,244,229,228,
-    226,242,229,246,101,128,  2,  2,236,240,232, 97,129,  3,145,  2,
-     49,244,239,238,239,115,128,  3,134,109,  2,  2, 63,  2, 71,225,
-    227,242,239,110,128,  1,  0,239,238,239,243,240,225,227,101,128,
-    255, 33,239,231,239,238,229,107,128,  1,  4,242,233,238,103,131,
-      0,197,  2,104,  2,112,  2,120,225,227,245,244,101,128,  1,250,
-    226,229,236,239,119,128, 30,  0,243,237,225,236,108,128,247,229,
-    243,237,225,236,108,128,247, 97,244,233,236,228,101,129,  0,195,
-      2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229,
-    238,233,225,110,128,  5, 49, 66,137,  0, 66,  2,189,  2,198,  2,
-    223,  3,  3,  3, 10,  3, 22,  3, 34,  3, 46,  3, 54,227,233,242,
-    227,236,101,128, 36,183,228,239,116,  2,  2,206,  2,215,225,227,
-    227,229,238,116,128, 30,  2,226,229,236,239,119,128, 30,  4,101,
-      3,  2,231,  2,242,  2,254,227,249,242,233,236,236,233, 99,128,
-      4, 17,238,225,242,237,229,238,233,225,110,128,  5, 50,244, 97,
-    128,  3,146,232,239,239,107,128,  1,129,236,233,238,229,226,229,
-    236,239,119,128, 30,  6,237,239,238,239,243,240,225,227,101,128,
-    255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237,
-    225,236,108,128,247, 98,244,239,240,226,225,114,128,  1,130, 67,
-    137,  0, 67,  3, 85,  3,127,  3,193,  3,210,  3,224,  4,171,  4,
-    188,  4,200,  4,212, 97,  3,  3, 93,  3,104,  3,111,225,242,237,
-    229,238,233,225,110,128,  5, 62,227,245,244,101,128,  1,  6,242,
-    239,110,129,246,202,  3,119,243,237,225,236,108,128,246,245, 99,
-      3,  3,135,  3,142,  3,171,225,242,239,110,128,  1, 12,229,228,
-    233,236,236, 97,130,  0,199,  3,155,  3,163,225,227,245,244,101,
-    128, 30,  8,243,237,225,236,108,128,247,231,233,242, 99,  2,  3,
-    179,  3,184,236,101,128, 36,184,245,237,230,236,229,120,128,  1,
-      8,228,239,116,129,  1, 10,  3,201,225,227,227,229,238,116,128,
-      1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184,
-    104,  4,  3,234,  3,246,  4,161,  4,165,225,225,242,237,229,238,
-    233,225,110,128,  5, 73,101,  6,  4,  4,  4, 24,  4, 35,  4,103,
-      4,115,  4,136,225,226,235,232,225,243,233,225,238,227,249,242,
-    233,236,236,233, 99,128,  4,188,227,249,242,233,236,236,233, 99,
-    128,  4, 39,100,  2,  4, 41,  4, 85,229,243,227,229,238,228,229,
-    114,  2,  4, 54,  4, 74,225,226,235,232,225,243,233,225,238,227,
-    249,242,233,236,236,233, 99,128,  4,190,227,249,242,233,236,236,
-    233, 99,128,  4,182,233,229,242,229,243,233,243,227,249,242,233,
-    236,236,233, 99,128,  4,244,232,225,242,237,229,238,233,225,110,
-    128,  5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242,
-    233,236,236,233, 99,128,  4,203,246,229,242,244,233,227,225,236,
-    243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,
-    184,105,128,  3,167,239,239,107,128,  1,135,233,242,227,245,237,
-    230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239,
-    243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225,
-    110,128,  5, 81,243,237,225,236,108,128,247, 99, 68,142,  0, 68,
-      4,252,  5, 10,  5, 36,  5, 96,  5,121,  5,166,  5,173,  5,231,
-      5,244,  6,  0,  6, 12,  6, 28,  6, 48,  6, 57, 90,129,  1,241,
-      5,  2,227,225,242,239,110,128,  1,196, 97,  2,  5, 16,  5, 27,
-    225,242,237,229,238,233,225,110,128,  5, 52,230,242,233,227,225,
-    110,128,  1,137, 99,  4,  5, 46,  5, 53,  5, 62,  5, 89,225,242,
-    239,110,128,  1, 14,229,228,233,236,236, 97,128, 30, 16,233,242,
-     99,  2,  5, 70,  5, 75,236,101,128, 36,185,245,237,230,236,229,
-    248,226,229,236,239,119,128, 30, 18,242,239,225,116,128,  1, 16,
-    228,239,116,  2,  5,104,  5,113,225,227,227,229,238,116,128, 30,
-     10,226,229,236,239,119,128, 30, 12,101,  3,  5,129,  5,140,  5,
-    150,227,249,242,233,236,236,233, 99,128,  4, 20,233,227,239,240,
-    244,233, 99,128,  3,238,236,244, 97,129, 34,  6,  5,158,231,242,
-    229,229,107,128,  3,148,232,239,239,107,128,  1,138,105,  2,  5,
-    179,  5,218,229,242,229,243,233,115,131,246,203,  5,194,  5,202,
-      5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128,
-    246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231,
-    242,229,229,107,128,  3,220,234,229,227,249,242,233,236,236,233,
-     99,128,  4,  2,236,233,238,229,226,229,236,239,119,128, 30, 14,
-    237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227,
-    227,229,238,244,243,237,225,236,108,128,246,247,115,  2,  6, 34,
-      6, 41,236,225,243,104,128,  1, 16,237,225,236,108,128,247,100,
-    244,239,240,226,225,114,128,  1,139,122,131,  1,242,  6, 67,  6,
-     75,  6,112,227,225,242,239,110,128,  1,197,101,  2,  6, 81,  6,
-    101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
-    233, 99,128,  4,224,227,249,242,233,236,236,233, 99,128,  4,  5,
-    232,229,227,249,242,233,236,236,233, 99,128,  4, 15, 69,146,  0,
-     69,  6,165,  6,183,  6,191,  7, 89,  7,153,  7,165,  7,183,  7,
-    211,  8,  7,  8, 36,  8, 94,  8,169,  8,189,  8,208,  8,248,  9,
-     44,  9,109,  9,115,225,227,245,244,101,129,  0,201,  6,175,243,
-    237,225,236,108,128,247,233,226,242,229,246,101,128,  1, 20, 99,
-      5,  6,203,  6,210,  6,224,  6,236,  7, 79,225,242,239,110,128,
-      1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28,
-    232,225,242,237,229,238,233,225,110,128,  5, 53,233,242, 99,  2,
-      6,244,  6,249,236,101,128, 36,186,245,237,230,236,229,120,135,
-      0,202,  7, 16,  7, 24,  7, 32,  7, 43,  7, 51,  7, 63,  7, 71,
-    225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24,
-    228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101,
-    128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243,
-    237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249,
-    242,233,236,236,233, 99,128,  4,  4,100,  3,  7, 97,  7,107,  7,
-    127,226,236,231,242,225,246,101,128,  2,  4,233,229,242,229,243,
-    233,115,129,  0,203,  7,119,243,237,225,236,108,128,247,235,239,
-    116,130,  1, 22,  7,136,  7,145,225,227,227,229,238,116,128,  1,
-     22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236,
-    233, 99,128,  4, 36,231,242,225,246,101,129,  0,200,  7,175,243,
-    237,225,236,108,128,247,232,104,  2,  7,189,  7,200,225,242,237,
-    229,238,233,225,110,128,  5, 55,239,239,235,225,226,239,246,101,
-    128, 30,186,105,  3,  7,219,  7,230,  7,245,231,232,244,242,239,
-    237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229,
-    246,101,128,  2,  6,239,244,233,230,233,229,228,227,249,242,233,
-    236,236,233, 99,128,  4,100,108,  2,  8, 13,  8, 24,227,249,242,
-    233,236,236,233, 99,128,  4, 27,229,246,229,238,242,239,237,225,
-    110,128, 33,106,109,  3,  8, 44,  8, 72,  8, 83,225,227,242,239,
-    110,130,  1, 18,  8, 56,  8, 64,225,227,245,244,101,128, 30, 22,
-    231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99,
-    128,  4, 28,239,238,239,243,240,225,227,101,128,255, 37,110,  4,
-      8,104,  8,115,  8,135,  8,154,227,249,242,233,236,236,233, 99,
-    128,  4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233,
-    236,236,233, 99,128,  4,162,103,129,  1, 74,  8,141,232,229,227,
-    249,242,233,236,236,233, 99,128,  4,164,232,239,239,235,227,249,
-    242,233,236,236,233, 99,128,  4,199,111,  2,  8,175,  8,183,231,
-    239,238,229,107,128,  1, 24,240,229,110,128,  1,144,240,243,233,
-    236,239,110,129,  3,149,  8,200,244,239,238,239,115,128,  3,136,
-    114,  2,  8,214,  8,225,227,249,242,233,236,236,233, 99,128,  4,
-     32,229,246,229,242,243,229,100,129,  1,142,  8,237,227,249,242,
-    233,236,236,233, 99,128,  4, 45,115,  4,  9,  2,  9, 13,  9, 33,
-      9, 37,227,249,242,233,236,236,233, 99,128,  4, 33,228,229,243,
-    227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,
-    170,104,128,  1,169,237,225,236,108,128,247,101,116,  3,  9, 52,
-      9, 78,  9, 92, 97,130,  3,151,  9, 60,  9, 70,242,237,229,238,
-    233,225,110,128,  5, 56,244,239,238,239,115,128,  3,137,104,129,
-      0,208,  9, 84,243,237,225,236,108,128,247,240,233,236,228,101,
-    129, 30,188,  9,101,226,229,236,239,119,128, 30, 26,245,242,111,
-    128, 32,172,250,104,130,  1,183,  9,124,  9,132,227,225,242,239,
-    110,128,  1,238,242,229,246,229,242,243,229,100,128,  1,184, 70,
-    136,  0, 70,  9,163,  9,172,  9,184,  9,212,  9,219,  9,248, 10,
-      4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225,
-    227,227,229,238,116,128, 30, 30,101,  2,  9,190,  9,202,232,225,
-    242,237,229,238,233,225,110,128,  5, 86,233,227,239,240,244,233,
-     99,128,  3,228,232,239,239,107,128,  1,145,105,  2,  9,225,  9,
-    238,244,225,227,249,242,233,236,236,233, 99,128,  4,114,246,229,
-    242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227,
-    101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243,
-    237,225,236,108,128,247,102, 71,140,  0, 71, 10, 51, 10, 61, 10,
-    107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11,
-     90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97,  3, 10,
-     69, 10, 76, 10, 94,227,245,244,101,128,  1,244,237,237, 97,129,
-      3,147, 10, 84,225,230,242,233,227,225,110,128,  1,148,238,231,
-    233,225,227,239,240,244,233, 99,128,  3,234,226,242,229,246,101,
-    128,  1, 30, 99,  4, 10,125, 10,132, 10,141, 10,163,225,242,239,
-    110,128,  1,230,229,228,233,236,236, 97,128,  1, 34,233,242, 99,
-      2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120,
-    128,  1, 28,239,237,237,225,225,227,227,229,238,116,128,  1, 34,
-    228,239,116,129,  1, 32, 10,184,225,227,227,229,238,116,128,  1,
-     32,229,227,249,242,233,236,236,233, 99,128,  4, 19,104,  3, 10,
-    213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128,
-      5, 66,101,  3, 10,234, 10,255, 11, 16,237,233,228,228,236,229,
-    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,148,243,
-    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,146,
-    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
-    144,239,239,107,128,  1,147,233,237,225,242,237,229,238,233,225,
-    110,128,  5, 51,234,229,227,249,242,233,236,236,233, 99,128,  4,
-      3,109,  2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239,
-    238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246,
-    206, 11, 99,243,237,225,236,108,128,247, 96,115,  2, 11,113, 11,
-    129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128,  2,
-    155,244,242,239,235,101,128,  1,228, 72,140,  0, 72, 11,165, 11,
-    190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12,
-    157, 12,165, 12,189,177,184, 53,  3, 11,175, 11,180, 11,185,179,
-     51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178,
-    176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203,
-     97,  3, 11,216, 11,236, 12,  0,225,226,235,232,225,243,233,225,
-    238,227,249,242,233,236,236,233, 99,128,  4,168,228,229,243,227,
-    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,178,
-    242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,  4,
-     42, 98,  2, 12, 23, 12, 28,225,114,128,  1, 38,242,229,246,229,
-    226,229,236,239,119,128, 30, 42, 99,  2, 12, 46, 12, 55,229,228,
-    233,236,236, 97,128, 30, 40,233,242, 99,  2, 12, 63, 12, 68,236,
-    101,128, 36,189,245,237,230,236,229,120,128,  1, 36,100,  2, 12,
-     83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116,  2,
-     12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236,
-    239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255,
-     40,111,  2, 12,135, 12,146,225,242,237,229,238,233,225,110,128,
-      5, 64,242,233,227,239,240,244,233, 99,128,  3,232,243,237,225,
-    236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116,
-    129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241,
-    245,225,242,101,128, 51,144, 73,146,  0, 73, 12,239, 12,251, 12,
-    255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13,
-    242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193,
-    227,249,242,233,236,236,233, 99,128,  4, 47, 74,128,  1, 50,213,
-    227,249,242,233,236,236,233, 99,128,  4, 46,225,227,245,244,101,
-    129,  0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229,
-    246,101,128,  1, 44, 99,  3, 13, 45, 13, 52, 13, 84,225,242,239,
-    110,128,  1,207,233,242, 99,  2, 13, 60, 13, 65,236,101,128, 36,
-    190,245,237,230,236,229,120,129,  0,206, 13, 76,243,237,225,236,
-    108,128,247,238,249,242,233,236,236,233, 99,128,  4,  6,100,  3,
-     13,102, 13,112, 13,155,226,236,231,242,225,246,101,128,  2,  8,
-    233,229,242,229,243,233,115,131,  0,207, 13,128, 13,136, 13,147,
-    225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99,
-    128,  4,228,243,237,225,236,108,128,247,239,239,116,130,  1, 48,
-     13,164, 13,173,225,227,227,229,238,116,128,  1, 48,226,229,236,
-    239,119,128, 30,202,101,  2, 13,187, 13,203,226,242,229,246,229,
-    227,249,242,233,236,236,233, 99,128,  4,214,227,249,242,233,236,
-    236,233, 99,128,  4, 21,230,242,225,235,244,245,114,128, 33, 17,
-    231,242,225,246,101,129,  0,204, 13,234,243,237,225,236,108,128,
-    247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105,  3,
-     14,  6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128,  4,
-     24,238,246,229,242,244,229,228,226,242,229,246,101,128,  2, 10,
-    243,232,239,242,244,227,249,242,233,236,236,233, 99,128,  4, 25,
-    109,  2, 14, 54, 14, 75,225,227,242,239,110,129,  1, 42, 14, 64,
-    227,249,242,233,236,236,233, 99,128,  4,226,239,238,239,243,240,
-    225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110,
-    128,  5, 59,111,  3, 14,107, 14,118, 14,126,227,249,242,233,236,
-    236,233, 99,128,  4,  1,231,239,238,229,107,128,  1, 46,244, 97,
-    131,  3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110,
-    128,  1,150,228,233,229,242,229,243,233,115,128,  3,170,244,239,
-    238,239,115,128,  3,138,115,  2, 14,172, 14,179,237,225,236,108,
-    128,247,105,244,242,239,235,101,128,  1,151,244,233,236,228,101,
-    129,  1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233,
-    244,243, 97,  2, 14,216, 14,227,227,249,242,233,236,236,233, 99,
-    128,  4,116,228,226,236,231,242,225,246,229,227,249,242,233,236,
-    236,233, 99,128,  4,118, 74,134,  0, 74, 15,  6, 15, 18, 15, 41,
-     15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128,
-      5, 65,227,233,242, 99,  2, 15, 27, 15, 32,236,101,128, 36,191,
-    245,237,230,236,229,120,128,  1, 52,229,227,249,242,233,236,236,
-    233, 99,128,  4,  8,232,229,232,225,242,237,229,238,233,225,110,
-    128,  5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243,
-    237,225,236,108,128,247,106, 75,140,  0, 75, 15,115, 15,125, 15,
-    135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16,
-    180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241,
-    245,225,242,101,128, 51,205, 97,  7, 15,151, 15,169, 15,191, 15,
-    211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249,
-    242,233,236,236,233, 99,128,  4,160, 99,  2, 15,175, 15,181,245,
-    244,101,128, 30, 48,249,242,233,236,236,233, 99,128,  4, 26,228,
-    229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,
-    128,  4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128,
-      4,195,240,240, 97,128,  3,154,243,244,242,239,235,229,227,249,
-    242,233,236,236,233, 99,128,  4,158,246,229,242,244,233,227,225,
-    236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128,
-      4,156, 99,  4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110,
-    128,  1,232,229,228,233,236,236, 97,128,  1, 54,233,242,227,236,
-    101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128,  1,
-     54,228,239,244,226,229,236,239,119,128, 30, 50,101,  2, 16, 82,
-     16, 94,232,225,242,237,229,238,233,225,110,128,  5, 84,238,225,
-    242,237,229,238,233,225,110,128,  5, 63,104,  3, 16,114, 16,126,
-     16,137,225,227,249,242,233,236,236,233, 99,128,  4, 37,229,233,
-    227,239,240,244,233, 99,128,  3,230,239,239,107,128,  1,152,234,
-    229,227,249,242,233,236,236,233, 99,128,  4, 12,236,233,238,229,
-    226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227,
-    101,128,255, 43,239,240,240, 97,  2, 16,189, 16,200,227,249,242,
-    233,236,236,233, 99,128,  4,128,231,242,229,229,107,128,  3,222,
-    115,  2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128,
-      4,110,237,225,236,108,128,247,107, 76,138,  0, 76, 17,  1, 17,
-      5, 17,  9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17,
-    189, 74,128,  1,199, 76,128,246,191, 97,  2, 17, 15, 17, 22,227,
-    245,244,101,128,  1, 57,237,226,228, 97,128,  3,155, 99,  4, 17,
-     39, 17, 46, 17, 55, 17, 82,225,242,239,110,128,  1, 61,229,228,
-    233,236,236, 97,128,  1, 59,233,242, 99,  2, 17, 63, 17, 68,236,
-    101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128,
-     30, 60,239,237,237,225,225,227,227,229,238,116,128,  1, 59,228,
-    239,116,130,  1, 63, 17,105, 17,114,225,227,227,229,238,116,128,
-      1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242,
-    239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110,
-    128,  5, 60,106,129,  1,200, 17,153,229,227,249,242,233,236,236,
-    233, 99,128,  4,  9,236,233,238,229,226,229,236,239,119,128, 30,
-     58,237,239,238,239,243,240,225,227,101,128,255, 44,115,  2, 17,
-    195, 17,212,236,225,243,104,129,  1, 65, 17,204,243,237,225,236,
-    108,128,246,249,237,225,236,108,128,247,108, 77,137,  0, 77, 17,
-    241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18,
-    100,194,243,241,245,225,242,101,128, 51,134,225, 99,  2, 18,  2,
-     18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128,
-    247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36,
-    194,228,239,116,  2, 18, 41, 18, 50,225,227,227,229,238,116,128,
-     30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229,
-    238,233,225,110,128,  5, 68,237,239,238,239,243,240,225,227,101,
-    128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229,
-    100,128,  1,156,117,128,  3,156, 78,141,  0, 78, 18,134, 18,138,
-     18,146, 18,212, 18,237, 18,248, 19,  3, 19, 21, 19, 33, 19, 45,
-     19, 58, 19, 66, 19, 84, 74,128,  1,202,225,227,245,244,101,128,
-      1, 67, 99,  4, 18,156, 18,163, 18,172, 18,199,225,242,239,110,
-    128,  1, 71,229,228,233,236,236, 97,128,  1, 69,233,242, 99,  2,
-     18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226,
-    229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238,
-    116,128,  1, 69,228,239,116,  2, 18,220, 18,229,225,227,227,229,
-    238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239,
-    235,236,229,230,116,128,  1,157,233,238,229,242,239,237,225,110,
-    128, 33,104,106,129,  1,203, 19,  9,229,227,249,242,233,236,236,
-    233, 99,128,  4, 10,236,233,238,229,226,229,236,239,119,128, 30,
-     72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225,
-    242,237,229,238,233,225,110,128,  5, 70,243,237,225,236,108,128,
-    247,110,244,233,236,228,101,129,  0,209, 19, 76,243,237,225,236,
-    108,128,247,241,117,128,  3,157, 79,141,  0, 79, 19,118, 19,132,
-     19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213,
-     21,223, 21,254, 22, 53, 69,129,  1, 82, 19,124,243,237,225,236,
-    108,128,246,250,225,227,245,244,101,129,  0,211, 19,142,243,237,
-    225,236,108,128,247,243, 98,  2, 19,156, 19,196,225,242,242,229,
-    100,  2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128,  4,
-    232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
-     99,128,  4,234,242,229,246,101,128,  1, 78, 99,  4, 19,213, 19,
-    220, 19,235, 20, 68,225,242,239,110,128,  1,209,229,238,244,229,
-    242,229,228,244,233,236,228,101,128,  1,159,233,242, 99,  2, 19,
-    243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134,  0,
-    212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245,
-    244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216,
-    231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246,
-    101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228,
-    101,128, 30,214,249,242,233,236,236,233, 99,128,  4, 30,100,  3,
-     20, 86, 20,109, 20,142,226,108,  2, 20, 93, 20,101,225,227,245,
-    244,101,128,  1, 80,231,242,225,246,101,128,  2, 12,233,229,242,
-    229,243,233,115,130,  0,214, 20,123, 20,134,227,249,242,233,236,
-    236,233, 99,128,  4,230,243,237,225,236,108,128,247,246,239,244,
-    226,229,236,239,119,128, 30,204,103,  2, 20,158, 20,170,239,238,
-    229,235,243,237,225,236,108,128,246,251,242,225,246,101,129,  0,
-    210, 20,179,243,237,225,236,108,128,247,242,104,  4, 20,197, 20,
-    208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128,  5, 85,
-    109,128, 33, 38,111,  2, 20,218, 20,228,239,235,225,226,239,246,
-    101,128, 30,206,242,110,133,  1,160, 20,243, 20,251, 21,  6, 21,
-     14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229,
-    236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239,
-    239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128,
-     30,224,245,238,231,225,242,245,237,236,225,245,116,128,  1, 80,
-    105,129,  1,162, 21, 54,238,246,229,242,244,229,228,226,242,229,
-    246,101,128,  2, 14,109,  4, 21, 79, 21,107, 21,184, 21,202,225,
-    227,242,239,110,130,  1, 76, 21, 91, 21, 99,225,227,245,244,101,
-    128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33,
-     38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233,
-     99,128,  4, 96,231,242,229,229,107,128,  3,169,242,239,245,238,
-    228,227,249,242,233,236,236,233, 99,128,  4,122,116,  2, 21,162,
-     21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,
-    124,239,238,239,115,128,  3,143,233,227,242,239,110,129,  3,159,
-     21,194,244,239,238,239,115,128,  3,140,239,238,239,243,240,225,
-    227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111,
-      2, 21,229, 21,248,231,239,238,229,107,129,  1,234, 21,239,237,
-    225,227,242,239,110,128,  1,236,240,229,110,128,  1,134,115,  3,
-     22,  6, 22, 33, 22, 40,236,225,243,104,130,  0,216, 22, 17, 22,
-     25,225,227,245,244,101,128,  1,254,243,237,225,236,108,128,247,
-    248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245,
-    244,101,128,  1,254,116,  2, 22, 59, 22, 70,227,249,242,233,236,
-    236,233, 99,128,  4,126,233,236,228,101,131,  0,213, 22, 83, 22,
-     91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229,
-    243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136,
-      0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246,
-     23,  2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101,
-    128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101,
-      3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128,
-      4, 31,232,225,242,237,229,238,233,225,110,128,  5, 74,237,233,
-    228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99,
-    128,  4,166,104,  2, 22,217, 22,221,105,128,  3,166,239,239,107,
-    128,  1,164,105,129,  3,160, 22,233,247,242,225,242,237,229,238,
-    233,225,110,128,  5, 83,237,239,238,239,243,240,225,227,101,128,
-    255, 48,115,  2, 23,  8, 23, 25,105,129,  3,168, 23, 14,227,249,
-    242,233,236,236,233, 99,128,  4,112,237,225,236,108,128,247,112,
-     81,131,  0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101,
-    128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243,
-    237,225,236,108,128,247,113, 82,138,  0, 82, 23, 95, 23,119, 23,
-    166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97,
-      2, 23,101, 23,112,225,242,237,229,238,233,225,110,128,  5, 76,
-    227,245,244,101,128,  1, 84, 99,  4, 23,129, 23,136, 23,145, 23,
-    153,225,242,239,110,128,  1, 88,229,228,233,236,236, 97,128,  1,
-     86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227,
-    229,238,116,128,  1, 86,100,  2, 23,172, 23,182,226,236,231,242,
-    225,246,101,128,  2, 16,239,116,  2, 23,189, 23,198,225,227,227,
-    229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208,
-    237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238,
-    233,225,110,128,  5, 80,230,242,225,235,244,245,114,128, 33, 28,
-    232,111,128,  3,161,233,110,  2, 23,252, 24,  5,231,243,237,225,
-    236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101,
-    128,  2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237,
-    239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108,
-    129,247,114, 24, 53,233,238,246,229,242,244,229,100,129,  2,129,
-     24, 66,243,245,240,229,242,233,239,114,128,  2,182, 83,139,  0,
-     83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27,
-    105, 27,117, 27,135, 27,143, 70,  6, 24,117, 24,209, 24,241, 25,
-     77, 25,119, 25,221, 48,  9, 24,137, 24,145, 24,153, 24,161, 24,
-    169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37,
-     12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37,
-     16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37,
-     60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37,
-     52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37,
-     36, 49,  3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37,
-      0,177,176,176,176, 48,128, 37,  2,185,176,176,176, 48,128, 37,
-     97, 50,  9, 25,  5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25,
-     53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176,
-    176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176,
-    176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176,
-    176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176,
-    176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51,  4, 25,
-     87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183,
-    176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185,
-    176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25,
-    165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176,
-    176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176,
-    176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176,
-    176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176,
-    176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176,
-    176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53,  5, 25,
-    233, 25,241, 25,249, 26,  1, 26,  9,176,176,176,176, 48,128, 37,
-     88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37,
-     83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37,
-    106, 97,  2, 26, 23, 26, 44,227,245,244,101,129,  1, 90, 26, 32,
-    228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231,
-    242,229,229,107,128,  3,224, 99,  5, 26, 67, 26, 98, 26,107, 26,
-    147, 26,169,225,242,239,110,130,  1, 96, 26, 78, 26, 90,228,239,
-    244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128,
-    246,253,229,228,233,236,236, 97,128,  1, 94,232,247, 97,130,  1,
-    143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128,  4,216,
-    228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,
-    128,  4,218,233,242, 99,  2, 26,155, 26,160,236,101,128, 36,200,
-    245,237,230,236,229,120,128,  1, 92,239,237,237,225,225,227,227,
-    229,238,116,128,  2, 24,228,239,116,  2, 26,190, 26,199,225,227,
-    227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26,
-    209,228,239,244,225,227,227,229,238,116,128, 30,104,101,  2, 26,
-    227, 26,239,232,225,242,237,229,238,233,225,110,128,  5, 77,246,
-    229,238,242,239,237,225,110,128, 33,102,104,  5, 27,  6, 27, 34,
-     27, 48, 27, 59, 27, 72, 97,  2, 27, 12, 27, 23,225,242,237,229,
-    238,233,225,110,128,  5, 71,227,249,242,233,236,236,233, 99,128,
-      4, 40,227,232,225,227,249,242,233,236,236,233, 99,128,  4, 41,
-    229,233,227,239,240,244,233, 99,128,  3,226,232,225,227,249,242,
-    233,236,236,233, 99,128,  4,186,233,237,225,227,239,240,244,233,
-     99,128,  3,236,105,  2, 27, 90, 27, 96,231,237, 97,128,  3,163,
-    248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225,
-    227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233,
-    236,236,233, 99,128,  4, 44,243,237,225,236,108,128,247,115,244,
-    233,231,237,225,231,242,229,229,107,128,  3,218, 84,141,  0, 84,
-     27,186, 27,191, 27,197, 28,  7, 28, 32, 28, 96, 28,147, 28,177,
-     28,189, 28,201, 28,246, 29,  6, 29, 46,225,117,128,  3,164,226,
-    225,114,128,  1,102, 99,  4, 27,207, 27,214, 27,223, 27,250,225,
-    242,239,110,128,  1,100,229,228,233,236,236, 97,128,  1, 98,233,
-    242, 99,  2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236,
-    229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227,
-    227,229,238,116,128,  1, 98,228,239,116,  2, 28, 15, 28, 24,225,
-    227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108,
-    101,  4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236,
-    233, 99,128,  4, 34,228,229,243,227,229,238,228,229,242,227,249,
-    242,233,236,236,233, 99,128,  4,172,238,242,239,237,225,110,128,
-     33,105,244,243,229,227,249,242,233,236,236,233, 99,128,  4,180,
-    104,  3, 28,104, 28,110, 28,136,229,244, 97,128,  3,152,111,  2,
-     28,116, 28,121,239,107,128,  1,172,242,110,129,  0,222, 28,128,
-    243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110,
-    128, 33, 98,105,  2, 28,153, 28,164,236,228,229,243,237,225,236,
-    108,128,246,254,247,238,225,242,237,229,238,233,225,110,128,  5,
-     79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238,
-    239,243,240,225,227,101,128,255, 52,111,  2, 28,207, 28,218,225,
-    242,237,229,238,233,225,110,128,  5, 57,238,101,  3, 28,227, 28,
-    234, 28,240,230,233,246,101,128,  1,188,243,233,120,128,  1,132,
-    244,247,111,128,  1,167,242,229,244,242,239,230,236,229,248,232,
-    239,239,107,128,  1,174,115,  3, 29, 14, 29, 26, 29, 39,229,227,
-    249,242,233,236,236,233, 99,128,  4, 38,232,229,227,249,242,233,
-    236,236,233, 99,128,  4, 11,237,225,236,108,128,247,116,119,  2,
-     29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107,
-    239,242,239,237,225,110,128, 33, 97, 85,142,  0, 85, 29,105, 29,
-    123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31,
-     21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129,  0,
-    218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101,
-    128,  1,108, 99,  3, 29,139, 29,146, 29,188,225,242,239,110,128,
-      1,211,233,242, 99,  2, 29,154, 29,159,236,101,128, 36,202,245,
-    237,230,236,229,120,130,  0,219, 29,172, 29,180,226,229,236,239,
-    119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236,
-    236,233, 99,128,  4, 35,100,  3, 29,206, 29,229, 30, 59,226,108,
-      2, 29,213, 29,221,225,227,245,244,101,128,  1,112,231,242,225,
-    246,101,128,  2, 20,233,229,242,229,243,233,115,134,  0,220, 29,
-    251, 30,  3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101,
-    128,  1,215,226,229,236,239,119,128, 30,114, 99,  2, 30, 17, 30,
-     24,225,242,239,110,128,  1,217,249,242,233,236,236,233, 99,128,
-      4,240,231,242,225,246,101,128,  1,219,237,225,227,242,239,110,
-    128,  1,213,243,237,225,236,108,128,247,252,239,244,226,229,236,
-    239,119,128, 30,228,231,242,225,246,101,129,  0,217, 30, 79,243,
-    237,225,236,108,128,247,249,104,  2, 30, 93, 30,171,111,  2, 30,
-     99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133,
-      1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244,
-    101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231,
-    242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101,
-    128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242,
-    245,237,236,225,245,116,129,  1,112, 30,187,227,249,242,233,236,
-    236,233, 99,128,  4,242,233,238,246,229,242,244,229,228,226,242,
-    229,246,101,128,  2, 22,235,227,249,242,233,236,236,233, 99,128,
-      4,120,109,  2, 30,232, 31, 10,225,227,242,239,110,130,  1,106,
-     30,244, 30,255,227,249,242,233,236,236,233, 99,128,  4,238,228,
-    233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225,
-    227,101,128,255, 53,239,231,239,238,229,107,128,  1,114,240,243,
-    233,236,239,110,133,  3,165, 31, 49, 31, 53, 31, 90, 31,121, 31,
-    134, 49,128,  3,210, 97,  2, 31, 59, 31, 81,227,245,244,229,232,
-    239,239,235,243,249,237,226,239,236,231,242,229,229,107,128,  3,
-    211,230,242,233,227,225,110,128,  1,177,228,233,229,242,229,243,
-    233,115,129,  3,171, 31,103,232,239,239,235,243,249,237,226,239,
-    236,231,242,229,229,107,128,  3,212,232,239,239,235,243,249,237,
-    226,239,108,128,  3,210,244,239,238,239,115,128,  3,142,242,233,
-    238,103,128,  1,110,115,  3, 31,157, 31,172, 31,179,232,239,242,
-    244,227,249,242,233,236,236,233, 99,128,  4, 14,237,225,236,108,
-    128,247,117,244,242,225,233,231,232,116,  2, 31,191, 31,202,227,
-    249,242,233,236,236,233, 99,128,  4,174,243,244,242,239,235,229,
-    227,249,242,233,236,236,233, 99,128,  4,176,244,233,236,228,101,
-    130,  1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226,
-    229,236,239,119,128, 30,116, 86,136,  0, 86, 32, 11, 32, 20, 32,
-     31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236,
-    101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101,
-      2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128,  4, 18,
-    247,225,242,237,229,238,233,225,110,128,  5, 78,232,239,239,107,
-    128,  1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239,
-    225,242,237,229,238,233,225,110,128,  5, 72,243,237,225,236,108,
-    128,247,118,244,233,236,228,101,128, 30,124, 87,134,  0, 87, 32,
-    123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101,
-    128, 30,130,227,233,242, 99,  2, 32,140, 32,145,236,101,128, 36,
-    204,245,237,230,236,229,120,128,  1,116,100,  2, 32,160, 32,170,
-    233,229,242,229,243,233,115,128, 30,132,239,116,  2, 32,177, 32,
-    186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128,
-     30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240,
-    225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134,
-      0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233,
-    242,227,236,101,128, 36,205,100,  2, 32,253, 33,  7,233,229,242,
-    229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128,
-     30,138,229,232,225,242,237,229,238,233,225,110,128,  5, 61,105,
-    128,  3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243,
-    237,225,236,108,128,247,120, 89,139,  0, 89, 33, 81, 33,116, 33,
-    139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34,
-     68, 97,  2, 33, 87, 33,104,227,245,244,101,129,  0,221, 33, 96,
-    243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233,
-     99,128,  4, 98,227,233,242, 99,  2, 33,125, 33,130,236,101,128,
-     36,206,245,237,230,236,229,120,128,  1,118,100,  2, 33,145, 33,
-    165,233,229,242,229,243,233,115,129,  1,120, 33,157,243,237,225,
-    236,108,128,247,255,239,116,  2, 33,172, 33,181,225,227,227,229,
-    238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114,  2,
-     33,196, 33,208,233,227,249,242,233,236,236,233, 99,128,  4, 43,
-    245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
-     99,128,  4,248,231,242,225,246,101,128, 30,242,232,239,239,107,
-    129,  1,179, 33,245,225,226,239,246,101,128, 30,246,105,  3, 34,
-      5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128,  5, 69,
-    227,249,242,233,236,236,233, 99,128,  4,  7,247,238,225,242,237,
-    229,238,233,225,110,128,  5, 82,237,239,238,239,243,240,225,227,
-    101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228,
-    101,128, 30,248,245,115,  2, 34, 75, 34,113,226,233,103,  2, 34,
-     83, 34, 94,227,249,242,233,236,236,233, 99,128,  4,106,233,239,
-    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
-    108,236,233,244,244,236,101,  2, 34,124, 34,135,227,249,242,233,
-    236,236,233, 99,128,  4,102,233,239,244,233,230,233,229,228,227,
-    249,242,233,236,236,233, 99,128,  4,104, 90,136,  0, 90, 34,174,
-     34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97,  2,
-     34,180, 34,191,225,242,237,229,238,233,225,110,128,  5, 54,227,
-    245,244,101,128,  1,121, 99,  2, 34,204, 34,221,225,242,239,110,
-    129,  1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99,
-      2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120,
-    128, 30,144,228,239,116,130,  1,123, 34,253, 35,  6,225,227,227,
-    229,238,116,128,  1,123,226,229,236,239,119,128, 30,146,101,  3,
-     35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128,  4,
-     23,100,  2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227,
-    249,242,233,236,236,233, 99,128,  4,152,233,229,242,229,243,233,
-    243,227,249,242,233,236,236,233, 99,128,  4,222,244, 97,128,  3,
-    150,232,101,  4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229,
-    238,233,225,110,128,  5, 58,226,242,229,246,229,227,249,242,233,
-    236,236,233, 99,128,  4,193,227,249,242,233,236,236,233, 99,128,
-      4, 22,100,  2, 35,136, 35,155,229,243,227,229,238,228,229,242,
-    227,249,242,233,236,236,233, 99,128,  4,150,233,229,242,229,243,
-    233,243,227,249,242,233,236,236,233, 99,128,  4,220,236,233,238,
-    229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225,
-    227,101,128,255, 58,115,  2, 35,203, 35,210,237,225,236,108,128,
-    247,122,244,242,239,235,101,128,  1,181, 97,158,  0, 97, 36, 26,
-     38,154, 39,  4, 39, 68, 39,132, 39,196, 40,  4, 40, 68, 40,126,
-     40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229,
-     50,  0, 50,225, 51,  7, 52, 96, 52,168, 53,123, 53,132, 54,  5,
-     56, 13, 57,  3, 57, 50, 57,201, 57,215, 49,138, 39,  1, 36, 50,
-     36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26,
-     38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90,
-     36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128,
-     39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128,
-     39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128,
-     38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146,
-     36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128,
-     39,  9, 56,128, 39,  8, 57,128, 39,  7, 50,138, 38, 30, 36,178,
-     36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210,
-     36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128,
-     36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128,
-     36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242,
-     36,246, 36,250, 36,254, 37,  2, 37,  6, 37, 10, 37, 14, 37, 18,
-     37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128,
-     39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128,
-     39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50,
-     37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82,
-     37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128,
-     39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128,
-     39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114,
-     37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146,
-     37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128,
-     39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128,
-     39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178,
-     37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210,
-     37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128,
-     33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128,
-     39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242,
-     37,246, 37,250, 37,254, 38,  2, 38,  6, 38, 10, 38, 14, 38, 18,
-     38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128,
-     39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128,
-     39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50,
-     38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82,
-     38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128,
-     39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128,
-     39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114,
-     38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146,
-     38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128,
-     39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128,
-     39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39,  2, 38,178,
-     38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252,
-     39,  0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212,
-     38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39,  3,
-     51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112,
-     49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24,
-     53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28,
-     57,128, 39, 34, 51,138, 39,  4, 39, 28, 39, 32, 39, 36, 39, 40,
-     39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35,
-     49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39,
-     53,128, 38,  5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43,
-     57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104,
-     39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45,
-     49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49,
-     53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53,
-     57,128, 39, 54, 53,138, 39,  6, 39,156, 39,160, 39,164, 39,168,
-     39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55,
-     49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59,
-     53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63,
-     57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232,
-     39,236, 39,240, 39,244, 39,248, 39,252, 40,  0, 48,128, 39, 65,
-     49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69,
-     53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73,
-     57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40,
-     40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75,
-     49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79,
-     53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198,
-     57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102,
-     40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128,
-     39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128,
-     39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138,
-     39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174,
-     40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128,
-     39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128,
-     39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97,  7,
-     40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229,
-    238,231,225,236,105,128,  9,134,227,245,244,101,128,  0,225,228,
-    229,246, 97,128,  9,  6,231,117,  2, 40,237, 40,246,234,225,242,
-    225,244,105,128, 10,134,242,237,245,235,232,105,128, 10,  6,237,
-    225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242,
-    245,243,241,245,225,242,101,128, 51,  3,246,239,247,229,236,243,
-    233,231,110,  3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236,
-    105,128,  9,190,228,229,246, 97,128,  9, 62,231,245,234,225,242,
-    225,244,105,128, 10,190, 98,  4, 41, 80, 41,121, 41,130, 41,140,
-    226,242,229,246,233,225,244,233,239,110,  2, 41, 95, 41,110,237,
-    225,242,235,225,242,237,229,238,233,225,110,128,  5, 95,243,233,
-    231,238,228,229,246, 97,128,  9,112,229,238,231,225,236,105,128,
-      9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101,
-    134,  1,  3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225,
-    227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128,
-      4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225,
-    246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30,
-    179,244,233,236,228,101,128, 30,181, 99,  4, 41,227, 41,234, 42,
-     57, 42,127,225,242,239,110,128,  1,206,233,242, 99,  2, 41,242,
-     41,247,236,101,128, 36,208,245,237,230,236,229,120,133,  0,226,
-     42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128,
-     30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225,
-    246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30,
-    169,244,233,236,228,101,128, 30,171,245,244,101,133,  0,180, 42,
-     73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237,
-     98,128,  3, 23, 99,  2, 42, 90, 42, 95,237, 98,128,  3,  1,239,
-    237, 98,128,  3,  1,228,229,246, 97,128,  9, 84,236,239,247,237,
-    239,100,128,  2,207,244,239,238,229,227,237, 98,128,  3, 65,249,
-    242,233,236,236,233, 99,128,  4, 48,100,  5, 42,149, 42,159, 42,
-    173, 42,179, 42,213,226,236,231,242,225,246,101,128,  2,  1,228,
-    225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97,
-    128,  9,  5,233,229,242,229,243,233,115,130,  0,228, 42,193, 42,
-    204,227,249,242,233,236,236,233, 99,128,  4,211,237,225,227,242,
-    239,110,128,  1,223,239,116,  2, 42,220, 42,228,226,229,236,239,
-    119,128, 30,161,237,225,227,242,239,110,128,  1,225,101,131,  0,
-    230, 42,247, 42,255, 43,  8,225,227,245,244,101,128,  1,253,235,
-    239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128,  1,
-    227,230,233,105,  6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49,
-    111, 48,  2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185,
-    180, 49,128, 32,164,177, 48,  3, 43, 62, 45, 86, 45,221, 48,  9,
-     43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218,
-     45, 24, 49,  3, 43, 90, 43, 94, 43, 98, 55,128,  4, 16, 56,128,
-      4, 17, 57,128,  4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136,
-     43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128,  4, 19,
-     49,128,  4, 20, 50,128,  4, 21, 51,128,  4,  1, 52,128,  4, 22,
-     53,128,  4, 23, 54,128,  4, 24, 55,128,  4, 25, 56,128,  4, 26,
-     57,128,  4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202,
-     43,206, 43,210, 43,214, 43,218, 43,222, 48,128,  4, 28, 49,128,
-      4, 29, 50,128,  4, 30, 51,128,  4, 31, 52,128,  4, 32, 53,128,
-      4, 33, 54,128,  4, 34, 55,128,  4, 35, 56,128,  4, 36, 57,128,
-      4, 37, 52, 10, 43,248, 43,252, 44,  0, 44,  4, 44,  8, 44, 12,
-     44, 16, 44, 20, 44, 24, 44, 28, 48,128,  4, 38, 49,128,  4, 39,
-     50,128,  4, 40, 51,128,  4, 41, 52,128,  4, 42, 53,128,  4, 43,
-     54,128,  4, 44, 55,128,  4, 45, 56,128,  4, 46, 57,128,  4, 47,
-     53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78,
-     44, 82, 44, 86, 44, 90, 48,128,  4,144, 49,128,  4,  2, 50,128,
-      4,  3, 51,128,  4,  4, 52,128,  4,  5, 53,128,  4,  6, 54,128,
-      4,  7, 55,128,  4,  8, 56,128,  4,  9, 57,128,  4, 10, 54, 10,
-     44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144,
-     44,148, 44,152, 48,128,  4, 11, 49,128,  4, 12, 50,128,  4, 14,
-     51,128,246,196, 52,128,246,197, 53,128,  4, 48, 54,128,  4, 49,
-     55,128,  4, 50, 56,128,  4, 51, 57,128,  4, 52, 55, 10, 44,178,
-     44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210,
-     44,214, 48,128,  4, 53, 49,128,  4, 81, 50,128,  4, 54, 51,128,
-      4, 55, 52,128,  4, 56, 53,128,  4, 57, 54,128,  4, 58, 55,128,
-      4, 59, 56,128,  4, 60, 57,128,  4, 61, 56, 10, 44,240, 44,244,
-     44,248, 44,252, 45,  0, 45,  4, 45,  8, 45, 12, 45, 16, 45, 20,
-     48,128,  4, 62, 49,128,  4, 63, 50,128,  4, 64, 51,128,  4, 65,
-     52,128,  4, 66, 53,128,  4, 67, 54,128,  4, 68, 55,128,  4, 69,
-     56,128,  4, 70, 57,128,  4, 71, 57, 10, 45, 46, 45, 50, 45, 54,
-     45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128,
-      4, 72, 49,128,  4, 73, 50,128,  4, 74, 51,128,  4, 75, 52,128,
-      4, 76, 53,128,  4, 77, 54,128,  4, 78, 55,128,  4, 79, 56,128,
-      4,145, 57,128,  4, 82, 49,  4, 45, 96, 45,158, 45,163, 45,189,
-     48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142,
-     45,146, 45,150, 45,154, 48,128,  4, 83, 49,128,  4, 84, 50,128,
-      4, 85, 51,128,  4, 86, 52,128,  4, 87, 53,128,  4, 88, 54,128,
-      4, 89, 55,128,  4, 90, 56,128,  4, 91, 57,128,  4, 92,177, 48,
-    128,  4, 94, 52,  4, 45,173, 45,177, 45,181, 45,185, 53,128,  4,
-     15, 54,128,  4, 98, 55,128,  4,114, 56,128,  4,116, 57,  5, 45,
-    201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128,  4,
-     95, 52,128,  4, 99, 53,128,  4,115, 54,128,  4,117, 56,  2, 45,
-    227, 45,241, 51,  2, 45,233, 45,237, 49,128,246,199, 50,128,246,
-    200,180, 54,128,  4,217,178,185, 57,128, 32, 14,179, 48,  2, 46,
-      3, 46,  7, 48,128, 32, 15, 49,128, 32, 13,181, 55,  7, 46, 28,
-     46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51,  2, 46, 34,
-     46, 48, 56,  2, 46, 40, 46, 44, 49,128,  6,106, 56,128,  6, 12,
-     57,  8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90,
-     46, 94, 50,128,  6, 96, 51,128,  6, 97, 52,128,  6, 98, 53,128,
-      6, 99, 54,128,  6,100, 55,128,  6,101, 56,128,  6,102, 57,128,
-      6,103, 52,  7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102,
-     47,158, 48,  5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128,
-      6,104, 49,128,  6,105, 51,128,  6, 27, 55,128,  6, 31, 57,128,
-      6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188,
-     46,192, 46,196, 46,200, 46,204, 48,128,  6, 34, 49,128,  6, 35,
-     50,128,  6, 36, 51,128,  6, 37, 52,128,  6, 38, 53,128,  6, 39,
-     54,128,  6, 40, 55,128,  6, 41, 56,128,  6, 42, 57,128,  6, 43,
-     50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254,
-     47,  2, 47,  6, 47, 10, 48,128,  6, 44, 49,128,  6, 45, 50,128,
-      6, 46, 51,128,  6, 47, 52,128,  6, 48, 53,128,  6, 49, 54,128,
-      6, 50, 55,128,  6, 51, 56,128,  6, 52, 57,128,  6, 53, 51,  5,
-     47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128,  6, 54, 49,128,
-      6, 55, 50,128,  6, 56, 51,128,  6, 57, 52,128,  6, 58, 52,  9,
-     47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94,
-     47, 98, 48,128,  6, 64, 49,128,  6, 65, 50,128,  6, 66, 51,128,
-      6, 67, 52,128,  6, 68, 53,128,  6, 69, 54,128,  6, 70, 56,128,
-      6, 72, 57,128,  6, 73, 53,  9, 47,122, 47,126, 47,130, 47,134,
-     47,138, 47,142, 47,146, 47,150, 47,154, 48,128,  6, 74, 49,128,
-      6, 75, 50,128,  6, 76, 51,128,  6, 77, 52,128,  6, 78, 53,128,
-      6, 79, 54,128,  6, 80, 55,128,  6, 81, 56,128,  6, 82,183, 48,
-    128,  6, 71, 53,  3, 47,171, 47,203, 47,235, 48,  5, 47,183, 47,
-    187, 47,191, 47,195, 47,199, 53,128,  6,164, 54,128,  6,126, 55,
-    128,  6,134, 56,128,  6,152, 57,128,  6,175, 49,  5, 47,215, 47,
-    219, 47,223, 47,227, 47,231, 49,128,  6,121, 50,128,  6,136, 51,
-    128,  6,145, 52,128,  6,186, 57,128,  6,210,179, 52,128,  6,213,
-     54,  7, 48,  0, 48,  5, 48, 10, 48, 15, 48, 53, 48,115, 48,177,
-    179, 54,128, 32,170,180, 53,128,  5,190,181, 56,128,  5,195, 54,
-      6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128,  5,
-    208, 53,128,  5,209, 54,128,  5,210, 55,128,  5,211, 56,128,  5,
-    212, 57,128,  5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48,
-     91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128,  5,214, 49,
-    128,  5,215, 50,128,  5,216, 51,128,  5,217, 52,128,  5,218, 53,
-    128,  5,219, 54,128,  5,220, 55,128,  5,221, 56,128,  5,222, 57,
-    128,  5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48,
-    157, 48,161, 48,165, 48,169, 48,173, 48,128,  5,224, 49,128,  5,
-    225, 50,128,  5,226, 51,128,  5,227, 52,128,  5,228, 53,128,  5,
-    229, 54,128,  5,230, 55,128,  5,231, 56,128,  5,232, 57,128,  5,
-    233, 57,  3, 48,185, 48,189, 48,193, 48,128,  5,234, 52,128,251,
-     42, 53,128,251, 43, 55,  4, 48,207, 48,221, 48,241, 48,246, 48,
-      2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49,  3, 48,
-    229, 48,233, 48,237, 54,128,  5,240, 55,128,  5,241, 56,128,  5,
-    242,178, 51,128,251, 53, 57,  7, 49,  6, 49, 10, 49, 14, 49, 18,
-     49, 22, 49, 26, 49, 30, 51,128,  5,180, 52,128,  5,181, 53,128,
-      5,182, 54,128,  5,187, 55,128,  5,184, 56,128,  5,183, 57,128,
-      5,176, 56,  3, 49, 42, 49, 86, 49, 91, 48,  7, 49, 58, 49, 62,
-     49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128,  5,178, 49,128,
-      5,177, 50,128,  5,179, 51,128,  5,194, 52,128,  5,193, 54,128,
-      5,185, 55,128,  5,188,179, 57,128,  5,189, 52,  2, 49, 97, 49,
-    101, 49,128,  5,191, 50,128,  5,192,185,178, 57,128,  2,188, 54,
-      3, 49,119, 49,178, 49,185, 49,  4, 49,129, 49,145, 49,151, 49,
-    172, 50,  2, 49,135, 49,140,180, 56,128, 33,  5,184, 57,128, 33,
-     19,179,181, 50,128, 33, 22,181, 55,  3, 49,160, 49,164, 49,168,
-     51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128,
-     32, 12,179,177,182, 55,128,  6,109,180,185,179, 55,128,  2,189,
-    103,  2, 49,198, 49,205,242,225,246,101,128,  0,224,117,  2, 49,
-    211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235,
-    232,105,128, 10,  5,104,  2, 49,235, 49,245,233,242,225,231,225,
-    238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163,
-    105,  7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181,
-     98,  2, 50, 22, 50, 31,229,238,231,225,236,105,128,  9,144,239,
-    240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128,  9, 16,
-    229,227,249,242,233,236,236,233, 99,128,  4,213,231,117,  2, 50,
-     67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235,
-    232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235,
-    232,105,128, 10, 72,110,  5, 50,113, 50,122, 50,136, 50,152, 50,
-    167,225,242,225,226,233, 99,128,  6, 57,230,233,238,225,236,225,
-    242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225,
-    242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242,
-    225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229,
-    246,101,128,  2,  3,246,239,247,229,236,243,233,231,110,  3, 50,
-    197, 50,207, 50,214,226,229,238,231,225,236,105,128,  9,200,228,
-    229,246, 97,128,  9, 72,231,245,234,225,242,225,244,105,128, 10,
-    200,107,  2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48,
-    162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239,
-    242,229,225,110,128, 49, 79,108,  3, 51, 15, 52, 71, 52, 80,101,
-      2, 51, 21, 52, 66,102,136,  5,208, 51, 41, 51, 50, 51, 65, 51,
-     79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128,
-      6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251,
-     48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104,
-      2, 51, 85, 51,160,225,237,250, 97,  2, 51, 94, 51,127,225,226,
-    239,246,101,  2, 51,104, 51,113,225,242,225,226,233, 99,128,  6,
-     35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226,
-    229,236,239,119,  2, 51,137, 51,146,225,242,225,226,233, 99,128,
-      6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136,
-    229,226,242,229,119,128,  5,208,236,225,237,229,228,232,229,226,
-    242,229,119,128,251, 79,237, 97,  2, 51,189, 51,225,228,228,225,
-    225,226,239,246,101,  2, 51,202, 51,211,225,242,225,226,233, 99,
-    128,  6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254,
-    130,235,243,245,242, 97,  4, 51,239, 51,248, 52,  6, 52, 22,225,
-    242,225,226,233, 99,128,  6, 73,230,233,238,225,236,225,242,225,
-    226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225,
-    226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226,
-    233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119,
-    128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128,
-    251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76,
-    240,232, 97,129,  3,177, 52, 88,244,239,238,239,115,128,  3,172,
-    109,  4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128,
-      1,  1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242,
-    243,225,238,100,130,  0, 38, 52,139, 52,151,237,239,238,239,243,
-    240,225,227,101,128,255,  6,243,237,225,236,108,128,247, 38,243,
-    241,245,225,242,101,128, 51,194,110,  4, 52,178, 52,189, 53, 55,
-     53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103,  4, 52,
-    199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128,
-     49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90,
-    236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235,
-    229,116,  2, 52,247, 53, 11,236,229,230,116,129, 48,  8, 53,  0,
-    246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116,
-    129, 48,  9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64,
-    236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243,
-    244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128,  3,
-    135,117,  2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97,
-    128,  9, 82,243,246,225,242, 97,  3, 53, 95, 53,105, 53,112,226,
-    229,238,231,225,236,105,128,  9,130,228,229,246, 97,128,  9,  2,
-    231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229,
-    107,128,  1,  5,112,  3, 53,140, 53,164, 53,194, 97,  2, 53,146,
-     53,158,225,244,239,243,241,245,225,242,101,128, 51,  0,242,229,
-    110,128, 36,156,239,243,244,242,239,240,232,101,  2, 53,177, 53,
-    188,225,242,237,229,238,233,225,110,128,  5, 90,237,239,100,128,
-      2,188,112,  2, 53,200, 53,205,236,101,128,248,255,242,111,  2,
-     53,212, 53,220,225,227,232,229,115,128, 34, 80,120,  2, 53,226,
-     53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237,
-    225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245,
-    225,108,128, 34, 69,114,  4, 54, 15, 54, 42, 54, 46, 54, 91,225,
-    229, 97,  2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49,
-    142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105,  2,
-     54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128,
-     30,154,238,103,130,  0,229, 54, 75, 54, 83,225,227,245,244,101,
-    128,  1,251,226,229,236,239,119,128, 30,  1,242,239,119,  8, 54,
-    111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56,  4,226,
-    239,244,104,128, 33,148,100,  3, 54,126, 54,165, 54,212,225,243,
-    104,  4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33,
-    227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226,
-    245,112,128, 33,225,226,108,  5, 54,178, 54,185, 54,192, 54,199,
-     54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211,
-    236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245,
-    112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239,
-    236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247,
-    232,233,244,101,128, 33,233,104,  2, 54,253, 55, 48,229,225,100,
-      4, 55,  9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100,
-    128,  2,197,236,229,230,244,237,239,100,128,  2,194,242,233,231,
-    232,244,237,239,100,128,  2,195,245,240,237,239,100,128,  2,196,
-    239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144,
-     55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244,
-    242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116,
-    128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116,
-    132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244,
-    242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239,
-    246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128,
-     33,232,244,225, 98,  2, 55,170, 55,177,236,229,230,116,128, 33,
-    228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198,
-     55,226, 55,244, 55,252,100,  2, 55,204, 55,216,110,129, 33,149,
-     55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128,
-     33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247,
-    110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244,
-    101,128, 33,231,246,229,242,244,229,120,128,248,230,115,  5, 56,
-     25, 56,101, 56,146, 56,229, 56,239, 99,  2, 56, 31, 56, 83,233,
-    105,  2, 56, 38, 56, 61,227,233,242,227,245,109,129,  0, 94, 56,
-     49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236,
-    228,101,129,  0,126, 56, 71,237,239,238,239,243,240,225,227,101,
-    128,255, 94,242,233,240,116,129,  2, 81, 56, 92,244,245,242,238,
-    229,100,128,  2, 82,237,225,236,108,  2, 56,110, 56,121,232,233,
-    242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238,
-     97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128,
-    255,103,244,229,242,233,115,  2, 56,156, 56,225,107,131,  0, 42,
-     56,166, 56,194, 56,217, 97,  2, 56,172, 56,186,236,244,239,238,
-    229,225,242,225,226,233, 99,128,  6,109,242,225,226,233, 99,128,
-      6,109,109,  2, 56,200, 56,206,225,244,104,128, 34, 23,239,238,
-    239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254,
-     97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249,
-    237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108,
-    128, 34, 67,116,132,  0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233,
-    236,228,101,128,  0,227,237,239,238,239,243,240,225,227,101,128,
-    255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128,
-      2, 80,117,  6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157,
-     98,  2, 57, 70, 57, 79,229,238,231,225,236,105,128,  9,148,239,
-    240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128,  9, 20,
-    231,117,  2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148,
-    242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237,
-    225,242,235,226,229,238,231,225,236,105,128,  9,215,237,225,244,
-    242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247,
-    229,236,243,233,231,110,  3, 57,173, 57,183, 57,190,226,229,238,
-    231,225,236,105,128,  9,204,228,229,246, 97,128,  9, 76,231,245,
-    234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225,
-    228,229,246, 97,128,  9, 61,121,  2, 57,221, 57,233,226,225,242,
-    237,229,238,233,225,110,128,  5, 97,233,110,130,  5,226, 57,242,
-     58,  1,225,236,244,239,238,229,232,229,226,242,229,119,128,251,
-     32,232,229,226,242,229,119,128,  5,226, 98,144,  0, 98, 58, 46,
-     58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72,
-     62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97,  7,
-     58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229,
-    238,231,225,236,105,128,  9,172,227,235,243,236,225,243,104,129,
-      0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60,
-    228,229,246, 97,128,  9, 44,231,117,  2, 58,110, 58,119,234,225,
-    242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44,
-    104,  2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112,
-    244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97,
-    128, 48,208,114,129,  0,124, 58,169,237,239,238,239,243,240,225,
-    227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49,  5,
-    227,233,242,227,236,101,128, 36,209,228,239,116,  2, 58,209, 58,
-    218,225,227,227,229,238,116,128, 30,  3,226,229,236,239,119,128,
-     30,  5,101,  6, 58,240, 59,  5, 59, 28, 59,170, 59,181, 59,193,
-    225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244,
-    229,115,128, 38,108, 99,  2, 59, 11, 59, 18,225,245,243,101,128,
-     34, 53,249,242,233,236,236,233, 99,128,  4, 49,104,  5, 59, 40,
-     59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128,  6,
-     40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105,
-      2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233,
-     99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101,  2,
-     59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254,
-    146,229,237,105,  2, 59,121, 59,136,238,233,244,233,225,236,225,
-    242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225,
-    242,225,226,233, 99,128,252,  8,238,239,239,238,230,233,238,225,
-    236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225,
-    238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128,  5,
-     98,116,132,  5,209, 59,205, 59,225, 59,245, 59,254, 97,129,  3,
-    178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128,  3,
-    208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242,
-    229,119,128,251, 49,232,229,226,242,229,119,128,  5,209,242,225,
-    230,229,232,229,226,242,229,119,128,251, 76,104,  2, 60, 17, 60,
-     67, 97,  3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105,
-    128,  9,173,228,229,246, 97,128,  9, 45,231,117,  2, 60, 49, 60,
-     58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105,
-    128, 10, 45,239,239,107,128,  2, 83,105,  5, 60, 85, 60, 96, 60,
-    107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115,
-    235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225,
-    236,227,236,233,227,107,128,  2,152,238,228,233,231,245,242,237,
-    245,235,232,105,128, 10,  2,242,245,243,241,245,225,242,101,128,
-     51, 49,108,  3, 60,154, 62, 55, 62, 66, 97,  2, 60,160, 62, 50,
-    227,107,  6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227,
-    233,242,227,236,101,128, 37,207,100,  2, 60,190, 60,199,233,225,
-    237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233,
-    238,231,244,242,233,225,238,231,236,101,128, 37,188,108,  2, 60,
-    227, 61, 74,101,  2, 60,233, 61, 13,230,244,240,239,233,238,244,
-    233,238,103,  2, 60,248, 61,  2,240,239,233,238,244,229,114,128,
-     37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233,
-    227,245,236,225,242,226,242,225,227,235,229,116,  2, 61, 33, 61,
-     53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227,
-    225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246,
-    229,242,244,233,227,225,108,128,254, 60,239,247,229,114,  2, 61,
-     83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128,
-     37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128,
-     37,226,114,  2, 61,120, 61,131,229,227,244,225,238,231,236,101,
-    128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103,  2,
-     61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242,
-    233,225,238,231,236,101,128, 37,182,115,  3, 61,177, 61,207, 61,
-    215,109,  2, 61,183, 61,195,225,236,236,243,241,245,225,242,101,
-    128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241,
-    245,225,242,101,128, 37,160,244,225,114,128, 38,  5,245,240,112,
-      2, 61,229, 62, 11,229,114,  2, 61,236, 61,251,236,229,230,244,
-    244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244,
-    244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233,
-    238,103,  2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225,
-    238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128,
-     37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128,
-     30,  7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227,
-    101,128,255, 66,111,  3, 62, 92, 62,105, 62,116,226,225,233,237,
-    225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238,
-     97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240,
-    225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51,
-    195,114,  4, 62,155, 63,149, 63,222, 64,  5,225, 99,  2, 62,162,
-     63, 56,101,  3, 62,170, 62,175, 62,243,229,120,128,248,244,236,
-    229,230,116,133,  0,123, 62,192, 62,197, 62,219, 62,227, 62,232,
-    226,116,128,248,243,109,  2, 62,203, 62,208,233,100,128,248,242,
-    239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108,
-    128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108,
-    128,254, 55,242,233,231,232,116,133,  0,125, 63,  5, 63, 10, 63,
-     32, 63, 40, 63, 45,226,116,128,248,254,109,  2, 63, 16, 63, 21,
-    233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93,
-    243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242,
-    244,233,227,225,108,128,254, 56,235,229,116,  2, 63, 64, 63,106,
-    236,229,230,116,132,  0, 91, 63, 79, 63, 84, 63, 89, 63,101,226,
-    116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225,
-    227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132,
-      0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229,
-    120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61,
-    244,112,128,248,249,229,246,101,131,  2,216, 63,161, 63,172, 63,
-    178,226,229,236,239,247,227,237, 98,128,  3, 46,227,237, 98,128,
-      3,  6,233,238,246,229,242,244,229,100,  3, 63,193, 63,204, 63,
-    210,226,229,236,239,247,227,237, 98,128,  3, 47,227,237, 98,128,
-      3, 17,228,239,245,226,236,229,227,237, 98,128,  3, 97,233,228,
-    231,101,  2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128,
-      3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227,
-    237, 98,128,  3, 58,239,235,229,238,226,225,114,128,  0,166,115,
-      2, 64, 21, 64, 29,244,242,239,235,101,128,  1,128,245,240,229,
-    242,233,239,114,128,246,234,244,239,240,226,225,114,128,  1,131,
-    117,  3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97,
-    128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108,
-      2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238,
-    246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114,
-    128, 34, 25,243,229,249,101,128, 37,206, 99,143,  0, 99, 64,156,
-     65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43,
-     69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97,  9, 64,176,
-     64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51,
-    225,242,237,229,238,233,225,110,128,  5,110,226,229,238,231,225,
-    236,105,128,  9,154,227,245,244,101,128,  1,  7,228,229,246, 97,
-    128,  9, 26,231,117,  2, 64,218, 64,227,234,225,242,225,244,105,
-    128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245,
-    225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117,  4,
-     65,  8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128,
-      9,129,227,237, 98,128,  3, 16,228,229,246, 97,128,  9,  1,231,
-    245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107,
-    128, 33,234,114,  3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33,
-      5,239,110,130,  2,199, 65, 74, 65, 85,226,229,236,239,247,227,
-    237, 98,128,  3, 44,227,237, 98,128,  3, 12,242,233,225,231,229,
-    242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230,
-    111,128, 49, 24, 99,  4, 65,126, 65,133, 65,152, 65,174,225,242,
-    239,110,128,  1, 13,229,228,233,236,236, 97,129,  0,231, 65,144,
-    225,227,245,244,101,128, 30,  9,233,242, 99,  2, 65,160, 65,165,
-    236,101,128, 36,210,245,237,230,236,229,120,128,  1,  9,245,242,
-    108,128,  2, 85,100,  2, 65,186, 65,202,239,116,129,  1, 11, 65,
-    193,225,227,227,229,238,116,128,  1, 11,243,241,245,225,242,101,
-    128, 51,197,101,  2, 65,217, 65,233,228,233,236,236, 97,129,  0,
-    184, 65,227,227,237, 98,128,  3, 39,238,116,132,  0,162, 65,246,
-     66, 14, 66, 26, 66, 37,105,  2, 65,252, 66,  4,231,242,225,228,
-    101,128, 33,  3,238,230,229,242,233,239,114,128,246,223,237,239,
-    238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249,
-    236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224,
-    104,  5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97,  4, 66, 70,
-     66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128,  5,
-    121,226,229,238,231,225,236,105,128,  9,155,228,229,246, 97,128,
-      9, 27,231,117,  2, 66,105, 66,114,234,225,242,225,244,105,128,
-     10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237,
-    239,230,111,128, 49, 20,101,  6, 66,148, 66,168, 66,192, 67,  4,
-     67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242,
-    233,236,236,233, 99,128,  4,189, 99,  2, 66,174, 66,182,235,237,
-    225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128,  4, 71,
-    100,  2, 66,198, 66,242,229,243,227,229,238,228,229,114,  2, 66,
-    211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233,
-    236,236,233, 99,128,  4,191,227,249,242,233,236,236,233, 99,128,
-      4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233,
-     99,128,  4,245,232,225,242,237,229,238,233,225,110,128,  5,115,
-    235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236,
-    233, 99,128,  4,204,246,229,242,244,233,227,225,236,243,244,242,
-    239,235,229,227,249,242,233,236,236,233, 99,128,  4,185,105,129,
-      3,199, 67, 68,229,245,227,104,  4, 67, 81, 67,116, 67,131, 67,
-    140, 97,  2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242,
-    229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225,
-    110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110,
-    128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229,
-    238,235,239,242,229,225,110,128, 50,  9,111,  2, 67,160, 67,210,
-    227,104,  3, 67,169, 67,191, 67,201,225,110,  2, 67,176, 67,184,
-    231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14,  8,233,
-    238,231,244,232,225,105,128, 14,  9,239,229,244,232,225,105,128,
-     14, 12,239,107,128,  1,136,105,  2, 67,221, 68, 67,229,245, 99,
-      5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97,  2, 67,241, 68,
-      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118,
-    240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233,
-    242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242,
-    229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225,
-    110,128, 50,  8,245,240,225,242,229,238,235,239,242,229,225,110,
-    128, 50, 28,242, 99,  2, 68, 74, 68,169,236,101,132, 37,203, 68,
-     87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128,
-     34,151,239,116,128, 34,153,112,  2, 68,109, 68,115,236,245,115,
-    128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247,
-    233,244,104,  2, 68,136, 68,152,236,229,230,244,232,225,236,230,
-    226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236,
-    230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130,
-      2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128,  3,
-     45,227,237, 98,128,  3,  2,108,  3, 68,207, 68,213, 69, 11,229,
-    225,114,128, 35, 39,233,227,107,  4, 68,225, 68,236, 68,245, 68,
-    255,225,236,246,229,239,236,225,114,128,  1,194,228,229,238,244,
-    225,108,128,  1,192,236,225,244,229,242,225,108,128,  1,193,242,
-    229,244,242,239,230,236,229,120,128,  1,195,245, 98,129, 38, 99,
-     69, 18,243,245,233,116,  2, 69, 27, 69, 35,226,236,225,227,107,
-    128, 38, 99,247,232,233,244,101,128, 38,103,109,  3, 69, 51, 69,
-     65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51,
-    164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225,
-    242,229,228,243,241,245,225,242,101,128, 51,160,111,  8, 69,110,
-     69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242,
-    237,229,238,233,225,110,128,  5,129,236,239,110,131,  0, 58, 69,
-    133, 69,158, 69,177,237,239,110,  2, 69,141, 69,149,229,244,225,
-    242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115,  2,
-     69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254,
-     85,244,242,233,225,238,231,245,236,225,114,  2, 69,192, 69,202,
-    232,225,236,230,237,239,100,128,  2,209,237,239,100,128,  2,208,
-    109,  2, 69,214, 70,143,237, 97,134,  0, 44, 69,231, 70, 39, 70,
-     50, 70, 62, 70, 92, 70,115, 97,  3, 69,239, 70,  9, 70, 17,226,
-    239,246,101,  2, 69,248, 69,254,227,237, 98,128,  3, 19,242,233,
-    231,232,244,227,237, 98,128,  3, 21,227,227,229,238,116,128,246,
-    195,114,  2, 70, 23, 70, 30,225,226,233, 99,128,  6, 12,237,229,
-    238,233,225,110,128,  5, 93,233,238,230,229,242,233,239,114,128,
-    246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229,
-    246,229,242,243,229,100,  2, 70, 75, 70, 86,225,226,239,246,229,
-    227,237, 98,128,  3, 20,237,239,100,128,  2,189,115,  2, 70, 98,
-     70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114,
-    128,246,226,244,245,242,238,229,100,  2, 70,126, 70,137,225,226,
-    239,246,229,227,237, 98,128,  3, 18,237,239,100,128,  2,187,240,
-    225,243,115,128, 38, 60,110,  2, 70,156, 70,165,231,242,245,229,
-    238,116,128, 34, 69,116,  2, 70,171, 70,185,239,245,242,233,238,
-    244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35,  3, 70,
-    219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71,
-    112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128,  0,
-      6, 66,  2, 70,231, 70,236,197, 76,128,  0,  7, 83,128,  0,  8,
-     67,  2, 70,246, 70,251,193, 78,128,  0, 24, 82,128,  0, 13, 68,
-      3, 71,  7, 71, 33, 71, 38, 67,  4, 71, 17, 71, 21, 71, 25, 71,
-     29, 49,128,  0, 17, 50,128,  0, 18, 51,128,  0, 19, 52,128,  0,
-     20,197, 76,128,  0,127,204, 69,128,  0, 16, 69,  5, 71, 55, 71,
-     59, 71, 64, 71, 69, 71, 74, 77,128,  0, 25,206, 81,128,  0,  5,
-    207, 84,128,  0,  4,211, 67,128,  0, 27, 84,  2, 71, 80, 71, 84,
-     66,128,  0, 23, 88,128,  0,  3, 70,  2, 71, 94, 71, 98, 70,128,
-      0, 12, 83,128,  0, 28,199, 83,128,  0, 29,200, 84,128,  0,  9,
-    204, 70,128,  0, 10,206,193, 75,128,  0, 21,210, 83,128,  0, 30,
-     83,  5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128,  0, 15,
-     79,129,  0, 14, 71,150, 84,128,  0,  2,212, 88,128,  0,  1,213,
-     66,128,  0, 26,217, 78,128,  0, 22,213, 83,128,  0, 31,214, 84,
-    128,  0, 11,240,249,242,233,231,232,116,129,  0,169, 71,191,115,
-      2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128,
-    246,217,114,  2, 71,216, 72, 44,238,229,242,226,242,225,227,235,
-    229,116,  2, 71,231, 72,  9,236,229,230,116,130, 48, 12, 71,242,
-     71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229,
-    242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48,
-     13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255,
-     99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225,
-    244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245,
-    225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242,
-    101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229,
-    233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128,
-      2,151,245,114,  2, 72,121, 72,139,236,121,  2, 72,128, 72,134,
-    225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121,
-    128,  0,164,249,114,  4, 72,158, 72,166, 72,173, 72,181,194,242,
-    229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229,
-    246,101,128,246,212,230,236,229,120,128,246,213,100,146,  0,100,
-     72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59,
-     78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227,
-     79,247, 80, 19, 97, 11, 72,252, 73,  7, 73, 17, 73, 89, 73,152,
-     73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229,
-    238,233,225,110,128,  5,100,226,229,238,231,225,236,105,128,  9,
-    166,100,  5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225,
-    226,233, 99,128,  6, 54,229,246, 97,128,  9, 38,230,233,238,225,
-    236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225,
-    236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236,
-    225,242,225,226,233, 99,128,254,192,103,  3, 73, 97, 73,114, 73,
-    128,229,243,104,129,  5,188, 73,105,232,229,226,242,229,119,128,
-      5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33,
-    117,  2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242,
-    237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97,
-    128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108,  3,
-     73,182, 73,191, 73,229,225,242,225,226,233, 99,128,  6, 47,229,
-    116,130,  5,211, 73,200, 73,220,228,225,231,229,243,104,129,251,
-     51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242,
-    229,119,128,  5,211,230,233,238,225,236,225,242,225,226,233, 99,
-    128,254,170,237,237, 97,  3, 73,253, 74,  6, 74, 18,225,242,225,
-    226,233, 99,128,  6, 79,236,239,247,225,242,225,226,233, 99,128,
-      6, 79,244,225,238, 97,  2, 74, 27, 74, 41,236,244,239,238,229,
-    225,242,225,226,233, 99,128,  6, 76,242,225,226,233, 99,128,  6,
-     76,238,228, 97,128,  9,100,242,231, 97,  2, 74, 63, 74, 72,232,
-    229,226,242,229,119,128,  5,167,236,229,230,244,232,229,226,242,
-    229,119,128,  5,167,243,233,225,240,238,229,245,237,225,244,225,
-    227,249,242,233,236,236,233,227,227,237, 98,128,  4,133, 98,  3,
-     74,118, 75,115, 75,125,108,  9, 74,138, 74,146, 75,  3, 75, 11,
-     75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128,
-    246,211, 97,  2, 74,152, 74,209,238,231,236,229,226,242,225,227,
-    235,229,116,  2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74,
-    177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232,
-    116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254,
-     62,114,  2, 74,215, 74,236,227,232,233,238,246,229,242,244,229,
-    228,226,229,236,239,247,227,237, 98,128,  3, 43,242,239,119,  2,
-     74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116,
-    128, 33,210,228,225,238,228, 97,128,  9,101,231,242,225,246,101,
-    129,246,214, 75, 21,227,237, 98,128,  3, 15,233,238,244,229,231,
-    242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23,
-     75, 50,227,237, 98,128,  3, 51,239,246,229,242,236,233,238,229,
-    227,237, 98,128,  3, 63,240,242,233,237,229,237,239,100,128,  2,
-    186,246,229,242,244,233,227,225,108,  2, 75, 94, 75,100,226,225,
-    114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98,
-    128,  3, 14,239,240,239,237,239,230,111,128, 49,  9,243,241,245,
-    225,242,101,128, 51,200, 99,  4, 75,144, 75,151, 75,160, 75,187,
-    225,242,239,110,128,  1, 15,229,228,233,236,236, 97,128, 30, 17,
-    233,242, 99,  2, 75,168, 75,173,236,101,128, 36,211,245,237,230,
-    236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128,
-      1, 17,100,  4, 75,204, 76, 29, 76, 39, 76, 90, 97,  4, 75,214,
-     75,224, 75,231, 76,  0,226,229,238,231,225,236,105,128,  9,161,
-    228,229,246, 97,128,  9, 33,231,117,  2, 75,238, 75,247,234,225,
-    242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33,
-    108,  2, 76,  6, 76, 15,225,242,225,226,233, 99,128,  6,136,230,
-    233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225,
-    228,229,246, 97,128,  9, 92,232, 97,  3, 76, 48, 76, 58, 76, 65,
-    226,229,238,231,225,236,105,128,  9,162,228,229,246, 97,128,  9,
-     34,231,117,  2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10,
-    162,242,237,245,235,232,105,128, 10, 34,239,116,  2, 76, 97, 76,
-    106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128,
-     30, 13,101,  8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238,
-     77, 27, 77, 63, 99,  2, 76,138, 76,175,233,237,225,236,243,229,
-    240,225,242,225,244,239,114,  2, 76,156, 76,165,225,242,225,226,
-    233, 99,128,  6,107,240,229,242,243,233,225,110,128,  6,107,249,
-    242,233,236,236,233, 99,128,  4, 52,231,242,229,101,128,  0,176,
-    232,105,  2, 76,199, 76,208,232,229,226,242,229,119,128,  5,173,
-    242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99,
-    128,  3,239,235,225,244,225,235,225,238, 97,128, 48,199,108,  2,
-     76,244, 77, 11,229,244,101,  2, 76,252, 77,  3,236,229,230,116,
-    128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129,  3,180,
-     77, 18,244,245,242,238,229,100,128,  1,141,238,239,237,233,238,
-    225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229,
-    242,225,244,239,242,226,229,238,231,225,236,105,128,  9,248,250,
-    104,128,  2,164,104,  2, 77, 74, 77,124, 97,  3, 77, 82, 77, 92,
-     77, 99,226,229,238,231,225,236,105,128,  9,167,228,229,246, 97,
-    128,  9, 39,231,117,  2, 77,106, 77,115,234,225,242,225,244,105,
-    128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128,
-      2, 87,105,  6, 77,144, 77,193, 77,253, 78,  8, 78, 19, 78, 29,
-     97,  2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239,
-    115,129,  3,133, 77,166,227,237, 98,128,  3, 68,237,239,238,100,
-    129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38,
-     98,229,242,229,243,233,115,133,  0,168, 77,212, 77,220, 77,231,
-     77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239,
-    247,227,237, 98,128,  3, 36,227,237, 98,128,  3,  8,231,242,225,
-    246,101,128,246,216,244,239,238,239,115,128,  3,133,232,233,242,
-    225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97,
-    128, 48,194,244,244,239,237,225,242,107,128, 48,  3,246,105,  2,
-     78, 36, 78, 47,228,101,129,  0,247, 78, 43,115,128, 34, 35,243,
-    233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242,
-    233,236,236,233, 99,128,  4, 82,235,243,232,225,228,101,128, 37,
-    147,108,  2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128,
-     30, 15,243,241,245,225,242,101,128, 51,151,109,  2, 78,113, 78,
-    121,225,227,242,239,110,128,  1, 17,239,238,239,243,240,225,227,
-    101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78,
-    163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79,
-    154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228,
-    229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238,
-     97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236,
-    236,225,114,132,  0, 36, 78,222, 78,233, 78,245, 79,  0,233,238,
-    230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225,
-    227,101,128,255,  4,239,236,228,243,244,249,236,101,128,247, 36,
-    115,  2, 79,  6, 79, 13,237,225,236,108,128,254,105,245,240,229,
-    242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241,
-    245,225,242,101,128, 51, 38,116,  6, 79, 53, 79, 70, 79, 92, 79,
-    103, 79,135, 79,142,225,227,227,229,238,116,129,  2,217, 79, 64,
-    227,237, 98,128,  3,  7,226,229,236,239,247, 99,  2, 79, 81, 79,
-     86,237, 98,128,  3, 35,239,237, 98,128,  3, 35,235,225,244,225,
-    235,225,238, 97,128, 48,251,236,229,243,115,  2, 79,112, 79,116,
-    105,128,  1, 49,106,129,246,190, 79,122,243,244,242,239,235,229,
-    232,239,239,107,128,  2,132,237,225,244,104,128, 34,197,244,229,
-    228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239,
-    228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229,
-    119,128,251, 31,247,238,244,225,227,107,  2, 79,191, 79,202,226,
-    229,236,239,247,227,237, 98,128,  3, 30,237,239,100,128,  2,213,
-    240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114,
-    128,246,235,116,  2, 79,233, 79,239,225,233,108,128,  2, 86,239,
-    240,226,225,114,128,  1,140,117,  2, 79,253, 80,  8,232,233,242,
-    225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97,
-    128, 48,197,122,132,  1,243, 80, 31, 80, 40, 80, 59, 80, 96,225,
-    236,244,239,238,101,128,  2,163, 99,  2, 80, 46, 80, 53,225,242,
-    239,110,128,  1,198,245,242,108,128,  2,165,101,  2, 80, 65, 80,
-     85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236,
-    233, 99,128,  4,225,227,249,242,233,236,236,233, 99,128,  4, 85,
-    232,229,227,249,242,233,236,236,233, 99,128,  4, 95,101,151,  0,
-    101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82,
-     60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85,
-    230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97,
-      2, 80,165, 80,172,227,245,244,101,128,  0,233,242,244,104,128,
-     38, 65, 98,  3, 80,186, 80,195, 80,205,229,238,231,225,236,105,
-    128,  9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246,
-    101,128,  1, 21, 99,  5, 80,224, 81, 41, 81, 55, 81, 87, 81,176,
-     97,  2, 80,230, 81, 35,238,228,242, 97,  3, 80,241, 80,248, 81,
-      3,228,229,246, 97,128,  9, 13,231,245,234,225,242,225,244,105,
-    128, 10,141,246,239,247,229,236,243,233,231,110,  2, 81, 17, 81,
-     24,228,229,246, 97,128,  9, 69,231,245,234,225,242,225,244,105,
-    128, 10,197,242,239,110,128,  1, 27,229,228,233,236,236,225,226,
-    242,229,246,101,128, 30, 29,104,  2, 81, 61, 81, 72,225,242,237,
-    229,238,233,225,110,128,  5,101,249,233,247,238,225,242,237,229,
-    238,233,225,110,128,  5,135,233,242, 99,  2, 81, 95, 81,100,236,
-    101,128, 36,212,245,237,230,236,229,120,134,  0,234, 81,121, 81,
-    129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30,
-    191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239,
-    119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235,
-    225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197,
-    249,242,233,236,236,233, 99,128,  4, 84,100,  4, 81,196, 81,206,
-     81,212, 81,222,226,236,231,242,225,246,101,128,  2,  5,229,246,
-     97,128,  9, 15,233,229,242,229,243,233,115,128,  0,235,239,116,
-    130,  1, 23, 81,231, 81,240,225,227,227,229,238,116,128,  1, 23,
-    226,229,236,239,119,128, 30,185,101,  2, 81,254, 82,  9,231,245,
-    242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245,
-    242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236,
-    233, 99,128,  4, 68,103,  2, 82, 43, 82, 50,242,225,246,101,128,
-      0,232,245,234,225,242,225,244,105,128, 10,143,104,  4, 82, 70,
-     82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128,  5,
-    103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231,
-    225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30,
-    187,105,  4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237,
-    239,230,111,128, 49, 31,231,232,116,142,  0, 56, 82,168, 82,177,
-     82,187, 82,217, 82,224, 83,  6, 83, 31, 83, 76, 83,110, 83,122,
-     83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128,  6,
-    104,226,229,238,231,225,236,105,128,  9,238,227,233,242,227,236,
-    101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238,
-    243,243,229,242,233,102,128, 39,145,228,229,246, 97,128,  9,110,
-    229,229,110,  2, 82,232, 82,241,227,233,242,227,236,101,128, 36,
-    113,112,  2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242,
-    233,239,100,128, 36,153,231,117,  2, 83, 13, 83, 22,234,225,242,
-    225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104,
-      2, 83, 37, 83, 63, 97,  2, 83, 43, 83, 54,227,235,225,242,225,
-    226,233, 99,128,  6,104,238,231,250,232,239,117,128, 48, 40,238,
-    239,244,229,226,229,225,237,229,100,128, 38,107,105,  2, 83, 82,
-     83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
-    110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239,
-    238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249,
-    236,101,128,247, 56,112,  2, 83,139, 83,146,225,242,229,110,128,
-     36,123,229,114,  2, 83,153, 83,159,233,239,100,128, 36,143,243,
-    233,225,110,128,  6,248,242,239,237,225,110,128, 33,119,243,245,
-    240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88,
-    238,246,229,242,244,229,228,226,242,229,246,101,128,  2,  7,239,
-    244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,  4,
-    101,107,  2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48,
-    168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111,
-      2, 84,  5, 84, 20,238,235,225,242,231,245,242,237,245,235,232,
-    105,128, 10,116,242,229,225,110,128, 49, 84,108,  3, 84, 35, 84,
-     46, 84,107,227,249,242,233,236,236,233, 99,128,  4, 59,101,  2,
-     84, 52, 84, 59,237,229,238,116,128, 34,  8,246,229,110,  3, 84,
-     69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112,  2,
-     84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100,
-    128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233,
-    115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34,
-    238,109,  5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242,
-    239,110,130,  1, 19, 84,153, 84,161,225,227,245,244,101,128, 30,
-     23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233,
-     99,128,  4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242,
-    244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101,
-    128,255, 69,112,  2, 84,217, 84,237,232,225,243,233,243,237,225,
-    242,235,225,242,237,229,238,233,225,110,128,  5, 91,244,249,243,
-    229,116,128, 34,  5,110,  6, 85,  3, 85, 14, 85, 25, 85, 69, 85,
-    101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249,
-    242,233,236,236,233, 99,128,  4, 61,100,  2, 85, 31, 85, 50,225,
-    243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128,
-    254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
-    233, 99,128,  4,163,103,130,  1, 75, 85, 77, 85, 88,226,239,240,
-    239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236,
-    233, 99,128,  4,165,232,239,239,235,227,249,242,233,236,236,233,
-     99,128,  4,200,243,240,225,227,101,128, 32,  2,111,  3, 85,132,
-     85,140, 85,149,231,239,238,229,107,128,  1, 25,235,239,242,229,
-    225,110,128, 49, 83,240,229,110,130,  2, 91, 85,159, 85,168,227,
-    236,239,243,229,100,128,  2,154,242,229,246,229,242,243,229,100,
-    130,  2, 92, 85,183, 85,192,227,236,239,243,229,100,128,  2, 94,
-    232,239,239,107,128,  2, 93,112,  2, 85,205, 85,212,225,242,229,
-    110,128, 36,160,243,233,236,239,110,129,  3,181, 85,222,244,239,
-    238,239,115,128,  3,173,241,117,  2, 85,237, 86, 25,225,108,130,
-      0, 61, 85,246, 86,  2,237,239,238,239,243,240,225,227,101,128,
-    255, 29,115,  2, 86,  8, 86, 15,237,225,236,108,128,254,102,245,
-    240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227,
-    101,128, 34, 97,114,  3, 86, 44, 86, 55, 86, 66,226,239,240,239,
-    237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128,
-      4, 64,229,246,229,242,243,229,100,129,  2, 88, 86, 78,227,249,
-    242,233,236,236,233, 99,128,  4, 77,115,  6, 86,103, 86,114, 86,
-    134, 86,215, 87,  4, 87, 14,227,249,242,233,236,236,233, 99,128,
-      4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236,
-    236,233, 99,128,  4,171,104,132,  2,131, 86,146, 86,153, 86,184,
-     86,199,227,245,242,108,128,  2,134,239,242,116,  2, 86,161, 86,
-    168,228,229,246, 97,128,  9, 14,246,239,247,229,236,243,233,231,
-    238,228,229,246, 97,128,  9, 70,242,229,246,229,242,243,229,228,
-    236,239,239,112,128,  1,170,243,241,245,225,244,242,229,246,229,
-    242,243,229,100,128,  2,133,237,225,236,108,  2, 86,224, 86,235,
-    232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235,
-    225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244,
-    104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240,
-    229,242,233,239,114,128,246,236,116,  5, 87, 36, 87, 62, 87, 66,
-     87, 83, 87,149, 97,130,  3,183, 87, 44, 87, 54,242,237,229,238,
-    233,225,110,128,  5,104,244,239,238,239,115,128,  3,174,104,128,
-      0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119,
-    128, 30, 27,238,225,232,244, 97,  3, 87, 95, 87,127, 87,136,230,
-    239,245,235,104,  2, 87,105, 87,114,232,229,226,242,229,119,128,
-      5,145,236,229,230,244,232,229,226,242,229,119,128,  5,145,232,
-    229,226,242,229,119,128,  5,145,236,229,230,244,232,229,226,242,
-    229,119,128,  5,145,245,242,238,229,100,128,  1,221,117,  2, 87,
-    163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32,
-    172,246,239,247,229,236,243,233,231,110,  3, 87,193, 87,203, 87,
-    210,226,229,238,231,225,236,105,128,  9,199,228,229,246, 97,128,
-      9, 71,231,245,234,225,242,225,244,105,128, 10,199,120,  2, 87,
-    227, 88, 44,227,236,225,109,132,  0, 33, 87,242, 87,253, 88, 24,
-     88, 36,225,242,237,229,238,233,225,110,128,  5, 92,100,  2, 88,
-      3, 88,  8,226,108,128, 32, 60,239,247,110,129,  0,161, 88, 16,
-    243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227,
-    101,128,255,  1,243,237,225,236,108,128,247, 33,233,243,244,229,
-    238,244,233,225,108,128, 34,  3,250,104,131,  2,146, 88, 67, 88,
-     86, 88, 97, 99,  2, 88, 73, 88, 80,225,242,239,110,128,  1,239,
-    245,242,108,128,  2,147,242,229,246,229,242,243,229,100,128,  1,
-    185,244,225,233,108,128,  1,186,102,140,  0,102, 88,132, 88,214,
-     88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156,
-     93, 33, 93, 41, 97,  4, 88,142, 88,149, 88,160, 88,171,228,229,
-    246, 97,128,  9, 94,231,245,242,237,245,235,232,105,128, 10, 94,
-    232,242,229,238,232,229,233,116,128, 33,  9,244,232, 97,  3, 88,
-    181, 88,190, 88,202,225,242,225,226,233, 99,128,  6, 78,236,239,
-    247,225,242,225,226,233, 99,128,  6, 78,244,225,238,225,242,225,
-    226,233, 99,128,  6, 75,226,239,240,239,237,239,230,111,128, 49,
-      8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227,
-    229,238,116,128, 30, 31,101,  3, 88,254, 89, 76, 89, 86,104,  4,
-     89,  8, 89, 31, 89, 45, 89, 61,225,114,  2, 89, 15, 89, 22,225,
-    226,233, 99,128,  6, 65,237,229,238,233,225,110,128,  5,134,230,
-    233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233,
-    244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228,
-    233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240,
-    244,233, 99,128,  3,229,237,225,236,101,128, 38, 64,102,130,251,
-      0, 89,101, 89,105,105,128,251,  3,108,128,251,  4,105,136,251,
-      1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90,
-    106,230,244,229,229,110,  2, 89,139, 89,148,227,233,242,227,236,
-    101,128, 36,110,112,  2, 89,154, 89,161,225,242,229,110,128, 36,
-    130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243,
-    104,128, 32, 18,236,236,229,100,  2, 89,189, 89,195,226,239,120,
-    128, 37,160,242,229,227,116,128, 37,172,238,225,108,  5, 89,216,
-     89,255, 90, 16, 90, 33, 90, 49,235,225,102,130,  5,218, 89,226,
-     89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226,
-    242,229,119,128,251, 58,232,229,226,242,229,119,128,  5,218,237,
-    229,109,129,  5,221, 90,  7,232,229,226,242,229,119,128,  5,221,
-    238,245,110,129,  5,223, 90, 24,232,229,226,242,229,119,128,  5,
-    223,240,101,129,  5,227, 90, 40,232,229,226,242,229,119,128,  5,
-    227,244,243,225,228,105,129,  5,229, 90, 59,232,229,226,242,229,
-    119,128,  5,229,242,243,244,244,239,238,229,227,232,233,238,229,
-    243,101,128,  2,201,243,232,229,249,101,128, 37,201,244,225,227,
-    249,242,233,236,236,233, 99,128,  4,115,246,101,142,  0, 53, 90,
-    139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91,  1, 91,
-     35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233,
-     99,128,  6,101,226,229,238,231,225,236,105,128,  9,235,227,233,
-    242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229,
-    243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97,
-    128,  9,107,229,233,231,232,244,232,115,128, 33, 93,231,117,  2,
-     90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245,
-    235,232,105,128, 10,107,232, 97,  2, 90,237, 90,248,227,235,225,
-    242,225,226,233, 99,128,  6,101,238,231,250,232,239,117,128, 48,
-     37,105,  2, 91,  7, 91, 25,228,229,239,231,242,225,240,232,233,
-    227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114,
-    128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239,
-    236,228,243,244,249,236,101,128,247, 53,112,  2, 91, 64, 91, 71,
-    225,242,229,110,128, 36,120,229,114,  2, 91, 78, 91, 84,233,239,
-    100,128, 36,140,243,233,225,110,128,  6,245,242,239,237,225,110,
-    128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232,
-    225,105,128, 14, 85,108,129,251,  2, 91,123,239,242,233,110,128,
-      1,146,109,  2, 91,136, 91,147,239,238,239,243,240,225,227,101,
-    128,255, 70,243,241,245,225,242,101,128, 51,153,111,  4, 91,166,
-     91,188, 91,200, 91,207,230, 97,  2, 91,173, 91,181,238,244,232,
-    225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225,
-    238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34,  0,245,
-    114,142,  0, 52, 91,240, 91,249, 92,  3, 92, 33, 92, 40, 92, 65,
-     92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220,
-    225,242,225,226,233, 99,128,  6,100,226,229,238,231,225,236,105,
-    128,  9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238,
-    246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39,
-    141,228,229,246, 97,128,  9,106,231,117,  2, 92, 47, 92, 56,234,
-    225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10,
-    106,232, 97,  2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99,
-    128,  6,100,238,231,250,232,239,117,128, 48, 36,105,  2, 92, 98,
-     92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
-    110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239,
-    238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225,
-    244,239,242,226,229,238,231,225,236,105,128,  9,247,239,236,228,
-    243,244,249,236,101,128,247, 52,112,  2, 92,174, 92,181,225,242,
-    229,110,128, 36,119,229,114,  2, 92,188, 92,194,233,239,100,128,
-     36,139,243,233,225,110,128,  6,244,242,239,237,225,110,128, 33,
-    115,243,245,240,229,242,233,239,114,128, 32,116,116,  2, 92,226,
-     93,  8,229,229,110,  2, 92,234, 92,243,227,233,242,227,236,101,
-    128, 36,109,112,  2, 92,249, 93,  0,225,242,229,110,128, 36,129,
-    229,242,233,239,100,128, 36,149,104,  2, 93, 14, 93, 19,225,105,
-    128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128,  2,
-    203,240,225,242,229,110,128, 36,161,242, 97,  2, 93, 48, 93, 56,
-    227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144,  0,
-    103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96,
-    143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98,
-    158, 97,  9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93,
-    241, 93,252, 94, 30,226,229,238,231,225,236,105,128,  9,151,227,
-    245,244,101,128,  1,245,228,229,246, 97,128,  9, 23,102,  4, 93,
-    151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128,  6,175,
-    230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229,
-    228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117,  2,
-     93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245,
-    235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48,
-     76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130,
-      3,179, 94,  6, 94, 19,236,225,244,233,238,243,237,225,236,108,
-    128,  2, 99,243,245,240,229,242,233,239,114,128,  2,224,238,231,
-    233,225,227,239,240,244,233, 99,128,  3,235, 98,  2, 94, 49, 94,
-     59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128,
-      1, 31, 99,  4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110,
-    128,  1,231,229,228,233,236,236, 97,128,  1, 35,233,242, 99,  2,
-     94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128,
-      1, 29,239,237,237,225,225,227,227,229,238,116,128,  1, 35,228,
-    239,116,129,  1, 33, 94,135,225,227,227,229,238,116,128,  1, 33,
-    101,  6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249,
-    242,233,236,236,233, 99,128,  4, 51,232,233,242,225,231,225,238,
-     97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239,
-    237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128,
-     34, 81,114,  3, 94,218, 95, 11, 95, 21,229,243,104,  3, 94,228,
-     94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119,
-    128,  5,156,232,229,226,242,229,119,128,  5,243,237,245,241,228,
-    225,237,232,229,226,242,229,119,128,  5,157,237,225,238,228,226,
-    236,115,128,  0,223,243,232,225,249,233,109,  2, 95, 32, 95, 47,
-    225,227,227,229,238,244,232,229,226,242,229,119,128,  5,158,232,
-    229,226,242,229,119,128,  5,244,244,225,237,225,242,107,128, 48,
-     19,104,  5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97,  4, 95,
-     87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128,  9,
-    152,100,  2, 95,103, 95,114,225,242,237,229,238,233,225,110,128,
-      5,114,229,246, 97,128,  9, 24,231,117,  2, 95,127, 95,136,234,
-    225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10,
-     24,233,110,  4, 95,156, 95,165, 95,179, 95,195,225,242,225,226,
-    233, 99,128,  6, 58,230,233,238,225,236,225,242,225,226,233, 99,
-    128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99,
-    128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128,
-    254,208,101,  3, 95,218, 95,239, 96,  0,237,233,228,228,236,229,
-    232,239,239,235,227,249,242,233,236,236,233, 99,128,  4,149,243,
-    244,242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,147,
-    245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128,  4,
-    145,232, 97,  2, 96, 24, 96, 31,228,229,246, 97,128,  9, 90,231,
-    245,242,237,245,235,232,105,128, 10, 90,239,239,107,128,  2, 96,
-    250,243,241,245,225,242,101,128, 51,147,105,  3, 96, 66, 96, 77,
-     96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244,
-    225,235,225,238, 97,128, 48,174,109,  2, 96, 94, 96,105,225,242,
-    237,229,238,233,225,110,128,  5, 99,229,108,130,  5,210, 96,114,
-     96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226,
-    242,229,119,128,251, 50,232,229,226,242,229,119,128,  5,210,234,
-    229,227,249,242,233,236,236,233, 99,128,  4, 83,236,239,244,244,
-    225,108,  2, 96,167, 96,184,233,238,246,229,242,244,229,228,243,
-    244,242,239,235,101,128,  1,190,243,244,239,112,132,  2,148, 96,
-    199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128,
-      2,150,237,239,100,128,  2,192,242,229,246,229,242,243,229,100,
-    130,  2,149, 96,231, 96,237,237,239,100,128,  2,193,243,245,240,
-    229,242,233,239,114,128,  2,228,243,244,242,239,235,101,129,  2,
-    161, 97,  3,242,229,246,229,242,243,229,100,128,  2,162,109,  2,
-     97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243,
-    240,225,227,101,128,255, 71,111,  2, 97, 45, 97, 56,232,233,242,
-    225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97,
-    128, 48,180,240, 97,  2, 97, 74, 97, 80,242,229,110,128, 36,162,
-    243,241,245,225,242,101,128, 51,172,114,  2, 97, 95, 97,192, 97,
-      2, 97,101, 97,109,228,233,229,238,116,128, 34,  7,246,101,134,
-      0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229,
-    236,239,247,227,237, 98,128,  3, 22, 99,  2, 97,143, 97,148,237,
-     98,128,  3,  0,239,237, 98,128,  3,  0,228,229,246, 97,128,  9,
-     83,236,239,247,237,239,100,128,  2,206,237,239,238,239,243,240,
-    225,227,101,128,255, 64,244,239,238,229,227,237, 98,128,  3, 64,
-    229,225,244,229,114,132,  0, 62, 97,208, 97,227, 97,239, 98, 26,
-    229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115,
-    128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111,
-      2, 97,245, 98, 15,114,  2, 97,251, 98,  8,229,241,245,233,246,
-    225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246,
-    229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128,
-    254,101,115,  2, 98, 40, 98, 48,227,242,233,240,116,128,  2, 97,
-    244,242,239,235,101,128,  1,229,117,  4, 98, 66, 98, 77, 98,134,
-     98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108,  2,
-     98, 84, 98,109,236,229,237,239,116,  2, 98, 94, 98,101,236,229,
-    230,116,128,  0,171,242,233,231,232,116,128,  0,187,243,233,238,
-    231,108,  2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233,
-    231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48,
-    176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243,
-    241,245,225,242,101,128, 51,201,104,144,  0,104, 98,204,101, 90,
-    101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99,
-    105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232,
-     99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210,
-     99,239, 99,252,100, 54,100, 63, 97,  2, 98,238, 99,  1,226,235,
-    232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128,  4,
-    169,236,244,239,238,229,225,242,225,226,233, 99,128,  6,193,226,
-    229,238,231,225,236,105,128,  9,185,228,101,  2, 99, 32, 99, 50,
-    243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128,
-      4,179,246, 97,128,  9, 57,231,117,  2, 99, 62, 99, 71,234,225,
-    242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57,
-    104,  4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99,
-    128,  6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254,
-    162,105,  2, 99,119, 99,134,238,233,244,233,225,236,225,242,225,
-    226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237,
-    229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244,
-    245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225,
-    238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104,
-    128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128,
-     10, 77,237,250, 97,  2, 99,218, 99,227,225,242,225,226,233, 99,
-    128,  6, 33,236,239,247,225,242,225,226,233, 99,128,  6, 33,238,
-    231,245,236,230,233,236,236,229,114,128, 49,100,114,  2,100,  2,
-    100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128,
-      4, 74,240,239,239,110,  2,100, 27,100, 40,236,229,230,244,226,
-    225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242,
-    226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244,
-    225,102,  3,100, 73,100,165,101,  0,240,225,244,225,104,134,  5,
-    178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128,
-      5,178, 50,  2,100,104,100,108, 51,128,  5,178,102,128,  5,178,
-    232,229,226,242,229,119,128,  5,178,238,225,242,242,239,247,232,
-    229,226,242,229,119,128,  5,178,241,245,225,242,244,229,242,232,
-    229,226,242,229,119,128,  5,178,247,233,228,229,232,229,226,242,
-    229,119,128,  5,178,241,225,237,225,244,115,135,  5,179,100,188,
-    100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128,  5,
-    179,178, 56,128,  5,179,179, 52,128,  5,179,232,229,226,242,229,
-    119,128,  5,179,238,225,242,242,239,247,232,229,226,242,229,119,
-    128,  5,179,241,245,225,242,244,229,242,232,229,226,242,229,119,
-    128,  5,179,247,233,228,229,232,229,226,242,229,119,128,  5,179,
-    243,229,231,239,108,135,  5,177,101, 22,101, 27,101, 32,101, 37,
-    101, 46,101, 61,101, 77,177, 55,128,  5,177,178, 52,128,  5,177,
-    179, 48,128,  5,177,232,229,226,242,229,119,128,  5,177,238,225,
-    242,242,239,247,232,229,226,242,229,119,128,  5,177,241,245,225,
-    242,244,229,242,232,229,226,242,229,119,128,  5,177,247,233,228,
-    229,232,229,226,242,229,119,128,  5,177, 98,  3,101, 98,101,103,
-    101,113,225,114,128,  1, 39,239,240,239,237,239,230,111,128, 49,
-     15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99,  2,101,
-    131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99,  2,
-    101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128,
-      1, 37,100,  2,101,168,101,178,233,229,242,229,243,233,115,128,
-     30, 39,239,116,  2,101,185,101,194,225,227,227,229,238,116,128,
-     30, 35,226,229,236,239,119,128, 30, 37,101,136,  5,212,101,222,
-    101,255,102, 19,102,248,103,  8,103, 53,103, 62,103, 75,225,242,
-    116,129, 38,101,101,230,243,245,233,116,  2,101,239,101,247,226,
-    236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228,
-    225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119,
-    128,251, 52,104,  6,102, 33,102, 61,102, 69,102,119,102,165,102,
-    214, 97,  2,102, 39,102, 53,236,244,239,238,229,225,242,225,226,
-    233, 99,128,  6,193,242,225,226,233, 99,128,  6, 71,229,226,242,
-    229,119,128,  5,212,230,233,238,225,236, 97,  2,102, 80,102,111,
-    236,116,  2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99,
-    128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242,
-    225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246,
-    101,  2,102,134,102,148,230,233,238,225,236,225,242,225,226,233,
-     99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226,
-    233, 99,128,251,164,105,  2,102,171,102,205,238,233,244,233,225,
-    236, 97,  2,102,183,102,197,236,244,239,238,229,225,242,225,226,
-    233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231,
-    225,238, 97,128, 48,120,237,229,228,233,225,236, 97,  2,102,226,
-    102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169,
-    242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243,
-    241,245,225,242,101,128, 51,123,107,  2,103, 14,103, 38,225,244,
-    225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233,
-    228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225,
-    242,101,128, 51, 54,238,231,232,239,239,107,128,  2,103,242,245,
-    244,245,243,241,245,225,242,101,128, 51, 57,116,129,  5,215,103,
-     81,232,229,226,242,229,119,128,  5,215,232,239,239,107,129,  2,
-    102,103, 99,243,245,240,229,242,233,239,114,128,  2,177,105,  4,
-    103,120,103,205,103,216,103,241,229,245,104,  4,103,132,103,167,
-    103,182,103,191, 97,  2,103,138,103,153,227,233,242,227,236,229,
-    235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239,
-    242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242,
-    229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240,
-    225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242,
-    225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97,
-    129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255,
-    139,242,233,113,134,  5,180,104,  3,104,  8,104, 22,104, 31,104,
-     46,104, 62,177, 52,128,  5,180, 50,  2,104, 14,104, 18, 49,128,
-      5,180,100,128,  5,180,232,229,226,242,229,119,128,  5,180,238,
-    225,242,242,239,247,232,229,226,242,229,119,128,  5,180,241,245,
-    225,242,244,229,242,232,229,226,242,229,119,128,  5,180,247,233,
-    228,229,232,229,226,242,229,119,128,  5,180,236,233,238,229,226,
-    229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101,
-    128,255, 72,111,  9,104,119,104,130,104,154,104,179,105, 11,105,
-     24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128,
-      5,112,232,105,  2,104,137,104,145,240,244,232,225,105,128, 14,
-     43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225,
-    238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104,
-    128,255,142,236,225,109,135,  5,185,104,199,104,204,104,209,104,
-    214,104,223,104,238,104,254,177, 57,128,  5,185,178, 54,128,  5,
-    185,179, 50,128,  5,185,232,229,226,242,229,119,128,  5,185,238,
-    225,242,242,239,247,232,229,226,242,229,119,128,  5,185,241,245,
-    225,242,244,229,242,232,229,226,242,229,119,128,  5,185,247,233,
-    228,229,232,229,226,242,229,119,128,  5,185,238,239,235,232,245,
-    235,244,232,225,105,128, 14, 46,111,  2,105, 30,105,100,107,  4,
-    105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237,
-     98,128,  3,  9,227,237, 98,128,  3,  9,240,225,236,225,244,225,
-    236,233,250,229,228,226,229,236,239,247,227,237, 98,128,  3, 33,
-    242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237,
-     98,128,  3, 34,238,243,241,245,225,242,101,128, 51, 66,114,  2,
-    105,116,105,143,105,  2,105,122,105,131,227,239,240,244,233, 99,
-    128,  3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238,
-    227,237, 98,128,  3, 27,244,243,240,242,233,238,231,115,128, 38,
-    104,245,243,101,128, 35,  2,240,225,242,229,110,128, 36,163,243,
-    245,240,229,242,233,239,114,128,  2,176,244,245,242,238,229,100,
-    128,  2,101,117,  4,105,205,105,216,105,229,105,254,232,233,242,
-    225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225,
-    242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213,
-    105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231,
-    225,242,245,237,236,225,245,116,129,  2,221,106, 13,227,237, 98,
-    128,  3, 11,118,128,  1,149,249,240,232,229,110,132,  0, 45,106,
-     39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128,
-    246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115,  2,
-    106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233,
-    239,114,128,246,230,244,247,111,128, 32, 16,105,149,  0,105,106,
-    137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111,
-    213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113,
-    110,113,197,113,254,114, 26,114, 70,225, 99,  2,106,144,106,150,
-    245,244,101,128,  0,237,249,242,233,236,236,233, 99,128,  4, 79,
-     98,  3,106,168,106,177,106,187,229,238,231,225,236,105,128,  9,
-    135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128,
-      1, 45, 99,  3,106,202,106,209,106,231,225,242,239,110,128,  1,
-    208,233,242, 99,  2,106,217,106,222,236,101,128, 36,216,245,237,
-    230,236,229,120,128,  0,238,249,242,233,236,236,233, 99,128,  4,
-     86,100,  4,106,251,107,  5,110, 80,110,113,226,236,231,242,225,
-    246,101,128,  2,  9,101,  2,107, 11,110, 75,239,231,242,225,240,
-    104,  7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44,
-    229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233,
-    242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90,
-    107,106,107,205,108,  3,108, 69,108, 98,108,114,108,171,108,220,
-    108,232,109,  3,109, 70,109,208,109,237,225,236,236,233,225,238,
-    227,229,240,225,242,229,110,128, 50, 63, 99,  4,107,116,107,127,
-    107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229,
-    238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243,
-    101,128, 48,  6,111,  3,107,156,107,171,107,191,237,237, 97,129,
-     48,  1,107,164,236,229,230,116,128,255,100,238,231,242,225,244,
-    245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242,
-    242,229,227,244,227,233,242,227,236,101,128, 50,163,101,  3,107,
-    213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50,
-     47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128,
-     50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101,
-    128, 50,157,102,  2,108,  9,108, 24,229,243,244,233,246,225,236,
-    240,225,242,229,110,128, 50, 64,105,  2,108, 30,108, 59,238,225,
-    238,227,233,225,108,  2,108, 42,108, 51,227,233,242,227,236,101,
-    128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242,
-    229,110,128, 50, 43,104,  2,108, 75,108, 86,225,246,229,240,225,
-    242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128,
-     50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128,
-     48,  5,108,  3,108,122,108,148,108,160,225,226,239,114,  2,108,
-    131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229,
-    110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167,
-    239,247,227,233,242,227,236,101,128, 50,166,109,  2,108,177,108,
-    209,101,  2,108,183,108,198,228,233,227,233,238,229,227,233,242,
-    227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50,
-     46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229,
-    240,225,242,229,110,128, 50, 52,112,  2,108,238,108,246,229,242,
-    233,239,100,128, 48,  2,242,233,238,244,227,233,242,227,236,101,
-    128, 50,158,114,  2,109,  9,109, 57,101,  3,109, 17,109, 28,109,
-     43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243,
-    229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227,
-    229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242,
-    227,236,101,128, 50,168,115,  5,109, 82,109,111,109,125,109,150,
-    109,178,101,  2,109, 88,109,101,227,242,229,244,227,233,242,227,
-    236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239,
-    227,233,229,244,249,240,225,242,229,110,128, 50, 51,112,  2,109,
-    131,109,137,225,227,101,128, 48,  0,229,227,233,225,236,240,225,
-    242,229,110,128, 50, 53,116,  2,109,156,109,167,239,227,235,240,
-    225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128,
-     50, 59,117,  2,109,184,109,193,238,240,225,242,229,110,128, 50,
-     48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60,
-    119,  2,109,214,109,226,225,244,229,242,240,225,242,229,110,128,
-     50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242,
-    111,128, 48,  7,109,  2,109,250,110,  7,229,244,225,236,227,233,
-    242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101,
-    128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148,
-    243,245,238,227,233,242,227,236,101,128, 50,144,119,  2,110, 50,
-    110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239,
-    239,228,227,233,242,227,236,101,128, 50,141,246, 97,128,  9,  7,
-    233,229,242,229,243,233,115,130,  0,239,110, 94,110,102,225,227,
-    245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128,  4,
-    229,239,244,226,229,236,239,119,128, 30,203,101,  3,110,131,110,
-    147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99,
-    128,  4,215,227,249,242,233,236,236,233, 99,128,  4, 53,245,238,
-    103,  4,110,170,110,205,110,220,110,229, 97,  2,110,176,110,191,
-    227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240,
-    225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242,
-    227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229,
-    225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110,
-    128, 50,  7,103,  2,110,249,111,  0,242,225,246,101,128,  0,236,
-    117,  2,111,  6,111, 15,234,225,242,225,244,105,128, 10,135,242,
-    237,245,235,232,105,128, 10,  7,104,  2,111, 30,111, 40,233,242,
-    225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101,
-    128, 30,201,105,  8,111, 69,111, 79,111, 90,111, 97,111,122,111,
-    138,111,153,111,169,226,229,238,231,225,236,105,128,  9,136,227,
-    249,242,233,236,236,233, 99,128,  4, 56,228,229,246, 97,128,  9,
-      8,231,117,  2,111,104,111,113,234,225,242,225,244,105,128, 10,
-    136,242,237,245,235,232,105,128, 10,  8,237,225,244,242,225,231,
-    245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229,
-    228,226,242,229,246,101,128,  2, 11,243,232,239,242,244,227,249,
-    242,233,236,236,233, 99,128,  4, 57,246,239,247,229,236,243,233,
-    231,110,  3,111,185,111,195,111,202,226,229,238,231,225,236,105,
-    128,  9,192,228,229,246, 97,128,  9, 64,231,245,234,225,242,225,
-    244,105,128, 10,192,106,128,  1, 51,107,  2,111,223,111,247,225,
-    244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247,
-    233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108,
-      2,112,  5,112, 10,228,101,128,  2,220,245,249,232,229,226,242,
-    229,119,128,  5,172,109,  2,112, 27,112, 94, 97,  3,112, 35,112,
-     55,112, 80,227,242,239,110,129,  1, 43,112, 44,227,249,242,233,
-    236,236,233, 99,128,  4,227,231,229,239,242,225,240,240,242,239,
-    248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83,
-    244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238,
-    239,243,240,225,227,101,128,255, 73,110,  5,112,117,112,127,112,
-    136,112,148,112,232,227,242,229,237,229,238,116,128, 34,  6,230,
-    233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225,
-    110,128,  5,107,116,  2,112,154,112,222,101,  2,112,160,112,211,
-    231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98,  2,112,
-    179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229,
-    120,128,248,245,116,  2,112,202,112,207,239,112,128, 35, 32,112,
-    128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243,
-    241,245,225,242,101,128, 51,  5,118,  3,112,240,112,249,113,  2,
-    226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128,
-     37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111,  3,
-    113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128,  4,
-     81,231,239,238,229,107,128,  1, 47,244, 97,131,  3,185,113, 52,
-    113, 73,113, 81,228,233,229,242,229,243,233,115,129,  3,202,113,
-     65,244,239,238,239,115,128,  3,144,236,225,244,233,110,128,  2,
-    105,244,239,238,239,115,128,  3,175,240,225,242,229,110,128, 36,
-    164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115,  4,
-    113,120,113,165,113,179,113,187,237,225,236,108,  2,113,129,113,
-    140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225,
-    235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228,
-    244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105,
-    128,  9,250,244,242,239,235,101,128,  2,104,245,240,229,242,233,
-    239,114,128,246,237,116,  2,113,203,113,237,229,242,225,244,233,
-    239,110,  2,113,215,113,226,232,233,242,225,231,225,238, 97,128,
-     48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228,
-    101,129,  1, 41,113,246,226,229,236,239,119,128, 30, 45,117,  2,
-    114,  4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227,
-    249,242,233,236,236,233, 99,128,  4, 78,246,239,247,229,236,243,
-    233,231,110,  3,114, 42,114, 52,114, 59,226,229,238,231,225,236,
-    105,128,  9,191,228,229,246, 97,128,  9, 63,231,245,234,225,242,
-    225,244,105,128, 10,191,250,232,233,244,243, 97,  2,114, 81,114,
-     92,227,249,242,233,236,236,233, 99,128,  4,117,228,226,236,231,
-    242,225,246,229,227,249,242,233,236,236,233, 99,128,  4,119,106,
-    138,  0,106,114,135,114,198,114,209,115,  3,115, 19,115,132,115,
-    201,115,206,115,218,115,226, 97,  4,114,145,114,156,114,166,114,
-    173,225,242,237,229,238,233,225,110,128,  5,113,226,229,238,231,
-    225,236,105,128,  9,156,228,229,246, 97,128,  9, 28,231,117,  2,
-    114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245,
-    235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49,
-     16, 99,  3,114,217,114,224,114,246,225,242,239,110,128,  1,240,
-    233,242, 99,  2,114,232,114,237,236,101,128, 36,217,245,237,230,
-    236,229,120,128,  1, 53,242,239,243,243,229,228,244,225,233,108,
-    128,  2,157,228,239,244,236,229,243,243,243,244,242,239,235,101,
-    128,  2, 95,101,  3,115, 27,115, 38,115,103,227,249,242,233,236,
-    236,233, 99,128,  4, 88,229,109,  4,115, 49,115, 58,115, 72,115,
-     88,225,242,225,226,233, 99,128,  6, 44,230,233,238,225,236,225,
-    242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225,
-    242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242,
-    225,226,233, 99,128,254,160,104,  2,115,109,115,118,225,242,225,
-    226,233, 99,128,  6,152,230,233,238,225,236,225,242,225,226,233,
-     99,128,251,139,104,  2,115,138,115,188, 97,  3,115,146,115,156,
-    115,163,226,229,238,231,225,236,105,128,  9,157,228,229,246, 97,
-    128,  9, 29,231,117,  2,115,170,115,179,234,225,242,225,244,105,
-    128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242,
-    237,229,238,233,225,110,128,  5,123,233,115,128, 48,  4,237,239,
-    238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128,
-     36,165,243,245,240,229,242,233,239,114,128,  2,178,107,146,  0,
-    107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120,
-    150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122,
-    118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116,
-    245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98,
-      2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236,
-    236,233, 99,128,  4,161,229,238,231,225,236,105,128,  9,149, 99,
-      2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236,
-    233, 99,128,  4, 58,228,101,  2,116,108,116,126,243,227,229,238,
-    228,229,242,227,249,242,233,236,236,233, 99,128,  4,155,246, 97,
-    128,  9, 21,102,135,  5,219,116,149,116,158,116,178,116,192,116,
-    201,116,217,116,232,225,242,225,226,233, 99,128,  6, 67,228,225,
-    231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128,
-    251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218,
-    232,229,226,242,229,119,128,  5,219,233,238,233,244,233,225,236,
-    225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225,
-    242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242,
-    229,119,128,251, 77,231,117,  2,116,252,117,  5,234,225,242,225,
-    244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104,  2,
-    117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239,
-    235,227,249,242,233,236,236,233, 99,128,  4,196,235,225,244,225,
-    235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228,
-    244,104,128,255,118,112,  2,117, 75,117, 96,240, 97,129,  3,186,
-    117, 82,243,249,237,226,239,236,231,242,229,229,107,128,  3,240,
-    249,229,239,245,110,  3,117,108,117,122,117,156,237,233,229,245,
-    237,235,239,242,229,225,110,128, 49,113,112,  2,117,128,117,143,
-    232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233,
-    229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238,
-    231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242,
-    239,242,233,233,243,241,245,225,242,101,128, 51, 13,115,  5,117,
-    201,117,245,118,  4,118, 12,118, 40,232,233,228,225,225,245,244,
-    111,  2,117,214,117,223,225,242,225,226,233, 99,128,  6, 64,238,
-    239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226,
-    233, 99,128,  6, 64,237,225,236,236,235,225,244,225,235,225,238,
-     97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97,  2,118,
-     19,118, 28,225,242,225,226,233, 99,128,  6, 80,244,225,238,225,
-    242,225,226,233, 99,128,  6, 77,244,242,239,235,229,227,249,242,
-    233,236,236,233, 99,128,  4,159,244,225,232,233,242,225,240,242,
-    239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228,
-    244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242,
-    239,235,229,227,249,242,233,236,236,233, 99,128,  4,157,226,239,
-    240,239,237,239,230,111,128, 49, 14, 99,  4,118,131,118,153,118,
-    162,118,170, 97,  2,118,137,118,147,236,243,241,245,225,242,101,
-    128, 51,137,242,239,110,128,  1,233,229,228,233,236,236, 97,128,
-      1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227,
-    227,229,238,116,128,  1, 55,228,239,244,226,229,236,239,119,128,
-     30, 51,101,  4,118,204,118,231,119,  0,119, 12,104,  2,118,210,
-    118,221,225,242,237,229,238,233,225,110,128,  5,132,233,242,225,
-    231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129,
-     48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121,
-    238,225,242,237,229,238,233,225,110,128,  5,111,243,237,225,236,
-    236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229,
-    238,236,225,238,228,233, 99,128,  1, 56,104,  6,119, 56,119,185,
-    119,196,119,221,120, 52,120,140, 97,  5,119, 68,119, 78,119, 89,
-    119, 96,119,121,226,229,238,231,225,236,105,128,  9,150,227,249,
-    242,233,236,236,233, 99,128,  4, 69,228,229,246, 97,128,  9, 22,
-    231,117,  2,119,103,119,112,234,225,242,225,244,105,128, 10,150,
-    242,237,245,235,232,105,128, 10, 22,104,  4,119,131,119,140,119,
-    154,119,170,225,242,225,226,233, 99,128,  6, 46,230,233,238,225,
-    236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225,
-    236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236,
-    225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233,
-     99,128,  3,231,232, 97,  2,119,203,119,210,228,229,246, 97,128,
-      9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245,
-    235,104,  4,119,235,120, 14,120, 29,120, 38, 97,  2,119,241,120,
-      0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120,
-    240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233,
-    242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242,
-    229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225,
-    110,128, 50, 10,111,  4,120, 62,120,111,120,121,120,126,235,104,
-      4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128,
-     14,  2,239,238,244,232,225,105,128, 14,  5,245,225,244,244,232,
-    225,105,128, 14,  3,247,225,233,244,232,225,105,128, 14,  4,237,
-    245,244,244,232,225,105,128, 14, 91,239,107,128,  1,153,242,225,
-    235,232,225,238,231,244,232,225,105,128, 14,  6,250,243,241,245,
-    225,242,101,128, 51,145,105,  4,120,160,120,171,120,196,120,245,
-    232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235,
-    225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244,
-    104,128,255,119,242,111,  3,120,205,120,220,120,236,231,245,242,
-    225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244,
-    239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225,
-    242,101,128, 51, 20,249,229,239,107,  5,121,  4,121, 39,121, 54,
-    121, 63,121, 77, 97,  2,121, 10,121, 25,227,233,242,227,236,229,
-    235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239,
-    242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242,
-    229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240,
-    225,242,229,238,235,239,242,229,225,110,128, 50,  0,243,233,239,
-    243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233,
-    236,236,233, 99,128,  4, 92,108,  2,121,109,121,120,233,238,229,
-    226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51,
-    152,109,  3,121,137,121,151,121,162,227,245,226,229,228,243,241,
-    245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128,
-    255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128,
-     51,162,111,  5,121,190,121,216,121,254,122, 10,122, 24,104,  2,
-    121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243,
-    241,245,225,242,101,128, 51,192,235, 97,  2,121,223,121,231,233,
-    244,232,225,105,128, 14,  1,244,225,235,225,238, 97,129, 48,179,
-    121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240,
-    239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242,
-    233,236,236,233, 99,128,  4,129,114,  2,122, 30,122, 50,229,225,
-    238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128,
-     50,127,239,238,233,243,227,237, 98,128,  3, 67,240, 97,  2,122,
-     67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128,
-     51,170,243,233,227,249,242,233,236,236,233, 99,128,  4,111,116,
-      2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242,
-    238,229,100,128,  2,158,117,  2,122,124,122,135,232,233,242,225,
-    231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129,
-     48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120,
-    246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242,
-    101,128, 51,190,108,146,  0,108,122,220,124,247,125, 20,125, 86,
-    125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246,
-    127,125,127,133,127,166,127,175,127,183,127,245, 97,  7,122,236,
-    122,246,122,253,123,  4,123, 29,123, 45,124,235,226,229,238,231,
-    225,236,105,128,  9,178,227,245,244,101,128,  1, 58,228,229,246,
-     97,128,  9, 50,231,117,  2,123, 11,123, 20,234,225,242,225,244,
-    105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232,
-    225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123,
-     67,124,  6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124,
-    150,124,173, 97,  2,123, 73,123,254,236,229,102,  4,123, 85,123,
-     99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99,
-    128,254,252,232,225,237,250, 97,  2,123,109,123,150,225,226,239,
-    246,101,  2,123,119,123,133,230,233,238,225,236,225,242,225,226,
-    233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225,
-    226,233, 99,128,254,247,226,229,236,239,119,  2,123,160,123,174,
-    230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243,
-    239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233,
-    243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251,
-    237,225,228,228,225,225,226,239,246,101,  2,123,223,123,237,230,
-    233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239,
-    236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225,
-    226,233, 99,128,  6, 68,226,228, 97,129,  3,187,124, 14,243,244,
-    242,239,235,101,128,  1,155,229,100,130,  5,220,124, 32,124, 52,
-    228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229,
-    119,128,251, 60,232,229,226,242,229,119,128,  5,220,230,233,238,
-    225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229,
-    229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
-    252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225,
-    226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236,
-    225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101,  2,
-    124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254,
-    224,229,109,  2,124,200,124,219,232,225,232,233,238,233,244,233,
-    225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233,
-    225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233,
-    242,227,236,101,128, 37,239, 98,  3,124,255,125,  4,125, 10,225,
-    114,128,  1,154,229,236,116,128,  2,108,239,240,239,237,239,230,
-    111,128, 49, 12, 99,  4,125, 30,125, 37,125, 46,125, 73,225,242,
-    239,110,128,  1, 62,229,228,233,236,236, 97,128,  1, 60,233,242,
-     99,  2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229,
-    248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227,
-    229,238,116,128,  1, 60,228,239,116,130,  1, 64,125, 96,125,105,
-    225,227,227,229,238,116,128,  1, 64,226,229,236,239,119,129, 30,
-     55,125,115,237,225,227,242,239,110,128, 30, 57,101,  3,125,132,
-    125,170,126, 15,230,116,  2,125,139,125,155,225,238,231,236,229,
-    225,226,239,246,229,227,237, 98,128,  3, 26,244,225,227,235,226,
-    229,236,239,247,227,237, 98,128,  3, 24,243,115,132,  0, 60,125,
-    183,125,205,125,217,126,  7,229,241,245,225,108,129, 34,100,125,
-    193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238,
-    239,243,240,225,227,101,128,255, 28,111,  2,125,223,125,252,114,
-      2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128,
-     34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229,
-    241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250,
-    104,128,  2,110,230,226,236,239,227,107,128, 37,140,232,239,239,
-    235,242,229,244,242,239,230,236,229,120,128,  2,109,105,  2,126,
-     51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233,
-    225,110,128,  5,108,106,129,  1,201,126, 75,229,227,249,242,233,
-    236,236,233, 99,128,  4, 89,108,132,246,192,126, 99,126,123,126,
-    134,126,143, 97,  2,126,105,126,112,228,229,246, 97,128,  9, 51,
-    231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229,
-    236,239,119,128, 30, 59,236,225,228,229,246, 97,128,  9, 52,246,
-    239,227,225,236,233, 99,  3,126,157,126,167,126,174,226,229,238,
-    231,225,236,105,128,  9,225,228,229,246, 97,128,  9, 97,246,239,
-    247,229,236,243,233,231,110,  2,126,188,126,198,226,229,238,231,
-    225,236,105,128,  9,227,228,229,246, 97,128,  9, 99,109,  3,126,
-    213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128,
-      2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245,
-    225,242,101,128, 51,208,111,  6,127,  4,127, 16,127, 58,127, 69,
-    127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44,
-    231,233,227,225,108,  3,127, 28,127, 34,127, 53,225,238,100,128,
-     34, 39,238,239,116,129,  0,172,127, 42,242,229,246,229,242,243,
-    229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232,
-    225,105,128, 14, 37,238,231,115,128,  1,127,247,236,233,238,101,
-      2,127, 85,127,108, 99,  2,127, 91,127,103,229,238,244,229,242,
-    236,233,238,101,128,254, 78,237, 98,128,  3, 50,228,225,243,232,
-    229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242,
-    229,110,128, 36,167,115,  3,127,141,127,148,127,156,236,225,243,
-    104,128,  1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242,
-    233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245,
-    244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99,  3,127,
-    197,127,207,127,214,226,229,238,231,225,236,105,128,  9,140,228,
-    229,246, 97,128,  9, 12,246,239,247,229,236,243,233,231,110,  2,
-    127,228,127,238,226,229,238,231,225,236,105,128,  9,226,228,229,
-    246, 97,128,  9, 98,248,243,241,245,225,242,101,128, 51,211,109,
-    144,  0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132,
-     40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135,
-    108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128,
-    215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238,
-    231,225,236,105,128,  9,174, 99,  2,128, 77,128,129,242,239,110,
-    132,  0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247,
-    227,237, 98,128,  3, 49,227,237, 98,128,  3,  4,236,239,247,237,
-    239,100,128,  2,205,237,239,238,239,243,240,225,227,101,128,255,
-    227,245,244,101,128, 30, 63,228,229,246, 97,128,  9, 46,231,117,
-      2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237,
-    245,235,232,105,128, 10, 46,104,  2,128,173,128,205,225,240,225,
-    235,104,  2,128,183,128,192,232,229,226,242,229,119,128,  5,164,
-    236,229,230,244,232,229,226,242,229,119,128,  5,164,233,242,225,
-    231,225,238, 97,128, 48,126,105,  5,128,227,129, 40,129,103,129,
-    133,130, 39,227,232,225,244,244,225,247, 97,  3,128,242,129, 17,
-    129, 24,236,239,119,  2,128,250,129,  5,236,229,230,244,244,232,
-    225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248,
-    148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230,
-    244,244,232,225,105,128,248,147,229,107,  3,129, 49,129, 80,129,
-     87,236,239,119,  2,129, 57,129, 68,236,229,230,244,244,232,225,
-    105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139,
-    244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244,
-    244,232,225,105,128,248,138,232,225,238,225,235,225,116,  2,129,
-    115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232,
-    225,105,128, 14, 49,116,  3,129,141,129,169,129,232,225,233,235,
-    232,117,  2,129,151,129,162,236,229,230,244,244,232,225,105,128,
-    248,137,244,232,225,105,128, 14, 71,232,111,  3,129,178,129,209,
-    129,216,236,239,119,  2,129,186,129,197,236,229,230,244,244,232,
-    225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248,
-    142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230,
-    244,244,232,225,105,128,248,141,242,105,  3,129,241,130, 16,130,
-     23,236,239,119,  2,129,249,130,  4,236,229,230,244,244,232,225,
-    105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145,
-    244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244,
-    244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105,
-    128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64,
-    232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38,
-     66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241,
-    225,230,232,229,226,242,229,119,128,  5,190,242,115,128, 38, 66,
-    115,  2,130,118,130,136,239,242,225,227,233,242,227,236,229,232,
-    229,226,242,229,119,128,  5,175,241,245,225,242,101,128, 51,131,
-     98,  2,130,150,130,160,239,240,239,237,239,230,111,128, 49,  7,
-    243,241,245,225,242,101,128, 51,212, 99,  2,130,175,130,183,233,
-    242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242,
-    101,128, 51,165,228,239,116,  2,130,204,130,213,225,227,227,229,
-    238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101,  7,130,
-    237,131,108,131,119,131,134,131,159,131,196,131,208,101,  2,130,
-    243,131, 95,109,  4,130,253,131,  6,131, 20,131, 36,225,242,225,
-    226,233, 99,128,  6, 69,230,233,238,225,236,225,242,225,226,233,
-     99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233,
-     99,128,254,227,237,101,  2,131, 43,131, 56,228,233,225,236,225,
-    242,225,226,233, 99,128,254,228,229,237,105,  2,131, 64,131, 79,
-    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243,
-    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244,
-    239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225,
-    231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245,
-    225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48,
-    225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109,
-    130,  5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62,
-    131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229,
-    119,128,  5,222,238,225,242,237,229,238,233,225,110,128,  5,116,
-    242,235,232, 97,  3,131,219,131,228,132,  5,232,229,226,242,229,
-    119,128,  5,165,235,229,230,245,236, 97,  2,131,239,131,248,232,
-    229,226,242,229,119,128,  5,166,236,229,230,244,232,229,226,242,
-    229,119,128,  5,166,236,229,230,244,232,229,226,242,229,119,128,
-      5,165,104,  2,132, 24,132, 30,239,239,107,128,  2,113,250,243,
-    241,245,225,242,101,128, 51,146,105,  6,132, 54,132, 91,132,228,
-    132,239,133,  8,133, 65,228,100,  2,132, 61,132, 86,236,229,228,
-    239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233,
-    228,244,104,128,255,101,239,116,128,  0,183,229,245,109,  5,132,
-    105,132,140,132,155,132,164,132,215, 97,  2,132,111,132,126,227,
-    233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225,
-    242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227,
-    236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225,
-    110,128, 49, 65,112,  2,132,170,132,202, 97,  2,132,176,132,190,
-    238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229,
-    238,235,239,242,229,225,110,128, 50,  4,233,229,245,240,235,239,
-    242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225,
-    110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235,
-    225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230,
-    247,233,228,244,104,128,255,144,238,117,  2,133, 15,133, 60,115,
-    132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247,
-    227,237, 98,128,  3, 32,227,233,242,227,236,101,128, 34,150,237,
-    239,100,128,  2,215,240,236,245,115,128, 34, 19,244,101,128, 32,
-     50,242,105,  2,133, 72,133, 86,226,225,225,242,245,243,241,245,
-    225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108,
-      2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229,
-    100,128,  2,112,243,241,245,225,242,101,128, 51,150,109,  3,133,
-    133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101,
-    128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241,
-    245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111,  5,
-    133,186,133,212,133,237,133,247,134,  0,104,  2,133,192,133,202,
-    233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242,
-    101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133,
-    225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241,
-    245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33,
-    246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228,
-    243,241,245,225,242,101,128, 51,168,240, 97,  2,134, 32,134, 38,
-    242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115,
-      2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240,
-    229,242,233,239,114,128,246,239,244,245,242,238,229,100,128,  2,
-    111,117,141,  0,181,134,111,134,115,134,125,134,149,134,159,134,
-    181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49,
-    128,  0,181,225,243,241,245,225,242,101,128, 51,130,227,104,  2,
-    134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229,
-    243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103,
-      2,134,165,134,172,242,229,229,107,128,  3,188,243,241,245,225,
-    242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128,
-    235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236,
-    230,247,233,228,244,104,128,255,145,108,  2,134,223,134,232,243,
-    241,245,225,242,101,128, 51,149,244,233,240,236,121,128,  0,215,
-    237,243,241,245,225,242,101,128, 51,155,238,225,104,  2,135,  2,
-    135, 11,232,229,226,242,229,119,128,  5,163,236,229,230,244,232,
-    229,226,242,229,119,128,  5,163,115,  2,135, 30,135, 79,233, 99,
-      3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106,
-    135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110,
-    128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243,
-    241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128,
-     51,182,247,243,241,245,225,242,101,128, 51,188,118,  2,135,114,
-    135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243,
-    241,245,225,242,101,128, 51,183,119,  2,135,142,135,155,237,229,
-    231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242,
-    101,128, 51,189,110,150,  0,110,135,212,136, 90,136,114,136,180,
-    136,205,137,  7,137, 17,137, 84,137,127,139,161,139,179,139,204,
-    139,235,140,  5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61,
-    143, 71,143, 81, 97,  8,135,230,135,250,136,  1,136,  8,136, 33,
-    136, 44,136, 69,136, 81, 98,  2,135,236,135,245,229,238,231,225,
-    236,105,128,  9,168,236, 97,128, 34,  7,227,245,244,101,128,  1,
-     68,228,229,246, 97,128,  9, 40,231,117,  2,136, 15,136, 24,234,
-    225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10,
-     40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225,
-    235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228,
-    244,104,128,255,133,240,239,243,244,242,239,240,232,101,128,  1,
-     73,243,241,245,225,242,101,128, 51,129, 98,  2,136, 96,136,106,
-    239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128,
-      0,160, 99,  4,136,124,136,131,136,140,136,167,225,242,239,110,
-    128,  1, 72,229,228,233,236,236, 97,128,  1, 70,233,242, 99,  2,
-    136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226,
-    229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238,
-    116,128,  1, 70,228,239,116,  2,136,188,136,197,225,227,227,229,
-    238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101,  3,136,
-    213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109,
-    235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236,
-    230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236,
-    243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51,
-    139,103,  2,137, 23,137, 73, 97,  3,137, 31,137, 41,137, 48,226,
-    229,238,231,225,236,105,128,  9,153,228,229,246, 97,128,  9, 25,
-    231,117,  2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153,
-    242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225,
-    105,128, 14,  7,104,  2,137, 90,137,100,233,242,225,231,225,238,
-     97,128, 48,147,239,239,107,  2,137,108,137,115,236,229,230,116,
-    128,  2,114,242,229,244,242,239,230,236,229,120,128,  2,115,105,
-      4,137,137,138, 50,138, 61,138,119,229,245,110,  7,137,155,137,
-    190,137,222,137,236,137,245,138, 22,138, 35, 97,  2,137,161,137,
-    176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111,
-    240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105,
-      2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49,
-     53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233,
-    229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229,
-    225,110,128, 49, 52,240, 97,  2,137,252,138, 10,238,243,233,239,
-    243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242,
-    229,225,110,128, 50,  1,243,233,239,243,235,239,242,229,225,110,
-    128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128,
-     49,102,232,233,242,225,231,225,238, 97,128, 48,107,107,  2,138,
-     67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232,
-    225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116,
-      2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153,
-    244,232,225,105,128, 14, 77,238,101,141,  0, 57,138,150,138,159,
-    138,169,138,199,138,206,138,231,139,  2,139, 36,139, 48,139, 59,
-    139, 92,139,100,139,111,225,242,225,226,233, 99,128,  6,105,226,
-    229,238,231,225,236,105,128,  9,239,227,233,242,227,236,101,129,
-     36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243,
-    229,242,233,102,128, 39,146,228,229,246, 97,128,  9,111,231,117,
-      2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237,
-    245,235,232,105,128, 10,111,232, 97,  2,138,238,138,249,227,235,
-    225,242,225,226,233, 99,128,  6,105,238,231,250,232,239,117,128,
-     48, 41,105,  2,139,  8,139, 26,228,229,239,231,242,225,240,232,
-    233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239,
-    114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25,
-    239,236,228,243,244,249,236,101,128,247, 57,112,  2,139, 65,139,
-     72,225,242,229,110,128, 36,124,229,114,  2,139, 79,139, 85,233,
-    239,100,128, 36,144,243,233,225,110,128,  6,249,242,239,237,225,
-    110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116,
-      2,139,117,139,155,229,229,110,  2,139,125,139,134,227,233,242,
-    227,236,101,128, 36,114,112,  2,139,140,139,147,225,242,229,110,
-    128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14,
-     89,106,129,  1,204,139,167,229,227,249,242,233,236,236,233, 99,
-    128,  4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192,
-    232,225,236,230,247,233,228,244,104,128,255,157,108,  2,139,210,
-    139,224,229,231,242,233,231,232,244,236,239,238,103,128,  1,158,
-    233,238,229,226,229,236,239,119,128, 30, 73,109,  2,139,241,139,
-    252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225,
-    242,101,128, 51,154,110,  2,140, 11,140, 61, 97,  3,140, 19,140,
-     29,140, 36,226,229,238,231,225,236,105,128,  9,163,228,229,246,
-     97,128,  9, 35,231,117,  2,140, 43,140, 52,234,225,242,225,244,
-    105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228,
-    229,246, 97,128,  9, 41,111,  6,140, 84,140, 95,140,120,140,161,
-    141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235,
-    225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230,
-    247,233,228,244,104,128,255,137,110,  3,140,128,140,144,140,153,
-    226,242,229,225,235,233,238,231,243,240,225,227,101,128,  0,160,
-    229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14,
-     25,239,110,  7,140,178,140,187,140,201,140,235,140,251,141, 36,
-    141, 95,225,242,225,226,233, 99,128,  6, 70,230,233,238,225,236,
-    225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97,  2,
-    140,212,140,221,225,242,225,226,233, 99,128,  6,186,230,233,238,
-    225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233,
-    225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105,
-      2,141,  5,141, 20,238,233,244,233,225,236,225,242,225,226,233,
-     99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233,
-     99,128,252, 75,237,101,  2,141, 43,141, 56,228,233,225,236,225,
-    242,225,226,233, 99,128,254,232,229,237,105,  2,141, 64,141, 79,
-    238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243,
-    239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238,
-    239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252,
-    141,116,  7,141,129,141,140,141,169,141,204,141,216,141,236,142,
-      6,227,239,238,244,225,233,238,115,128, 34, 12,101,  2,141,146,
-    141,162,236,229,237,229,238,116,129, 34,  9,141,157,239,102,128,
-     34,  9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114,
-    129, 34,111,141,181,238,239,114,  2,141,189,141,197,229,241,245,
-    225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238,
-    244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141,
-    225,238,239,242,229,241,245,225,108,128, 34,112,112,  2,141,242,
-    141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229,
-    228,229,115,128, 34,128,243,117,  3,142, 15,142, 22,142, 31,226,
-    243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240,
-    229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225,
-    110,128,  5,118,240,225,242,229,110,128, 36,169,115,  2,142, 66,
-    142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233,
-    239,114,128, 32,127,244,233,236,228,101,128,  0,241,117,132,  3,
-    189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238,
-     97,128, 48,108,107,  2,142,122,142,146,225,244,225,235,225,238,
-     97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128,
-    255,135,244, 97,  3,142,155,142,165,142,172,226,229,238,231,225,
-    236,105,128,  9,188,228,229,246, 97,128,  9, 60,231,117,  2,142,
-    179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235,
-    232,105,128, 10, 60,109,  2,142,203,142,237,226,229,242,243,233,
-    231,110,130,  0, 35,142,217,142,229,237,239,238,239,243,240,225,
-    227,101,128,255,  3,243,237,225,236,108,128,254, 95,229,114,  2,
-    142,244,143, 20,225,236,243,233,231,110,  2,142,255,143,  7,231,
-    242,229,229,107,128,  3,116,236,239,247,229,242,231,242,229,229,
-    107,128,  3,117,111,128, 33, 22,110,130,  5,224,143, 32,143, 52,
-    228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229,
-    119,128,251, 64,232,229,226,242,229,119,128,  5,224,246,243,241,
-    245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51,
-    187,249, 97,  3,143, 90,143,100,143,107,226,229,238,231,225,236,
-    105,128,  9,158,228,229,246, 97,128,  9, 30,231,117,  2,143,114,
-    143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232,
-    105,128, 10, 30,111,147,  0,111,143,174,143,196,144, 18,144,188,
-    145,  4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174,
-    148,  8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97,  2,
-    143,180,143,187,227,245,244,101,128,  0,243,238,231,244,232,225,
-    105,128, 14, 45, 98,  4,143,206,143,248,144,  1,144, 11,225,242,
-    242,229,100,130,  2,117,143,218,143,229,227,249,242,233,236,236,
-    233, 99,128,  4,233,228,233,229,242,229,243,233,243,227,249,242,
-    233,236,236,233, 99,128,  4,235,229,238,231,225,236,105,128,  9,
-    147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128,
-      1, 79, 99,  3,144, 26,144, 99,144,178, 97,  2,144, 32,144, 93,
-    238,228,242, 97,  3,144, 43,144, 50,144, 61,228,229,246, 97,128,
-      9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247,
-    229,236,243,233,231,110,  2,144, 75,144, 82,228,229,246, 97,128,
-      9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110,
-    128,  1,210,233,242, 99,  2,144,107,144,112,236,101,128, 36,222,
-    245,237,230,236,229,120,133,  0,244,144,131,144,139,144,150,144,
-    158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229,
-    236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239,
-    239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128,
-     30,215,249,242,233,236,236,233, 99,128,  4, 62,100,  4,144,198,
-    144,221,144,227,144,250,226,108,  2,144,205,144,213,225,227,245,
-    244,101,128,  1, 81,231,242,225,246,101,128,  2, 13,229,246, 97,
-    128,  9, 19,233,229,242,229,243,233,115,129,  0,246,144,239,227,
-    249,242,233,236,236,233, 99,128,  4,231,239,244,226,229,236,239,
-    119,128, 30,205,101,129,  1, 83,145, 10,235,239,242,229,225,110,
-    128, 49, 90,103,  3,145, 27,145, 42,145, 49,239,238,229,107,129,
-      2,219,145, 36,227,237, 98,128,  3, 40,242,225,246,101,128,  0,
-    242,245,234,225,242,225,244,105,128, 10,147,104,  4,145, 69,145,
-     80,145, 90,145,168,225,242,237,229,238,233,225,110,128,  5,133,
-    233,242,225,231,225,238, 97,128, 48, 74,111,  2,145, 96,145,106,
-    239,235,225,226,239,246,101,128, 30,207,242,110,133,  1,161,145,
-    121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30,
-    219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246,
-    101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223,
-    244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236,
-    225,245,116,128,  1, 81,105,129,  1,163,145,188,238,246,229,242,
-    244,229,228,226,242,229,246,101,128,  2, 15,107,  2,145,209,145,
-    233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236,
-    230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49,
-     87,236,229,232,229,226,242,229,119,128,  5,171,109,  6,146, 10,
-    146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130,
-      1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242,
-    225,246,101,128, 30, 81,228,229,246, 97,128,  9, 80,229,231, 97,
-    133,  3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128,  3,
-    214,227,249,242,233,236,236,233, 99,128,  4, 97,236,225,244,233,
-    238,227,236,239,243,229,100,128,  2,119,242,239,245,238,228,227,
-    249,242,233,236,236,233, 99,128,  4,123,116,  2,146,112,146,127,
-    233,244,236,239,227,249,242,233,236,236,233, 99,128,  4,125,239,
-    238,239,115,128,  3,206,231,245,234,225,242,225,244,105,128, 10,
-    208,233,227,242,239,110,129,  3,191,146,155,244,239,238,239,115,
-    128,  3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101,
-    145,  0, 49,146,213,146,222,146,232,147,  6,147, 31,147, 40,147,
-     49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147,
-    227,147,235,147,246,225,242,225,226,233, 99,128,  6, 97,226,229,
-    238,231,225,236,105,128,  9,231,227,233,242,227,236,101,129, 36,
-     96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229,
-    242,233,102,128, 39,138,100,  2,147, 12,147, 18,229,246, 97,128,
-      9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229,
-    233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246,
-    220,231,117,  2,147, 56,147, 65,234,225,242,225,244,105,128, 10,
-    231,242,237,245,235,232,105,128, 10,103,232, 97,  3,147, 83,147,
-     94,147, 99,227,235,225,242,225,226,233, 99,128,  6, 97,236,102,
-    128,  0,189,238,231,250,232,239,117,128, 48, 33,105,  2,147,114,
-    147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229,
-    110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239,
-    238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225,
-    244,239,242,226,229,238,231,225,236,105,128,  9,244,239,236,228,
-    243,244,249,236,101,128,247, 49,112,  2,147,190,147,197,225,242,
-    229,110,128, 36,116,229,114,  2,147,204,147,210,233,239,100,128,
-     36,136,243,233,225,110,128,  6,241,241,245,225,242,244,229,114,
-    128,  0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242,
-    233,239,114,128,  0,185,244,104,  2,147,253,148,  2,225,105,128,
-     14, 81,233,242,100,128, 33, 83,111,  3,148, 16,148, 50,148, 66,
-    103,  2,148, 22,148, 40,239,238,229,107,129,  1,235,148, 31,237,
-    225,227,242,239,110,128,  1,237,245,242,237,245,235,232,105,128,
-     10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128,
-     10, 75,240,229,110,128,  2, 84,112,  3,148, 80,148, 87,148, 98,
-    225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128,
-     37,230,244,233,239,110,128, 35, 37,114,  2,148,111,148,140,100,
-      2,148,117,148,128,230,229,237,233,238,233,238,101,128,  0,170,
-    237,225,243,227,245,236,233,238,101,128,  0,186,244,232,239,231,
-    239,238,225,108,128, 34, 31,115,  5,148,163,148,195,148,212,149,
-      1,149, 14,232,239,242,116,  2,148,172,148,179,228,229,246, 97,
-    128,  9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97,
-    128,  9, 74,236,225,243,104,129,  0,248,148,204,225,227,245,244,
-    101,128,  1,255,237,225,236,108,  2,148,221,148,232,232,233,242,
-    225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97,
-    129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255,
-    107,244,242,239,235,229,225,227,245,244,101,128,  1,255,245,240,
-    229,242,233,239,114,128,246,240,116,  2,149, 30,149, 41,227,249,
-    242,233,236,236,233, 99,128,  4,127,233,236,228,101,130,  0,245,
-    149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242,
-    229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111,
-    128, 49, 33,118,  2,149, 89,149,170,229,114,  2,149, 96,149,162,
-    236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99,  2,149,
-    115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237,
-     98,128,  3,  5,100,  2,149,138,149,146,225,243,232,229,100,128,
-    254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128,
-    254, 75,243,227,239,242,101,128,  0,175,239,247,229,236,243,233,
-    231,110,  3,149,185,149,195,149,202,226,229,238,231,225,236,105,
-    128,  9,203,228,229,246, 97,128,  9, 75,231,245,234,225,242,225,
-    244,105,128, 10,203,112,145,  0,112,149,251,152,123,152,134,152,
-    143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157,
-     92,157,100,158,  2,158, 60,158, 88,158, 98, 97, 14,150, 25,150,
-     57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150,
-    212,150,226,151,238,152, 21,152,111, 97,  2,150, 31,150, 43,237,
-    240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239,
-    243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105,
-    128,  9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128,  9,
-     42,103,  2,150, 87,150,105,101,  2,150, 93,150,100,228,239,247,
-    110,128, 33,223,245,112,128, 33,222,117,  2,150,111,150,120,234,
-    225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10,
-     42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238,
-    238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225,
-    238, 97,128, 48,209,108,  2,150,171,150,196,225,244,225,236,233,
-    250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237,
-     98,128,  4,132,239,227,232,235,225,227,249,242,233,236,236,233,
-     99,128,  4,192,238,243,233,239,243,235,239,242,229,225,110,128,
-     49,127,114,  3,150,234,150,255,151,227, 97,  2,150,240,150,248,
-    231,242,225,240,104,128,  0,182,236,236,229,108,128, 34, 37,229,
-    110,  2,151,  6,151,116,236,229,230,116,136,  0, 40,151, 29,151,
-     44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244,
-    239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248,
-    237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32,
-    141,237,239,238,239,243,240,225,227,101,128,255,  8,115,  2,151,
-     83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239,
-    114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225,
-    108,128,254, 53,242,233,231,232,116,136,  0, 41,151,140,151,155,
-    151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239,
-    238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248,
-    229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142,
-    237,239,238,239,243,240,225,227,101,128,255,  9,115,  2,151,194,
-    151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114,
-    128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108,
-    128,254, 54,244,233,225,236,228,233,230,102,128, 34,  2,115,  3,
-    151,246,152,  1,152, 13,229,241,232,229,226,242,229,119,128,  5,
-    192,232,244,225,232,229,226,242,229,119,128,  5,153,241,245,225,
-    242,101,128, 51,169,244,225,104,134,  5,183,152, 39,152, 53,152,
-     58,152, 67,152, 82,152, 98, 49,  2,152, 45,152, 49, 49,128,  5,
-    183,100,128,  5,183,178, 97,128,  5,183,232,229,226,242,229,119,
-    128,  5,183,238,225,242,242,239,247,232,229,226,242,229,119,128,
-      5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
-      5,183,247,233,228,229,232,229,226,242,229,119,128,  5,183,250,
-    229,242,232,229,226,242,229,119,128,  5,161,226,239,240,239,237,
-    239,230,111,128, 49,  6,227,233,242,227,236,101,128, 36,223,228,
-    239,244,225,227,227,229,238,116,128, 30, 87,101,137,  5,228,152,
-    177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154,
-     73,227,249,242,233,236,236,233, 99,128,  4, 63,228,225,231,229,
-    243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68,
-    229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225,
-    236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67,
-    104,  5,152,252,153, 19,153, 27,153, 41,153, 71,225,114,  2,153,
-      3,153, 10,225,226,233, 99,128,  6,126,237,229,238,233,225,110,
-    128,  5,122,229,226,242,229,119,128,  5,228,230,233,238,225,236,
-    225,242,225,226,233, 99,128,251, 87,105,  2,153, 47,153, 62,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225,
-    231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225,
-    226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48,
-    218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236,
-    236,233, 99,128,  4,167,114,  5,153,130,153,142,153,184,154, 49,
-    154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229,
-    238,116,131,  0, 37,153,155,153,164,153,176,225,242,225,226,233,
-     99,128,  6,106,237,239,238,239,243,240,225,227,101,128,255,  5,
-    243,237,225,236,108,128,254,106,105,  2,153,190,154, 31,239,100,
-    134,  0, 46,153,207,153,218,153,229,153,241,153,252,154,  8,225,
-    242,237,229,238,233,225,110,128,  5,137,227,229,238,244,229,242,
-    229,100,128,  0,183,232,225,236,230,247,233,228,244,104,128,255,
-     97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239,
-    243,240,225,227,101,128,255, 14,115,  2,154, 14,154, 21,237,225,
-    236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243,
-    240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128,  3,
-     66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232,
-    239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167,
-    230,243,241,245,225,242,101,128, 51,138,104,  3,154, 98,154,148,
-    155, 29, 97,  3,154,106,154,116,154,123,226,229,238,231,225,236,
-    105,128,  9,171,228,229,246, 97,128,  9, 43,231,117,  2,154,130,
-    154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232,
-    105,128, 10, 43,105,133,  3,198,154,162,154,166,154,252,155,  4,
-    155, 15, 49,128,  3,213,229,245,240,104,  4,154,179,154,214,154,
-    229,154,238, 97,  2,154,185,154,200,227,233,242,227,236,229,235,
-    239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242,
-    229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229,
-    225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225,
-    242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233,
-    110,128,  2,120,238,244,232,245,244,232,225,105,128, 14, 58,243,
-    249,237,226,239,236,231,242,229,229,107,128,  3,213,111,  3,155,
-     37,155, 42,155, 68,239,107,128,  1,165,240,104,  2,155, 49,155,
-     58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225,
-    105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128,
-     14, 32,105,133,  3,192,155, 96,156, 52,156, 63,156, 74,156, 88,
-    229,245,112,  6,155,112,155,147,155,179,155,207,155,221,156, 17,
-     97,  2,155,118,155,133,227,233,242,227,236,229,235,239,242,229,
-    225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110,
-    128, 50, 19,227,105,  2,155,154,155,166,229,245,227,235,239,242,
-    229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110,
-    128, 50,101,107,  2,155,185,155,199,233,249,229,239,235,235,239,
-    242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240,
-    225,242,229,238,235,239,242,229,225,110,128, 50,  5,243,233,239,
-    115,  2,155,230,156,  2,107,  2,155,236,155,250,233,249,229,239,
-    235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128,
-     49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49,
-    117,116,  2,156, 23,156, 38,232,233,229,245,244,232,235,239,242,
-    229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225,
-    110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235,
-    225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236,
-    231,242,229,229,107,128,  3,214,247,242,225,242,237,229,238,233,
-    225,110,128,  5,131,236,245,115,132,  0, 43,156,115,156,126,156,
-    135,156,168,226,229,236,239,247,227,237, 98,128,  3, 31,227,233,
-    242,227,236,101,128, 34,149,109,  2,156,141,156,148,233,238,245,
-    115,128,  0,177,111,  2,156,154,156,158,100,128,  2,214,238,239,
-    243,240,225,227,101,128,255, 11,115,  2,156,174,156,181,237,225,
-    236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109,
-      2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80,
-    243,241,245,225,242,101,128, 51,216,111,  5,156,229,156,240,157,
-     51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125,
-    233,238,244,233,238,231,233,238,228,229,120,  4,157,  4,157, 16,
-    157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31,
-    236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232,
-    244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101,
-    128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236,
-    225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107,
-    129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229,
-    110,128, 36,171,114,  3,157,108,157,134,157,159,101,  2,157,114,
-    157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244,
-    233,239,110,128, 33, 30,233,237,101,  2,157,142,157,148,237,239,
-    100,128,  2,185,242,229,246,229,242,243,229,100,128, 32, 53,111,
-      4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15,
-    234,229,227,244,233,246,101,128, 35,  5,236,239,238,231,229,228,
-    235,225,238, 97,128, 48,252,112,  2,157,205,157,242,101,  2,157,
-    211,157,218,236,236,239,114,128, 35, 24,242,243,117,  2,157,226,
-    157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128,
-     34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128,
-     34, 29,115,  2,158,  8,158, 51,105,130,  3,200,158, 16,158, 27,
-    227,249,242,233,236,236,233, 99,128,  4,113,236,233,240,238,229,
-    245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98,
-    128,  4,134,243,241,245,225,242,101,128, 51,176,117,  2,158, 66,
-    158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244,
-    225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128,
-     51,180,247,243,241,245,225,242,101,128, 51,186,113,136,  0,113,
-    158,128,159,177,159,188,159,197,159,204,159,216,159,254,160,  6,
-     97,  4,158,138,158,161,158,225,159,160,100,  2,158,144,158,150,
-    229,246, 97,128,  9, 88,237,225,232,229,226,242,229,119,128,  5,
-    168,102,  4,158,171,158,180,158,194,158,210,225,242,225,226,233,
-     99,128,  6, 66,230,233,238,225,236,225,242,225,226,233, 99,128,
-    254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128,
-    254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254,
-    216,237,225,244,115,136,  5,184,158,248,159, 12,159, 26,159, 31,
-    159, 36,159, 45,159, 60,159,147, 49,  3,159,  0,159,  4,159,  8,
-     48,128,  5,184, 97,128,  5,184, 99,128,  5,184, 50,  2,159, 18,
-    159, 22, 55,128,  5,184, 57,128,  5,184,179, 51,128,  5,184,228,
-    101,128,  5,184,232,229,226,242,229,119,128,  5,184,238,225,242,
-    242,239,247,232,229,226,242,229,119,128,  5,184,113,  2,159, 66,
-    159,132,225,244,225,110,  4,159, 79,159, 88,159,103,159,119,232,
-    229,226,242,229,119,128,  5,184,238,225,242,242,239,247,232,229,
-    226,242,229,119,128,  5,184,241,245,225,242,244,229,242,232,229,
-    226,242,229,119,128,  5,184,247,233,228,229,232,229,226,242,229,
-    119,128,  5,184,245,225,242,244,229,242,232,229,226,242,229,119,
-    128,  5,184,247,233,228,229,232,229,226,242,229,119,128,  5,184,
-    242,238,229,249,240,225,242,225,232,229,226,242,229,119,128,  5,
-    159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227,
-    236,101,128, 36,224,232,239,239,107,128,  2,160,237,239,238,239,
-    243,240,225,227,101,128,255, 81,239,102,130,  5,231,159,225,159,
-    245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242,
-    229,119,128,251, 71,232,229,226,242,229,119,128,  5,231,240,225,
-    242,229,110,128, 36,172,117,  4,160, 16,160, 28,160,117,160,204,
-    225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115,
-    135,  5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160,
-    104,177, 56,128,  5,187,178, 53,128,  5,187,179, 49,128,  5,187,
-    232,229,226,242,229,119,128,  5,187,238,225,242,242,239,247,232,
-    229,226,242,229,119,128,  5,187,241,245,225,242,244,229,242,232,
-    229,226,242,229,119,128,  5,187,247,233,228,229,232,229,226,242,
-    229,119,128,  5,187,229,243,244,233,239,110,133,  0, 63,160,136,
-    160,159,160,176,160,184,160,196,225,114,  2,160,143,160,150,225,
-    226,233, 99,128,  6, 31,237,229,238,233,225,110,128,  5, 94,228,
-    239,247,110,129,  0,191,160,168,243,237,225,236,108,128,247,191,
-    231,242,229,229,107,128,  3,126,237,239,238,239,243,240,225,227,
-    101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101,  4,
-    160,216,161, 31,161, 51,161, 80,228,226,108,133,  0, 34,160,232,
-    160,239,160,246,161,  2,161, 23,226,225,243,101,128, 32, 30,236,
-    229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128,
-    255,  2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229,
-    242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236,
-    229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100,
-    128, 32, 27,114,  2,161, 57,161, 67,229,246,229,242,243,229,100,
-    128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128,  1, 73,
-    243,233,238,231,108,  2,161, 90,161, 97,226,225,243,101,128, 32,
-     26,101,129,  0, 39,161,103,237,239,238,239,243,240,225,227,101,
-    128,255,  7,114,145,  0,114,161,153,162,157,162,168,162,215,163,
-     10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167,
-     35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161,
-    198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162,
-    151,225,242,237,229,238,233,225,110,128,  5,124,226,229,238,231,
-    225,236,105,128,  9,176,227,245,244,101,128,  1, 85,100,  4,161,
-    215,161,221,161,235,162,  5,229,246, 97,128,  9, 48,233,227,225,
-    108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243,
-    243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225,
-    242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101,
-    129,  5,191,162, 21,232,229,226,242,229,119,128,  5,191,231,117,
-      2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237,
-    245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128,
-     48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232,
-    225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242,
-    228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128,
-      9,241,109,  2,162,120,162,143,233,228,228,236,229,228,233,225,
-    231,239,238,225,236,226,229,238,231,225,236,105,128,  9,240,243,
-    232,239,242,110,128,  2,100,244,233,111,128, 34, 54,226,239,240,
-    239,237,239,230,111,128, 49, 22, 99,  4,162,178,162,185,162,194,
-    162,202,225,242,239,110,128,  1, 89,229,228,233,236,236, 97,128,
-      1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227,
-    227,229,238,116,128,  1, 87,100,  2,162,221,162,231,226,236,231,
-    242,225,246,101,128,  2, 17,239,116,  2,162,238,162,247,225,227,
-    227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163,
-      1,237,225,227,242,239,110,128, 30, 93,101,  6,163, 24,163, 69,
-    163,104,163,159,163,184,163,217,102,  2,163, 30,163, 43,229,242,
-    229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117,
-      2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243,
-    229,116,128, 34,135,231,233,243,244,229,114,  2,163, 80,163, 85,
-    229,100,128,  0,174,115,  2,163, 91,163, 97,225,238,115,128,248,
-    232,229,242,233,102,128,246,218,104,  3,163,112,163,135,163,149,
-    225,114,  2,163,119,163,126,225,226,233, 99,128,  6, 49,237,229,
-    238,233,225,110,128,  5,128,230,233,238,225,236,225,242,225,226,
-    233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235,
-    225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230,
-    247,233,228,244,104,128,255,154,243,104,130,  5,232,163,193,163,
-    208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72,
-    232,229,226,242,229,119,128,  5,232,118,  3,163,225,163,238,164,
-     14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97,
-      2,163,245,163,254,232,229,226,242,229,119,128,  5,151,237,245,
-    231,242,225,243,232,232,229,226,242,229,119,128,  5,151,236,239,
-    231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232,
-    239,239,107,129,  2,126,164, 40,242,229,246,229,242,243,229,100,
-    128,  2,127,104,  2,164, 57,164, 80, 97,  2,164, 63,164, 73,226,
-    229,238,231,225,236,105,128,  9,221,228,229,246, 97,128,  9, 93,
-    111,131,  3,193,164, 90,164,119,164,133,239,107,129,  2,125,164,
-     97,244,245,242,238,229,100,129,  2,123,164,108,243,245,240,229,
-    242,233,239,114,128,  2,181,243,249,237,226,239,236,231,242,229,
-    229,107,128,  3,241,244,233,227,232,239,239,235,237,239,100,128,
-      2,222,105,  6,164,160,165,204,165,250,166,  5,166, 30,166,166,
-    229,245,108,  9,164,182,164,217,164,232,164,246,165, 36,165, 50,
-    165,136,165,149,165,184, 97,  2,164,188,164,203,227,233,242,227,
-    236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238,
-    235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235,
-    239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242,
-    229,225,110,128, 49, 64,107,  2,164,252,165, 28,233,249,229,239,
-    107,  2,165,  6,165, 15,235,239,242,229,225,110,128, 49, 58,243,
-    233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225,
-    110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128,
-     49, 59,112,  3,165, 58,165, 90,165,105, 97,  2,165, 64,165, 78,
-    238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229,
-    238,235,239,242,229,225,110,128, 50,  3,232,233,229,245,240,232,
-    235,239,242,229,225,110,128, 49, 63,233,229,245,112,  2,165,114,
-    165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235,
-    239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229,
-    225,110,128, 49, 61,116,  2,165,155,165,170,232,233,229,245,244,
-    232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235,
-    239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233,
-    229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116,  2,
-    165,212,165,220,225,238,231,236,101,128, 34, 31,116,  2,165,226,
-    165,240,225,227,235,226,229,236,239,247,227,237, 98,128,  3, 25,
-    242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225,
-    238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234,
-    166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110,  2,
-    166, 36,166,152,103,131,  2,218,166, 46,166, 57,166, 63,226,229,
-    236,239,247,227,237, 98,128,  3, 37,227,237, 98,128,  3, 10,232,
-    225,236,102,  2,166, 72,166,118,236,229,230,116,131,  2,191,166,
-     85,166, 96,166,107,225,242,237,229,238,233,225,110,128,  5, 89,
-    226,229,236,239,247,227,237, 98,128,  3, 28,227,229,238,244,229,
-    242,229,100,128,  2,211,242,233,231,232,116,130,  2,190,166,130,
-    166,141,226,229,236,239,247,227,237, 98,128,  3, 57,227,229,238,
-    244,229,242,229,100,128,  2,210,246,229,242,244,229,228,226,242,
-    229,246,101,128,  2, 19,244,244,239,242,245,243,241,245,225,242,
-    101,128, 51, 81,108,  2,166,186,166,197,233,238,229,226,229,236,
-    239,119,128, 30, 95,239,238,231,236,229,103,129,  2,124,166,208,
-    244,245,242,238,229,100,128,  2,122,237,239,238,239,243,240,225,
-    227,101,128,255, 82,111,  3,166,237,166,248,167, 17,232,233,242,
-    225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97,
-    129, 48,237,167,  5,232,225,236,230,247,233,228,244,104,128,255,
-    155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110,
-    128, 36,173,114,  3,167, 43,167, 79,167,109, 97,  3,167, 51,167,
-     61,167, 68,226,229,238,231,225,236,105,128,  9,220,228,229,246,
-     97,128,  9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229,
-    104,  2,167, 86,167, 95,225,242,225,226,233, 99,128,  6,145,230,
-    233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227,
-    225,236,233, 99,  4,167,125,167,135,167,142,167,153,226,229,238,
-    231,225,236,105,128,  9,224,228,229,246, 97,128,  9, 96,231,245,
-    234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233,
-    231,110,  3,167,169,167,179,167,186,226,229,238,231,225,236,105,
-    128,  9,196,228,229,246, 97,128,  9, 68,231,245,234,225,242,225,
-    244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241,
-    116,  2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242,
-    238,229,100,129,  2,121,167,232,243,245,240,229,242,233,239,114,
-    128,  2,180,117,  4,167,253,168,  8,168, 33,168, 80,232,233,242,
-    225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97,
-    129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255,
-    153,112,  2,168, 39,168, 74,229,101,  2,168, 46,168, 60,237,225,
-    242,235,226,229,238,231,225,236,105,128,  9,242,243,233,231,238,
-    226,229,238,231,225,236,105,128,  9,243,233,225,104,128,246,221,
-    244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99,  4,168,
-    103,168,113,168,120,168,131,226,229,238,231,225,236,105,128,  9,
-    139,228,229,246, 97,128,  9, 11,231,245,234,225,242,225,244,105,
-    128, 10,139,246,239,247,229,236,243,233,231,110,  3,168,147,168,
-    157,168,164,226,229,238,231,225,236,105,128,  9,195,228,229,246,
-     97,128,  9, 67,231,245,234,225,242,225,244,105,128, 10,195,115,
-    147,  0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174,
-     60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181,
-    203,182,133,182,206,183,120,183,130, 97,  9,168,237,168,247,169,
-     12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238,
-    231,225,236,105,128,  9,184,227,245,244,101,129,  1, 91,169,  0,
-    228,239,244,225,227,227,229,238,116,128, 30,101,100,  5,169, 24,
-    169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128,  6,
-     53,229,246, 97,128,  9, 56,230,233,238,225,236,225,242,225,226,
-    233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226,
-    233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233,
-     99,128,254,188,231,117,  2,169, 91,169,100,234,225,242,225,244,
-    105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242,
-    225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97,
-    129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255,
-    123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229,
-    247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253,
-    250,237,229,235,104,130,  5,225,169,188,169,208,228,225,231,229,
-    243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65,
-    232,229,226,242,229,119,128,  5,225,242, 97,  5,169,230,170, 48,
-    170, 56,170,106,170,114, 97,  5,169,242,169,250,170,  2,170, 33,
-    170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128,
-     14, 65,233,237,225,233,109,  2,170, 12,170, 23,225,236,225,233,
-    244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14,
-     67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48,
-    229,244,232,225,105,128, 14, 64,105,  3,170, 64,170, 88,170, 99,
-    105,  2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248,
-    134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105,
-    128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128,
-     14, 66,117,  3,170,122,170,172,170,179,101,  3,170,130,170,154,
-    170,165,101,  2,170,136,170,147,236,229,230,244,244,232,225,105,
-    128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232,
-    225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105,
-    128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237,
-    239,230,111,128, 49, 25, 99,  5,170,210,170,231,170,240,171, 33,
-    171, 55,225,242,239,110,129,  1, 97,170,219,228,239,244,225,227,
-    227,229,238,116,128, 30,103,229,228,233,236,236, 97,128,  1, 95,
-    232,247, 97,131,  2, 89,170,252,171,  7,171, 26,227,249,242,233,
-    236,236,233, 99,128,  4,217,228,233,229,242,229,243,233,243,227,
-    249,242,233,236,236,233, 99,128,  4,219,232,239,239,107,128,  2,
-     90,233,242, 99,  2,171, 41,171, 46,236,101,128, 36,226,245,237,
-    230,236,229,120,128,  1, 93,239,237,237,225,225,227,227,229,238,
-    116,128,  2, 25,228,239,116,  2,171, 76,171, 85,225,227,227,229,
-    238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228,
-    239,244,225,227,227,229,238,116,128, 30,105,101,  9,171,127,171,
-    143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225,
-    231,245,236,236,226,229,236,239,247,227,237, 98,128,  3, 60, 99,
-      2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238,
-    229,227,232,233,238,229,243,101,128,  2,202,244,233,239,110,128,
-      0,167,229,110,  4,171,189,171,198,171,212,171,228,225,242,225,
-    226,233, 99,128,  6, 51,230,233,238,225,236,225,242,225,226,233,
-     99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233,
-     99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99,
-    128,254,180,231,239,108,135,  5,182,172,  7,172, 21,172, 26,172,
-     35,172, 50,172, 66,172, 77, 49,  2,172, 13,172, 17, 51,128,  5,
-    182,102,128,  5,182,178, 99,128,  5,182,232,229,226,242,229,119,
-    128,  5,182,238,225,242,242,239,247,232,229,226,242,229,119,128,
-      5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128,
-      5,182,244,225,232,229,226,242,229,119,128,  5,146,247,233,228,
-    229,232,229,226,242,229,119,128,  5,182,104,  2,172, 96,172,107,
-    225,242,237,229,238,233,225,110,128,  5,125,233,242,225,231,225,
-    238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187,
-    172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105,
-      2,172,149,172,192,227,239,236,239,110,131,  0, 59,172,163,172,
-    172,172,184,225,242,225,226,233, 99,128,  6, 27,237,239,238,239,
-    243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84,
-    246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48,
-    156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238,
-    116,  2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34,
-    239,243,241,245,225,242,101,128, 51, 35,246,229,110,142,  0, 55,
-    173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146,
-    173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226,
-    233, 99,128,  6,103,226,229,238,231,225,236,105,128,  9,237,227,
-    233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243,
-    229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246,
-     97,128,  9,109,229,233,231,232,244,232,115,128, 33, 94,231,117,
-      2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237,
-    245,235,232,105,128, 10,109,232, 97,  2,173,126,173,137,227,235,
-    225,242,225,226,233, 99,128,  6,103,238,231,250,232,239,117,128,
-     48, 39,105,  2,173,152,173,170,228,229,239,231,242,225,240,232,
-    233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239,
-    114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23,
-    239,236,228,243,244,249,236,101,128,247, 55,112,  2,173,209,173,
-    216,225,242,229,110,128, 36,122,229,114,  2,173,223,173,229,233,
-    239,100,128, 36,142,243,233,225,110,128,  6,247,242,239,237,225,
-    110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116,
-      2,174,  5,174, 43,229,229,110,  2,174, 13,174, 22,227,233,242,
-    227,236,101,128, 36,112,112,  2,174, 28,174, 35,225,242,229,110,
-    128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14,
-     87,230,244,232,249,240,232,229,110,128,  0,173,104,  7,174, 76,
-    175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97,  6,174, 90,
-    174,101,174,111,174,122,175,  9,175, 34,225,242,237,229,238,233,
-    225,110,128,  5,119,226,229,238,231,225,236,105,128,  9,182,227,
-    249,242,233,236,236,233, 99,128,  4, 72,100,  2,174,128,174,224,
-    228, 97,  4,174,139,174,148,174,179,174,193,225,242,225,226,233,
-     99,128,  6, 81,228,225,237,237, 97,  2,174,158,174,167,225,242,
-    225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99,
-    128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252,
-     96,235,225,243,242, 97,  2,174,203,174,212,225,242,225,226,233,
-     99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95,
-    101,132, 37,146,174,236,174,243,174,251,175,  4,228,225,242,107,
-    128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245,
-    109,128, 37,146,246, 97,128,  9, 54,231,117,  2,175, 16,175, 25,
-    234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128,
-     10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128,
-      5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225,
-    227,249,242,233,236,236,233, 99,128,  4, 73,101,  4,175, 85,175,
-    150,175,160,175,177,229,110,  4,175, 96,175,105,175,119,175,135,
-    225,242,225,226,233, 99,128,  6, 52,230,233,238,225,236,225,242,
-    225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242,
-    225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225,
-    226,233, 99,128,254,184,233,227,239,240,244,233, 99,128,  3,227,
-    241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32,
-    170,246, 97,134,  5,176,175,194,175,209,175,223,175,232,175,247,
-    176,  7, 49,  2,175,200,175,205,177, 53,128,  5,176, 53,128,  5,
-    176, 50,  2,175,215,175,219, 50,128,  5,176,101,128,  5,176,232,
-    229,226,242,229,119,128,  5,176,238,225,242,242,239,247,232,229,
-    226,242,229,119,128,  5,176,241,245,225,242,244,229,242,232,229,
-    226,242,229,119,128,  5,176,247,233,228,229,232,229,226,242,229,
-    119,128,  5,176,232,225,227,249,242,233,236,236,233, 99,128,  4,
-    187,105,  2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128,
-      3,237,110,131,  5,233,176, 60,176,143,176,152,100,  2,176, 66,
-    176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229,
-    226,242,229,119,128,251, 73,115,  2,176, 93,176,113,232,233,238,
-    228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251,
-     44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229,
-    119,128,251, 45,239,244,232,229,226,242,229,119,128,  5,193,232,
-    229,226,242,229,119,128,  5,233,115,  2,176,158,176,178,232,233,
-    238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128,
-    251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242,
-    229,119,128,251, 43,239,239,107,128,  2,130,105,  8,176,221,177,
-      9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97,
-    131,  3,195,176,233,176,237,176,245, 49,128,  3,194,230,233,238,
-    225,108,128,  3,194,236,245,238,225,244,229,243,249,237,226,239,
-    236,231,242,229,229,107,128,  3,242,232,233,242,225,231,225,238,
-     97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177,
-     33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113,
-      2,177, 53,177, 62,232,229,226,242,229,119,128,  5,189,236,229,
-    230,244,232,229,226,242,229,119,128,  5,189,237,233,236,225,114,
-    128, 34, 60,238,228,239,244,232,229,226,242,229,119,128,  5,194,
-    239,115,  6,177,111,177,146,177,178,177,206,177,220,177,252, 97,
-      2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225,
-    110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128,
-     50, 20,227,105,  2,177,153,177,165,229,245,227,235,239,242,229,
-    225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128,
-     50,102,107,  2,177,184,177,198,233,249,229,239,235,235,239,242,
-    229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233,
-    229,245,238,235,239,242,229,225,110,128, 49,123,112,  2,177,226,
-    177,239,225,242,229,238,235,239,242,229,225,110,128, 50,  6,233,
-    229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229,
-    245,244,235,239,242,229,225,110,128, 49,124,120,141,  0, 54,178,
-     41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178,
-    195,178,206,178,239,178,247,179,  2,225,242,225,226,233, 99,128,
-      6,102,226,229,238,231,225,236,105,128,  9,236,227,233,242,227,
-    236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225,
-    238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128,  9,
-    108,231,117,  2,178,104,178,113,234,225,242,225,244,105,128, 10,
-    236,242,237,245,235,232,105,128, 10,108,232, 97,  2,178,129,178,
-    140,227,235,225,242,225,226,233, 99,128,  6,102,238,231,250,232,
-    239,117,128, 48, 38,105,  2,178,155,178,173,228,229,239,231,242,
-    225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229,
-    242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101,
-    128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112,  2,
-    178,212,178,219,225,242,229,110,128, 36,121,229,114,  2,178,226,
-    178,232,233,239,100,128, 36,141,243,233,225,110,128,  6,246,242,
-    239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128,
-     32,118,116,  2,179,  8,179, 79,229,229,110,  2,179, 16,179, 58,
-     99,  2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242,
-    242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242,
-    226,229,238,231,225,236,105,128,  9,249,112,  2,179, 64,179, 71,
-    225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232,
-    225,105,128, 14, 86,108,  2,179, 91,179,111,225,243,104,129,  0,
-     47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239,
-    238,103,129,  1,127,179,119,228,239,244,225,227,227,229,238,116,
-    128, 30,155,109,  2,179,137,179,147,233,236,229,230,225,227,101,
-    128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111,  6,
-    179,172,179,222,179,233,180,  2,180, 47,180, 58,102,  2,179,178,
-    179,192,240,225,243,245,241,232,229,226,242,229,119,128,  5,195,
-    116,  2,179,198,179,207,232,249,240,232,229,110,128,  0,173,243,
-    233,231,238,227,249,242,233,236,236,233, 99,128,  4, 76,232,233,
-    242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238,
-     97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128,
-    255,127,236,233,228,245,115,  2,180, 12,180, 29,236,239,238,231,
-    239,246,229,242,236,225,249,227,237, 98,128,  3, 56,243,232,239,
-    242,244,239,246,229,242,236,225,249,227,237, 98,128,  3, 55,242,
-    245,243,233,244,232,225,105,128, 14, 41,115,  3,180, 66,180, 76,
-    180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225,
-    105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97,  3,
-    180,102,180,122,180,154,227,101,129,  0, 32,180,109,232,225,227,
-    235,225,242,225,226,233, 99,128,  0, 32,228,101,129, 38, 96,180,
-    129,243,245,233,116,  2,180,138,180,146,226,236,225,227,107,128,
-     38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174,
-    241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255,
-    181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239,
-    247,227,237, 98,128,  3, 59, 99,  2,180,205,180,209, 99,128, 51,
-    196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239,
-    243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239,
-    242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107,
-      2,181,  5,181,  9,103,128, 51,143,109,129, 51,158,181, 15,227,
-    225,240,233,244,225,108,128, 51,206,108,  2,181, 31,181, 35,110,
-    128, 51,209,239,103,128, 51,210,109,  4,181, 50,181, 54,181, 59,
-    181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243,
-    241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239,
-    238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236,
-    108,128, 37,166,245,240,240,229,114,  2,181,110,181,133,236,229,
-    230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233,
-    236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229,
-    242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244,
-    233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229,
-    247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37,
-    163,242,243,241,245,225,242,101,128, 51,219,115,  2,181,209,182,
-    123, 97,  4,181,219,181,229,181,236,181,247,226,229,238,231,225,
-    236,105,128,  9,183,228,229,246, 97,128,  9, 55,231,245,234,225,
-    242,225,244,105,128, 10,183,238,103,  8,182, 10,182, 24,182, 38,
-    182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235,
-    239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242,
-    229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225,
-    110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110,
-    128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49,
-    101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243,
-    233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229,
-    245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233,
-    239,114,128,246,242,116,  2,182,139,182,162,229,242,236,233,238,
-    103,129,  0,163,182,150,237,239,238,239,243,240,225,227,101,128,
-    255,225,242,239,235,101,  2,182,171,182,188,236,239,238,231,239,
-    246,229,242,236,225,249,227,237, 98,128,  3, 54,243,232,239,242,
-    244,239,246,229,242,236,225,249,227,237, 98,128,  3, 53,117,  7,
-    182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243,
-    229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225,
-    108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99,  2,
-    183,  4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225,
-    116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107,
-      2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183,
-     49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225,
-    242,225,226,233, 99,128,  6, 82,237,237,225,244,233,239,110,128,
-     34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183,
-     99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242,
-    229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128,
-     51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101,
-    128, 51,124,116,144,  0,116,183,183,184,192,184,213,185,100,185,
-    140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194,
-     57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183,
-    243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238,
-    231,225,236,105,128,  9,164,227,107,  2,183,222,183,229,228,239,
-    247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97,
-    128,  9, 36,231,117,  2,183,250,184,  3,234,225,242,225,244,105,
-    128, 10,164,242,237,245,235,232,105,128, 10, 36,104,  4,184, 22,
-    184, 31,184, 45,184, 75,225,242,225,226,233, 99,128,  6, 55,230,
-    233,238,225,236,225,242,225,226,233, 99,128,254,194,105,  2,184,
-     51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128,
-    254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225,
-    236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229,
-    242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235,
-    225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244,
-    104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128,
-      6, 64,117,128,  3,196,118,130,  5,234,184,158,184,183,228,225,
-    231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229,
-    226,242,229,119,128,251, 74,232,229,226,242,229,119,128,  5,234,
-     98,  2,184,198,184,203,225,114,128,  1,103,239,240,239,237,239,
-    230,111,128, 49, 10, 99,  6,184,227,184,234,184,241,184,250,185,
-     60,185, 87,225,242,239,110,128,  1,101,227,245,242,108,128,  2,
-    168,229,228,233,236,236, 97,128,  1, 99,232,229,104,  4,185,  6,
-    185, 15,185, 29,185, 45,225,242,225,226,233, 99,128,  6,134,230,
-    233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233,
-    244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228,
-    233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99,  2,
-    185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226,
-    229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238,
-    116,128,  1, 99,100,  2,185,106,185,116,233,229,242,229,243,233,
-    115,128, 30,151,239,116,  2,185,123,185,132,225,227,227,229,238,
-    116,128, 30,107,226,229,236,239,119,128, 30,109,101,  9,185,160,
-    185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158,
-    227,249,242,233,236,236,233, 99,128,  4, 66,228,229,243,227,229,
-    238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,173,104,
-      7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225,
-    242,225,226,233, 99,128,  6, 42,230,233,238,225,236,225,242,225,
-    226,233, 99,128,254,150,232,225,232,105,  2,185,239,185,254,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239,
-    236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105,  2,
-    186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99,
-    128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237,
-    105,  2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226,
-    233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226,
-    233, 99,128,252, 11,109,  2,186, 91,186,125,225,242,226,245,244,
-     97,  2,186,102,186,111,225,242,225,226,233, 99,128,  6, 41,230,
-    233,238,225,236,225,242,225,226,233, 99,128,254,148,101,  2,186,
-    131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152,
-    229,237,105,  2,186,152,186,167,238,233,244,233,225,236,225,242,
-    225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242,
-    225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236,
-    225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238,
-     97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128,
-    255,131,108,  2,186,232,186,251,229,240,232,239,238,101,129, 33,
-     33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97,  2,
-    187,  4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119,
-    128,  5,160,241,229,244,225,238,225,232,229,226,242,229,119,128,
-      5,169,110,  4,187, 44,187, 53,187, 72,187, 93,227,233,242,227,
-    236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227,
-    240,225,242,229,110,128, 50, 41,112,  2,187, 78,187, 85,225,242,
-    229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237,
-    225,110,128, 33,121,243,104,128,  2,167,116,131,  5,216,187,116,
-    187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232,
-    229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128,  5,
-    216,243,229,227,249,242,233,236,236,233, 99,128,  4,181,246,233,
-    114,  2,187,166,187,175,232,229,226,242,229,119,128,  5,155,236,
-    229,230,244,232,229,226,242,229,119,128,  5,155,104,  6,187,202,
-    188, 98,188,220,189, 96,190,  3,191, 60, 97,  5,187,214,187,224,
-    187,231,188,  0,188, 29,226,229,238,231,225,236,105,128,  9,165,
-    228,229,246, 97,128,  9, 37,231,117,  2,187,238,187,247,234,225,
-    242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37,
-    108,  2,188,  6,188, 15,225,242,225,226,233, 99,128,  6, 48,230,
-    233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232,
-    225,235,232,225,116,  3,188, 44,188, 75,188, 82,236,239,119,  2,
-    188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242,
-    233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128,
-     14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128,
-    248,150,101,  3,188,106,188,170,188,193,104,  4,188,116,188,125,
-    188,139,188,155,225,242,225,226,233, 99,128,  6, 43,230,233,238,
-    225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233,
-    225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225,
-    236,225,242,225,226,233, 99,128,254,156,242,101,  2,188,177,188,
-    186,229,248,233,243,244,115,128, 34,  3,230,239,242,101,128, 34,
-     52,244, 97,130,  3,184,188,202,188,206, 49,128,  3,209,243,249,
-    237,226,239,236,231,242,229,229,107,128,  3,209,105,  2,188,226,
-    189, 56,229,245,244,104,  4,188,239,189, 18,189, 33,189, 42, 97,
-      2,188,245,189,  4,227,233,242,227,236,229,235,239,242,229,225,
-    110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128,
-     50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,
-    107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235,
-    239,242,229,225,110,128, 50, 11,242,244,229,229,110,  2,189, 66,
-    189, 75,227,233,242,227,236,101,128, 36,108,112,  2,189, 81,189,
-     88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148,
-    111,  6,189,110,189,127,189,132,189,146,189,151,189,204,238,225,
-    238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239,
-    107,128,  1,173,240,232,245,244,232,225,239,244,232,225,105,128,
-     14, 18,242,110,128,  0,254,244,104,  3,189,160,189,184,189,194,
-     97,  2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23,
-    238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128,
-     14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238,
-    100,  2,189,214,189,225,227,249,242,233,236,236,233, 99,128,  4,
-    130,243,243,229,240,225,242,225,244,239,114,  2,189,240,189,249,
-    225,242,225,226,233, 99,128,  6,108,240,229,242,243,233,225,110,
-    128,  6,108,242,229,101,144,  0, 51,190, 41,190, 50,190, 60,190,
-     90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190,
-    235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128,
-      6, 99,226,229,238,231,225,236,105,128,  9,233,227,233,242,227,
-    236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225,
-    238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128,  9,
-    105,229,233,231,232,244,232,115,128, 33, 92,231,117,  2,190,114,
-    190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232,
-    105,128, 10,105,232, 97,  2,190,139,190,150,227,235,225,242,225,
-    226,233, 99,128,  6, 99,238,231,250,232,239,117,128, 48, 35,105,
-      2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240,
-    225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32,
-    131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237,
-    229,242,225,244,239,242,226,229,238,231,225,236,105,128,  9,246,
-    239,236,228,243,244,249,236,101,128,247, 51,112,  2,190,241,190,
-    248,225,242,229,110,128, 36,118,229,114,  2,190,255,191,  5,233,
-    239,100,128, 36,138,243,233,225,110,128,  6,243,241,245,225,242,
-    244,229,242,115,129,  0,190,191, 25,229,237,228,225,243,104,128,
-    246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233,
-    239,114,128,  0,179,244,232,225,105,128, 14, 83,250,243,241,245,
-    225,242,101,128, 51,148,105,  7,191, 86,191, 97,191,212,192, 54,
-    192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48,
-     97,107,  2,191,103,191,127,225,244,225,235,225,238, 97,129, 48,
-    193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229,
-    245,116,  4,191,139,191,174,191,189,191,198, 97,  2,191,145,191,
-    160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112,
-    240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233,
-    242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242,
-    229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225,
-    110,128, 50,  2,236,228,101,133,  2,220,191,228,191,239,192,  0,
-    192, 12,192, 40,226,229,236,239,247,227,237, 98,128,  3, 48, 99,
-      2,191,245,191,250,237, 98,128,  3,  3,239,237, 98,128,  3,  3,
-    228,239,245,226,236,229,227,237, 98,128,  3, 96,111,  2,192, 18,
-    192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236,
-    225,249,227,237, 98,128,  3, 52,246,229,242,244,233,227,225,236,
-    227,237, 98,128,  3, 62,237,229,243,227,233,242,227,236,101,128,
-     34,151,112,  2,192, 72,192,102,229,232, 97,  2,192, 80,192, 89,
-    232,229,226,242,229,119,128,  5,150,236,229,230,244,232,229,226,
-    242,229,119,128,  5,150,240,233,231,245,242,237,245,235,232,105,
-    128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237,
-     98,128,  4,131,247,238,225,242,237,229,238,233,225,110,128,  5,
-    127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238,
-    239,243,240,225,227,101,128,255, 84,111,  7,192,185,192,196,192,
-    207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225,
-    110,128,  5,105,232,233,242,225,231,225,238, 97,128, 48,104,235,
-    225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230,
-    247,233,228,244,104,128,255,132,110,  3,192,240,193, 82,193, 87,
-    101,  4,192,250,193, 63,193, 70,193, 76,226,225,114,  4,193,  6,
-    193, 35,193, 45,193, 54,229,248,244,242, 97,  2,193, 16,193, 26,
-    232,233,231,232,237,239,100,128,  2,229,236,239,247,237,239,100,
-    128,  2,233,232,233,231,232,237,239,100,128,  2,230,236,239,247,
-    237,239,100,128,  2,232,237,233,228,237,239,100,128,  2,231,230,
-    233,246,101,128,  1,189,243,233,120,128,  1,133,244,247,111,128,
-      1,168,239,115,128,  3,132,243,241,245,225,242,101,128, 51, 39,
-    240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233,
-    243,229,243,232,229,236,236,226,242,225,227,235,229,116,  2,193,
-    131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237,
-    225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254,
-     57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225,
-    236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58,
-    244,225,239,244,232,225,105,128, 14, 21,240, 97,  2,193,209,193,
-    221,236,225,244,225,236,232,239,239,107,128,  1,171,242,229,110,
-    128, 36,175,114,  3,193,235,194, 10,194, 25,225,228,229,237,225,
-    242,107,129, 33, 34,193,247,115,  2,193,253,194,  3,225,238,115,
-    128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236,
-    229,248,232,239,239,107,128,  2,136,233,225,103,  4,194, 37,194,
-     42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242,
-    116,128, 37,186,245,112,128, 37,178,115,132,  2,166,194, 69,194,
-    108,194,214,194,227,225,228,105,130,  5,230,194, 79,194, 99,228,
-    225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119,
-    128,251, 70,232,229,226,242,229,119,128,  5,230,101,  2,194,114,
-    194,125,227,249,242,233,236,236,233, 99,128,  4, 70,242,101,134,
-      5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49,  2,
-    194,148,194,152, 50,128,  5,181,101,128,  5,181,178, 98,128,  5,
-    181,232,229,226,242,229,119,128,  5,181,238,225,242,242,239,247,
-    232,229,226,242,229,119,128,  5,181,241,245,225,242,244,229,242,
-    232,229,226,242,229,119,128,  5,181,247,233,228,229,232,229,226,
-    242,229,119,128,  5,181,232,229,227,249,242,233,236,236,233, 99,
-    128,  4, 91,245,240,229,242,233,239,114,128,246,243,116,  4,194,
-    247,195, 41,195,106,195,157, 97,  3,194,255,195,  9,195, 16,226,
-    229,238,231,225,236,105,128,  9,159,228,229,246, 97,128,  9, 31,
-    231,117,  2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159,
-    242,237,245,235,232,105,128, 10, 31,229,104,  4,195, 52,195, 61,
-    195, 75,195, 91,225,242,225,226,233, 99,128,  6,121,230,233,238,
-    225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233,
-    225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225,
-    236,225,242,225,226,233, 99,128,251,105,232, 97,  3,195,115,195,
-    125,195,132,226,229,238,231,225,236,105,128,  9,160,228,229,246,
-     97,128,  9, 32,231,117,  2,195,139,195,148,234,225,242,225,244,
-    105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238,
-    229,100,128,  2,135,117,  3,195,173,195,184,195,209,232,233,242,
-    225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97,
-    129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255,
-    130,243,237,225,236,108,  2,195,219,195,230,232,233,242,225,231,
-    225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48,
-    195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119,
-      2,196,  5,196,110,101,  2,196, 11,196, 59,236,246,101,  3,196,
-     21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112,  2,
-    196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100,
-    128, 36,147,242,239,237,225,110,128, 33,123,238,244,121,  3,196,
-     69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225,
-    238,231,250,232,239,117,128, 83, 68,112,  2,196, 95,196,102,225,
-    242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142,
-      0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39,
-    197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242,
-    225,226,233, 99,128,  6, 98,226,229,238,231,225,236,105,128,  9,
-    232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229,
-    242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100,
-      2,196,197,196,203,229,246, 97,128,  9,104,239,116,  2,196,210,
-    196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225,
-    228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108,
-    128,254, 48,231,117,  2,196,250,197,  3,234,225,242,225,244,105,
-    128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97,  2,197,
-     19,197, 30,227,235,225,242,225,226,233, 99,128,  6, 98,238,231,
-    250,232,239,117,128, 48, 34,105,  2,197, 45,197, 63,228,229,239,
-    231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238,
-    230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225,
-    227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229,
-    238,231,225,236,105,128,  9,245,239,236,228,243,244,249,236,101,
-    128,247, 50,112,  2,197,121,197,128,225,242,229,110,128, 36,117,
-    229,114,  2,197,135,197,141,233,239,100,128, 36,137,243,233,225,
-    110,128,  6,242,242,239,237,225,110,128, 33,113,115,  2,197,162,
-    197,170,244,242,239,235,101,128,  1,187,245,240,229,242,233,239,
-    114,128,  0,178,244,104,  2,197,187,197,192,225,105,128, 14, 82,
-    233,242,228,115,128, 33, 84,117,145,  0,117,197,237,197,245,198,
-     30,198, 87,198,225,199,  6,199,129,199,145,199,196,200, 10,200,
-     91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245,
-    244,101,128,  0,250, 98,  4,197,255,198,  4,198, 13,198, 23,225,
-    114,128,  2,137,229,238,231,225,236,105,128,  9,137,239,240,239,
-    237,239,230,111,128, 49, 40,242,229,246,101,128,  1,109, 99,  3,
-    198, 38,198, 45,198, 77,225,242,239,110,128,  1,212,233,242, 99,
-      2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120,
-    129,  0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233,
-    236,236,233, 99,128,  4, 67,100,  5,198, 99,198,110,198,133,198,
-    139,198,215,225,244,244,225,228,229,246, 97,128,  9, 81,226,108,
-      2,198,117,198,125,225,227,245,244,101,128,  1,113,231,242,225,
-    246,101,128,  2, 21,229,246, 97,128,  9,  9,233,229,242,229,243,
-    233,115,133,  0,252,198,159,198,167,198,175,198,198,198,206,225,
-    227,245,244,101,128,  1,216,226,229,236,239,119,128, 30,115, 99,
-      2,198,181,198,188,225,242,239,110,128,  1,218,249,242,233,236,
-    236,233, 99,128,  4,241,231,242,225,246,101,128,  1,220,237,225,
-    227,242,239,110,128,  1,214,239,244,226,229,236,239,119,128, 30,
-    229,103,  2,198,231,198,238,242,225,246,101,128,  0,249,117,  2,
-    198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245,
-    235,232,105,128, 10,  9,104,  3,199, 14,199, 24,199,102,233,242,
-    225,231,225,238, 97,128, 48, 70,111,  2,199, 30,199, 40,239,235,
-    225,226,239,246,101,128, 30,231,242,110,133,  1,176,199, 55,199,
-     63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228,
-    239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128,
-     30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233,
-    236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245,
-    116,129,  1,113,199,118,227,249,242,233,236,236,233, 99,128,  4,
-    243,233,238,246,229,242,244,229,228,226,242,229,246,101,128,  2,
-     23,107,  3,199,153,199,177,199,188,225,244,225,235,225,238, 97,
-    129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255,
-    115,227,249,242,233,236,236,233, 99,128,  4,121,239,242,229,225,
-    110,128, 49, 92,109,  2,199,202,199,255, 97,  2,199,208,199,241,
-    227,242,239,110,130,  1,107,199,219,199,230,227,249,242,233,236,
-    236,233, 99,128,  4,239,228,233,229,242,229,243,233,115,128, 30,
-    123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239,
-    238,239,243,240,225,227,101,128,255, 85,110,  2,200, 16,200, 71,
-    228,229,242,243,227,239,242,101,132,  0, 95,200, 35,200, 41,200,
-     53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225,
-    227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51,
-    247,225,246,121,128,254, 79,105,  2,200, 77,200, 82,239,110,128,
-     34, 42,246,229,242,243,225,108,128, 34,  0,239,231,239,238,229,
-    107,128,  1,115,112,  5,200,112,200,119,200,127,200,142,200,193,
-    225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240,
-    229,242,228,239,244,232,229,226,242,229,119,128,  5,196,243,233,
-    236,239,110,131,  3,197,200,156,200,177,200,185,228,233,229,242,
-    229,243,233,115,129,  3,203,200,169,244,239,238,239,115,128,  3,
-    176,236,225,244,233,110,128,  2,138,244,239,238,239,115,128,  3,
-    205,244,225,227,107,  2,200,202,200,213,226,229,236,239,247,227,
-    237, 98,128,  3, 29,237,239,100,128,  2,212,114,  2,200,225,200,
-    237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103,
-    128,  1,111,115,  3,200,251,201, 10,201, 55,232,239,242,244,227,
-    249,242,233,236,236,233, 99,128,  4, 94,237,225,236,108,  2,201,
-     19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225,
-    244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247,
-    233,228,244,104,128,255,105,244,242,225,233,231,232,116,  2,201,
-     67,201, 78,227,249,242,233,236,236,233, 99,128,  4,175,243,244,
-    242,239,235,229,227,249,242,233,236,236,233, 99,128,  4,177,244,
-    233,236,228,101,130,  1,105,201,107,201,115,225,227,245,244,101,
-    128, 30,121,226,229,236,239,119,128, 30,117,117,  5,201,135,201,
-    145,201,152,201,177,201,193,226,229,238,231,225,236,105,128,  9,
-    138,228,229,246, 97,128,  9, 10,231,117,  2,201,159,201,168,234,
-    225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10,
-     10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10,
-     66,246,239,247,229,236,243,233,231,110,  3,201,209,201,219,201,
-    226,226,229,238,231,225,236,105,128,  9,194,228,229,246, 97,128,
-      9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247,
-    229,236,243,233,231,110,  3,201,253,202,  7,202, 14,226,229,238,
-    231,225,236,105,128,  9,193,228,229,246, 97,128,  9, 65,231,245,
-    234,225,242,225,244,105,128, 10,193,118,139,  0,118,202, 51,202,
-    199,202,208,202,219,203,148,203,155,203,253,204,  9,204,109,204,
-    117,204,138, 97,  4,202, 61,202, 68,202, 93,202,104,228,229,246,
-     97,128,  9, 53,231,117,  2,202, 75,202, 84,234,225,242,225,244,
-    105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244,
-    225,235,225,238, 97,128, 48,247,118,132,  5,213,202,116,202,143,
-    202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202,
-    134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104,
-      2,202,149,202,157,229,226,242,229,119,128,  5,213,239,236,225,
-    109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246,
-    225,246,232,229,226,242,229,119,128,  5,240,249,239,228,232,229,
-    226,242,229,119,128,  5,241,227,233,242,227,236,101,128, 36,229,
-    228,239,244,226,229,236,239,119,128, 30,127,101,  6,202,233,202,
-    244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233,
-     99,128,  4, 50,104,  4,202,254,203,  7,203, 21,203, 37,225,242,
-    225,226,233, 99,128,  6,164,230,233,238,225,236,225,242,225,226,
-    233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226,
-    233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233,
-     99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238,
-    245,115,128, 38, 64,242,244,233,227,225,108,  2,203, 80,203, 86,
-    226,225,114,128,  0,124,236,233,238,101,  4,203, 99,203,110,203,
-    121,203,130,225,226,239,246,229,227,237, 98,128,  3, 13,226,229,
-    236,239,247,227,237, 98,128,  3, 41,236,239,247,237,239,100,128,
-      2,204,237,239,100,128,  2,200,247,225,242,237,229,238,233,225,
-    110,128,  5,126,232,239,239,107,128,  2,139,105,  3,203,163,203,
-    174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225,
-    237, 97,  3,203,185,203,195,203,202,226,229,238,231,225,236,105,
-    128,  9,205,228,229,246, 97,128,  9, 77,231,245,234,225,242,225,
-    244,105,128, 10,205,243,225,242,231, 97,  3,203,225,203,235,203,
-    242,226,229,238,231,225,236,105,128,  9,131,228,229,246, 97,128,
-      9,  3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238,
-    239,243,240,225,227,101,128,255, 86,111,  3,204, 17,204, 28,204,
-     98,225,242,237,229,238,233,225,110,128,  5,120,233,227,229,100,
-      2,204, 37,204, 73,233,244,229,242,225,244,233,239,110,  2,204,
-     51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225,
-    244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238,
-     97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128,
-    255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242,
-    229,110,128, 36,177,116,  2,204,123,204,130,233,236,228,101,128,
-     30,125,245,242,238,229,100,128,  2,140,117,  2,204,144,204,155,
-    232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235,
-    225,238, 97,128, 48,244,119,143,  0,119,204,200,205,177,205,187,
-    205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168,
-    208,176,208,183,208,194,208,203, 97,  8,204,218,204,225,204,235,
-    204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30,
-    131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231,
-    225,238, 97,128, 48,143,107,  2,204,252,205, 20,225,244,225,235,
-    225,238, 97,129, 48,239,205,  8,232,225,236,230,247,233,228,244,
-    104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236,
-    108,  2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48,
-    142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243,
-    241,245,225,242,101,128, 51, 87,118,  2,205, 78,205, 86,229,228,
-    225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242,
-    229,246,229,242,244,233,227,225,108,128,254, 52,119,  3,205,116,
-    205,125,205,139,225,242,225,226,233, 99,128,  6, 72,230,233,238,
-    225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225,
-    225,226,239,246,101,  2,205,154,205,163,225,242,225,226,233, 99,
-    128,  6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254,
-    134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99,  2,
-    205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128,
-      1,117,100,  2,205,216,205,226,233,229,242,229,243,233,115,128,
-     30,133,239,116,  2,205,233,205,242,225,227,227,229,238,116,128,
-     30,135,226,229,236,239,119,128, 30,137,101,  4,206,  4,206, 15,
-    206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233,
-    229,242,243,244,242,225,243,115,128, 33, 24,107,  2,206, 33,206,
-     43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110,
-    128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225,
-    246,101,128, 30,129,232,233,244,101,  8,206, 90,206, 99,206,183,
-    207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116,
-    128, 37,230, 99,  2,206,105,206,125,233,242,227,236,101,129, 37,
-    203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238,
-    229,242,226,242,225,227,235,229,116,  2,206,142,206,162,236,229,
-    230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128,
-    254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244,
-    233,227,225,108,128,254, 68,100,  2,206,189,206,230,233,225,237,
-    239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233,
-    238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237,
-    239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238,
-    103,  2,206,246,207,  6,243,237,225,236,236,244,242,233,225,238,
-    231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37,
-    189,236,101,  2,207, 24,207, 66,230,244,240,239,233,238,244,233,
-    238,103,  2,207, 39,207, 55,243,237,225,236,236,244,242,233,225,
-    238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128,
-     37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229,
-    116,  2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231,
-    232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233,
-    238,103,  2,207,119,207,135,243,237,225,236,236,244,242,233,225,
-    238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128,
-     37,183,115,  3,207,154,207,184,207,192,109,  2,207,160,207,172,
-    225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238,
-    231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161,
-    244,225,114,128, 38,  6,116,  2,207,204,207,215,229,236,229,240,
-    232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232,
-    229,236,236,226,242,225,227,235,229,116,  2,207,239,207,246,236,
-    229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240,
-    240,239,233,238,244,233,238,103,  2,208, 13,208, 29,243,237,225,
-    236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233,
-    225,238,231,236,101,128, 37,179,105,  2,208, 46,208, 57,232,233,
-    242,225,231,225,238, 97,128, 48,144,107,  2,208, 63,208, 73,225,
-    244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49,
-     95,237,239,238,239,243,240,225,227,101,128,255, 87,111,  4,208,
-    103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128,
-     48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232,
-    225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208,
-    145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229,
-    238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178,
-    242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128,
-      2,183,244,245,242,238,229,100,128,  2,141,249,238,110,128,  1,
-    191,120,137,  0,120,208,231,208,242,208,253,209,  6,209, 33,209,
-     46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128,
-      3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242,
-    227,236,101,128, 36,231,100,  2,209, 12,209, 22,233,229,242,229,
-    243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30,
-    139,229,232,225,242,237,229,238,233,225,110,128,  5,109,105,128,
-      3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225,
-    242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128,  2,
-    227,121,143,  0,121,209,115,210, 74,210, 97,210,137,212,103,212,
-    111,212,128,212,192,212,204,213,201,213,241,213,253,214,  8,214,
-     29,215,  2, 97, 11,209,139,209,151,209,161,209,168,209,175,209,
-    185,209,210,209,221,210,  3,210, 16,210, 62,225,228,239,243,241,
-    245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128,  9,
-    175,227,245,244,101,128,  0,253,228,229,246, 97,128,  9, 47,229,
-    235,239,242,229,225,110,128, 49, 82,231,117,  2,209,192,209,201,
-    234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128,
-     10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107,  2,209,
-    227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232,
-    225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110,
-    128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78,
-    243,237,225,236,108,  2,210, 26,210, 37,232,233,242,225,231,225,
-    238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227,
-    210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227,
-    249,242,233,236,236,233, 99,128,  4, 99,227,233,242, 99,  2,210,
-     83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128,  1,
-    119,100,  2,210,103,210,113,233,229,242,229,243,233,115,128,  0,
-    255,239,116,  2,210,120,210,129,225,227,227,229,238,116,128, 30,
-    143,226,229,236,239,119,128, 30,245,101,  7,210,153,211,161,211,
-    170,211,188,211,220,212, 40,212, 91,104,  8,210,171,210,180,210,
-    214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233,
-     99,128,  6, 74,226,225,242,242,229,101,  2,210,191,210,200,225,
-    242,225,226,233, 99,128,  6,210,230,233,238,225,236,225,242,225,
-    226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233,
-     99,128,254,242,232,225,237,250,225,225,226,239,246,101,  4,210,
-    247,211,  0,211, 14,211, 30,225,242,225,226,233, 99,128,  6, 38,
-    230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238,
-    233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229,
-    228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233,
-    244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101,  2,
-    211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254,
-    244,229,237,105,  2,211, 89,211,104,238,233,244,233,225,236,225,
-    242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225,
-    242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225,
-    236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228,
-    239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128,  6,
-    209,235,239,242,229,225,110,128, 49, 86,110,129,  0,165,211,176,
-    237,239,238,239,243,240,225,227,101,128,255,229,111,  2,211,194,
-    211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233,
-    229,245,232,235,239,242,229,225,110,128, 49,134,114,  3,211,228,
-    212,  8,212, 20,225,232,226,229,238,249,239,237,111,  2,211,242,
-    211,251,232,229,226,242,229,119,128,  5,170,236,229,230,244,232,
-    229,226,242,229,119,128,  5,170,233,227,249,242,233,236,236,233,
-     99,128,  4, 75,245,228,233,229,242,229,243,233,243,227,249,242,
-    233,236,236,233, 99,128,  4,249,243,233,229,245,238,103,  3,212,
-     53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225,
-    238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233,
-    239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229,
-    226,242,229,119,128,  5,154,231,242,225,246,101,128, 30,243,232,
-    239,239,107,129,  1,180,212,120,225,226,239,246,101,128, 30,247,
-    105,  5,212,140,212,151,212,162,212,171,212,179,225,242,237,229,
-    238,233,225,110,128,  5,117,227,249,242,233,236,236,233, 99,128,
-      4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103,
-    128, 38, 47,247,238,225,242,237,229,238,233,225,110,128,  5,130,
-    237,239,238,239,243,240,225,227,101,128,255, 89,111,  7,212,220,
-    213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131,  5,217,
-    212,230,212,250,213,  3,228,225,231,229,243,104,129,251, 57,212,
-    241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119,
-    128,  5,217,249,239,100,  2,213, 11,213, 20,232,229,226,242,229,
-    119,128,  5,242,240,225,244,225,232,232,229,226,242,229,119,128,
-    251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239,
-    242,229,225,110,128, 49,137,107,  2,213, 61,213, 85,225,244,225,
-    235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228,
-    244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225,
-    236,108,  2,213,103,213,114,232,233,242,225,231,225,238, 97,128,
-     48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232,
-    225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229,
-    107,128,  3,243,121,  2,213,154,213,191, 97,  2,213,160,213,170,
-    229,235,239,242,229,225,110,128, 49,136,107,  2,213,176,213,184,
-    239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233,
-    238,231,244,232,225,105,128, 14, 13,112,  2,213,207,213,214,225,
-    242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238,
-    105,129,  3,122,213,230,231,242,229,229,235,227,237, 98,128,  3,
-     69,114,129,  1,166,213,247,233,238,103,128, 30,153,243,245,240,
-    229,242,233,239,114,128,  2,184,116,  2,214, 14,214, 21,233,236,
-    228,101,128, 30,249,245,242,238,229,100,128,  2,142,117,  5,214,
-     41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238,
-     97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107,  2,
-    214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80,
-    232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225,
-    110,128, 49, 96,115,  3,214,108,214,146,214,187,226,233,103,  2,
-    214,116,214,127,227,249,242,233,236,236,233, 99,128,  4,107,233,
-    239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128,
-      4,109,236,233,244,244,236,101,  2,214,157,214,168,227,249,242,
-    233,236,236,233, 99,128,  4,103,233,239,244,233,230,233,229,228,
-    227,249,242,233,236,236,233, 99,128,  4,105,237,225,236,108,  2,
-    214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235,
-    225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230,
-    247,233,228,244,104,128,255,109,249,101,  2,214,239,214,248,235,
-    239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128,
-     49,138,249, 97,  2,215,  9,215, 19,226,229,238,231,225,236,105,
-    128,  9,223,228,229,246, 97,128,  9, 95,122,142,  0,122,215, 58,
-    216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88,
-    218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91,
-    215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27,
-    225,242,237,229,238,233,225,110,128,  5,102,227,245,244,101,128,
-      1,122,228,229,246, 97,128,  9, 91,231,245,242,237,245,235,232,
-    105,128, 10, 91,104,  4,215,126,215,135,215,149,215,179,225,242,
-    225,226,233, 99,128,  6, 56,230,233,238,225,236,225,242,225,226,
-    233, 99,128,254,198,105,  2,215,155,215,170,238,233,244,233,225,
-    236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97,
-    128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128,
-    254,200,233,110,  2,215,201,215,210,225,242,225,226,233, 99,128,
-      6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176,
-    235,225,244,225,235,225,238, 97,128, 48,182,241,229,102,  2,215,
-    243,216,  1,231,225,228,239,236,232,229,226,242,229,119,128,  5,
-    149,241,225,244,225,238,232,229,226,242,229,119,128,  5,148,242,
-    241,225,232,229,226,242,229,119,128,  5,152,249,233,110,130,  5,
-    214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48,
-    232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128,
-      5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99,  3,216,
-     85,216, 92,216,114,225,242,239,110,128,  1,126,233,242, 99,  2,
-    216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128,
-     30,145,245,242,108,128,  2,145,228,239,116,130,  1,124,216,130,
-    216,139,225,227,227,229,238,116,128,  1,124,226,229,236,239,119,
-    128, 30,147,101,  6,216,161,216,172,216,215,216,226,216,237,217,
-    177,227,249,242,233,236,236,233, 99,128,  4, 55,100,  2,216,178,
-    216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236,
-    233, 99,128,  4,153,233,229,242,229,243,233,243,227,249,242,233,
-    236,236,233, 99,128,  4,223,232,233,242,225,231,225,238, 97,128,
-     48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140,
-      0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85,
-    217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99,
-    128,  6, 96,226,229,238,231,225,236,105,128,  9,230,228,229,246,
-     97,128,  9,102,231,117,  2,217, 43,217, 52,234,225,242,225,244,
-    105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227,
-    235,225,242,225,226,233, 99,128,  6, 96,233,238,230,229,242,233,
-    239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255,
-     16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243,
-    233,225,110,128,  6,240,243,245,240,229,242,233,239,114,128, 32,
-    112,244,232,225,105,128, 14, 80,247,233,228,244,104,  3,217,148,
-    217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238,
-    234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32,
-     11,244, 97,128,  3,182,104,  2,217,188,217,199,226,239,240,239,
-    237,239,230,111,128, 49, 19,101,  4,217,209,217,220,217,236,217,
-    247,225,242,237,229,238,233,225,110,128,  5,106,226,242,229,246,
-    229,227,249,242,233,236,236,233, 99,128,  4,194,227,249,242,233,
-    236,236,233, 99,128,  4, 54,100,  2,217,253,218, 16,229,243,227,
-    229,238,228,229,242,227,249,242,233,236,236,233, 99,128,  4,151,
-    233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128,
-      4,221,105,  3,218, 42,218, 53,218, 64,232,233,242,225,231,225,
-    238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184,
-    238,239,242,232,229,226,242,229,119,128,  5,174,236,233,238,229,
-    226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227,
-    101,128,255, 90,111,  2,218,106,218,117,232,233,242,225,231,225,
-    238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190,
-    240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229,
-    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 */
-  ;
-
-
-#ifdef  DEFINE_PS_TABLES
-  /*
-   *  This function searches the compressed table efficiently.
-   */
-  static unsigned long
-  ft_get_adobe_glyph_index( const char*  name,
-                            const char*  limit )
-  {
-    int                   c = 0;
-    int                   count, min, max;
-    const unsigned char*  p = ft_adobe_glyph_list;
-
-
-    if ( name == 0 || name >= limit )
-      goto NotFound;
-
-    c     = *name++;
-    count = p[1];
-    p    += 2;
-
-    min = 0;
-    max = count;
-
-    while ( min < max )
-    {
-      int                   mid = ( min + max ) >> 1;
-      const unsigned char*  q   = p + mid * 2;
-      int                   c2;
-
-
-      q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] );
-
-      c2 = q[0] & 127;
-      if ( c2 == c )
-      {
-        p = q;
-        goto Found;
-      }
-      if ( c2 < c )
-        min = mid + 1;
-      else
-        max = mid;
-    }
-    goto NotFound;
-
-  Found:
-    for (;;)
-    {
-      /* assert (*p & 127) == c */
-
-      if ( name >= limit )
-      {
-        if ( (p[0] & 128) == 0 &&
-             (p[1] & 128) != 0 )
-          return (unsigned long)( ( (int)p[2] << 8 ) | p[3] );
-
-        goto NotFound;
-      }
-      c = *name++;
-      if ( p[0] & 128 )
-      {
-        p++;
-        if ( c != (p[0] & 127) )
-          goto NotFound;
-
-        continue;
-      }
-
-      p++;
-      count = p[0] & 127;
-      if ( p[0] & 128 )
-        p += 2;
-
-      p++;
-
-      for ( ; count > 0; count--, p += 2 )
-      {
-        int                   offset = ( (int)p[0] << 8 ) | p[1];
-        const unsigned char*  q      = ft_adobe_glyph_list + offset;
-
-        if ( c == ( q[0] & 127 ) )
-        {
-          p = q;
-          goto NextIter;
-        }
-      }
-      goto NotFound;
-
-    NextIter:
-      ;
-    }
-
-  NotFound:
-    return 0;
-  }
-#endif /* DEFINE_PS_TABLES */
-
-#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/ftraster.c b/third_party/freetype/src/raster/ftraster.c
deleted file mode 100644
index c5643f6..0000000
--- a/third_party/freetype/src/raster/ftraster.c
+++ /dev/null
@@ -1,3225 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftraster.c                                                             */
-/*                                                                         */
-/*    The FreeType glyph rasterizer (body).                                */
-/*                                                                         */
-/*  Copyright 1996-2017 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 can be compiled without the rest of the FreeType engine, by */
-  /* 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/freetype/ftimage.h' and `src/raster/ftmisc.h' to your */
-  /*   current directory                                                   */
-  /*                                                                       */
-  /* - compile `ftraster' with the STANDALONE_ macro defined, as in        */
-  /*                                                                       */
-  /*     cc -c -DSTANDALONE_ ftraster.c                                    */
-  /*                                                                       */
-  /* The renderer can be initialized with a call to                        */
-  /* `ft_standard_raster.raster_new'; a bitmap can be generated            */
-  /* with a call to `ft_standard_raster.raster_render'.                    */
-  /*                                                                       */
-  /* See the comments and documentation in the file `ftimage.h' for more   */
-  /* details on how the raster works.                                      */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This is a rewrite of the FreeType 1.x scan-line converter             */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef STANDALONE_
-
-  /* The size in bytes of the render pool used by the scan-line converter  */
-  /* to do all of its work.                                                */
-#define FT_RENDER_POOL_SIZE  16384L
-
-#define FT_CONFIG_STANDARD_LIBRARY_H  <stdlib.h>
-
-#include <string.h>           /* for memset */
-
-#include "ftmisc.h"
-#include "ftimage.h"
-
-#else /* !STANDALONE_ */
-
-#include <ft2build.h>
-#include "ftraster.h"
-#include FT_INTERNAL_CALC_H   /* for FT_MulDiv and FT_MulDiv_No_Round */
-
-#include "rastpic.h"
-
-#endif /* !STANDALONE_ */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* A simple technical note on how the raster works                       */
-  /* -----------------------------------------------                       */
-  /*                                                                       */
-  /*   Converting an outline into a bitmap is achieved in several steps:   */
-  /*                                                                       */
-  /*   1 - Decomposing the outline into successive `profiles'.  Each       */
-  /*       profile is simply an array of scanline intersections on a given */
-  /*       dimension.  A profile's main attributes are                     */
-  /*                                                                       */
-  /*       o its scanline position boundaries, i.e. `Ymin' and `Ymax'      */
-  /*                                                                       */
-  /*       o an array of intersection coordinates for each scanline        */
-  /*         between `Ymin' and `Ymax'                                     */
-  /*                                                                       */
-  /*       o a direction, indicating whether it was built going `up' or    */
-  /*         `down', as this is very important for filling rules           */
-  /*                                                                       */
-  /*       o its drop-out mode                                             */
-  /*                                                                       */
-  /*   2 - Sweeping the target map's scanlines in order to compute segment */
-  /*       `spans' which are then filled.  Additionally, this pass         */
-  /*       performs drop-out control.                                      */
-  /*                                                                       */
-  /*   The outline data is parsed during step 1 only.  The profiles are    */
-  /*   built from the bottom of the render pool, used as a stack.  The     */
-  /*   following graphics shows the profile list under construction:       */
-  /*                                                                       */
-  /*     __________________________________________________________ _ _    */
-  /*    |         |                 |         |                 |          */
-  /*    | profile | coordinates for | profile | coordinates for |-->       */
-  /*    |    1    |  profile 1      |    2    |  profile 2      |-->       */
-  /*    |_________|_________________|_________|_________________|__ _ _    */
-  /*                                                                       */
-  /*    ^                                                       ^          */
-  /*    |                                                       |          */
-  /* start of render pool                                      top         */
-  /*                                                                       */
-  /*   The top of the profile stack is kept in the `top' variable.         */
-  /*                                                                       */
-  /*   As you can see, a profile record is pushed on top of the render     */
-  /*   pool, which is then followed by its coordinates/intersections.  If  */
-  /*   a change of direction is detected in the outline, a new profile is  */
-  /*   generated until the end of the outline.                             */
-  /*                                                                       */
-  /*   Note that when all profiles have been generated, the function       */
-  /*   Finalize_Profile_Table() is used to record, for each profile, its   */
-  /*   bottom-most scanline as well as the scanline above its upmost       */
-  /*   boundary.  These positions are called `y-turns' because they (sort  */
-  /*   of) correspond to local extrema.  They are stored in a sorted list  */
-  /*   built from the top of the render pool as a downwards stack:         */
-  /*                                                                       */
-  /*      _ _ _______________________________________                      */
-  /*                            |                    |                     */
-  /*                         <--| sorted list of     |                     */
-  /*                         <--|  extrema scanlines |                     */
-  /*      _ _ __________________|____________________|                     */
-  /*                                                                       */
-  /*                            ^                    ^                     */
-  /*                            |                    |                     */
-  /*                         maxBuff           sizeBuff = end of pool      */
-  /*                                                                       */
-  /*   This list is later used during the sweep phase in order to          */
-  /*   optimize performance (see technical note on the sweep below).       */
-  /*                                                                       */
-  /*   Of course, the raster detects whether the two stacks collide and    */
-  /*   handles the situation properly.                                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /**                                                                     **/
-  /**  CONFIGURATION MACROS                                               **/
-  /**                                                                     **/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* define DEBUG_RASTER if you want to compile a debugging version */
-/* #define DEBUG_RASTER */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /**                                                                     **/
-  /**  OTHER MACROS (do not change)                                       **/
-  /**                                                                     **/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_raster
-
-
-#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 )
-
-  /* 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 */
-  /* ANSI compilers (e.g. LCC).                                          */
-#define FT_UNUSED( x )  (x) = (x)
-
-  /* Disable the tracing mechanism for simplicity -- developers can      */
-  /* activate it easily by redefining these macros.                      */
-#ifndef FT_ERROR
-#define FT_ERROR( x )  do { } while ( 0 )     /* nothing */
-#endif
-
-#ifndef FT_TRACE
-#define FT_TRACE( x )   do { } while ( 0 )    /* nothing */
-#define FT_TRACE1( x )  do { } while ( 0 )    /* nothing */
-#define FT_TRACE6( x )  do { } while ( 0 )    /* nothing */
-#define FT_TRACE7( x )  do { } while ( 0 )    /* nothing */
-#endif
-
-#ifndef FT_THROW
-#define FT_THROW( e )  FT_ERR_CAT( Raster_Err_, e )
-#endif
-
-#define Raster_Err_None          0
-#define Raster_Err_Not_Ini      -1
-#define Raster_Err_Overflow     -2
-#define Raster_Err_Neg_Height   -3
-#define Raster_Err_Invalid      -4
-#define Raster_Err_Unsupported  -5
-
-#define ft_memset  memset
-
-#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \
-                                raster_reset_, raster_set_mode_,    \
-                                raster_render_, raster_done_ )      \
-          const FT_Raster_Funcs class_ =                            \
-          {                                                         \
-            glyph_format_,                                          \
-            raster_new_,                                            \
-            raster_reset_,                                          \
-            raster_set_mode_,                                       \
-            raster_render_,                                         \
-            raster_done_                                            \
-         };
-
-#else /* !STANDALONE_ */
-
-
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H       /* for FT_TRACE, FT_ERROR, and FT_THROW */
-
-#include "rasterrs.h"
-
-#define Raster_Err_None         FT_Err_Ok
-#define Raster_Err_Not_Ini      Raster_Err_Raster_Uninitialized
-#define Raster_Err_Overflow     Raster_Err_Raster_Overflow
-#define Raster_Err_Neg_Height   Raster_Err_Raster_Negative_Height
-#define Raster_Err_Invalid      Raster_Err_Invalid_Outline
-#define Raster_Err_Unsupported  Raster_Err_Cannot_Render_Glyph
-
-
-#endif /* !STANDALONE_ */
-
-
-#ifndef FT_MEM_SET
-#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
-#endif
-
-#ifndef FT_MEM_ZERO
-#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.                                                           */
-#define FMulDiv( a, b, c )  ( (a) * (b) / (c) )
-
-  /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */
-  /* for clipping computations.  It simply uses the FT_MulDiv() function   */
-  /* defined in `ftcalc.h'.                                                */
-#define SMulDiv           FT_MulDiv
-#define SMulDiv_No_Round  FT_MulDiv_No_Round
-
-  /* The rasterizer is a very general purpose component; please leave */
-  /* the following redefinitions there (you never know your target    */
-  /* environment).                                                    */
-
-#ifndef TRUE
-#define TRUE   1
-#endif
-
-#ifndef FALSE
-#define FALSE  0
-#endif
-
-#ifndef NULL
-#define NULL  (void*)0
-#endif
-
-#ifndef SUCCESS
-#define SUCCESS  0
-#endif
-
-#ifndef FAILURE
-#define FAILURE  1
-#endif
-
-
-#define MaxBezier  32   /* The maximum number of stacked Bezier curves. */
-                        /* Setting this constant to more than 32 is a   */
-                        /* pure waste of space.                         */
-
-#define Pixel_Bits  6   /* fractional bits of *input* coordinates */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /**                                                                     **/
-  /**  SIMPLE TYPE DECLARATIONS                                           **/
-  /**                                                                     **/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef int             Int;
-  typedef unsigned int    UInt;
-  typedef short           Short;
-  typedef unsigned short  UShort, *PUShort;
-  typedef long            Long, *PLong;
-  typedef unsigned long   ULong;
-
-  typedef unsigned char   Byte, *PByte;
-  typedef char            Bool;
-
-
-  typedef union  Alignment_
-  {
-    Long    l;
-    void*   p;
-    void  (*f)(void);
-
-  } Alignment, *PAlignment;
-
-
-  typedef struct  TPoint_
-  {
-    Long  x;
-    Long  y;
-
-  } TPoint;
-
-
-  /* values for the `flags' bit field */
-#define Flow_Up           0x08U
-#define Overshoot_Top     0x10U
-#define Overshoot_Bottom  0x20U
-
-
-  /* States of each line, arc, and profile */
-  typedef enum  TStates_
-  {
-    Unknown_State,
-    Ascending_State,
-    Descending_State,
-    Flat_State
-
-  } TStates;
-
-
-  typedef struct TProfile_  TProfile;
-  typedef TProfile*         PProfile;
-
-  struct  TProfile_
-  {
-    FT_F26Dot6  X;           /* current coordinate during sweep          */
-    PProfile    link;        /* link to next profile (various purposes)  */
-    PLong       offset;      /* start of profile's data in render pool   */
-    UShort      flags;       /* Bit 0-2: drop-out mode                   */
-                             /* Bit 3: profile orientation (up/down)     */
-                             /* Bit 4: is top profile?                   */
-                             /* Bit 5: is bottom profile?                */
-    Long        height;      /* profile's height in scanlines            */
-    Long        start;       /* profile's starting scanline              */
-
-    Int         countL;      /* number of lines to step before this      */
-                             /* profile becomes drawable                 */
-
-    PProfile    next;        /* next profile in same contour, used       */
-                             /* during drop-out control                  */
-  };
-
-  typedef PProfile   TProfileList;
-  typedef PProfile*  PProfileList;
-
-
-  /* Simple record used to implement a stack of bands, required */
-  /* by the sub-banding mechanism                               */
-  typedef struct  black_TBand_
-  {
-    Short  y_min;   /* band's minimum */
-    Short  y_max;   /* band's maximum */
-
-  } black_TBand;
-
-
-#define AlignProfileSize \
-  ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( Long ) )
-
-
-#undef RAS_ARG
-#undef RAS_ARGS
-#undef RAS_VAR
-#undef RAS_VARS
-
-#ifdef FT_STATIC_RASTER
-
-
-#define RAS_ARGS       /* void */
-#define RAS_ARG        /* void */
-
-#define RAS_VARS       /* void */
-#define RAS_VAR        /* void */
-
-#define FT_UNUSED_RASTER  do { } while ( 0 )
-
-
-#else /* !FT_STATIC_RASTER */
-
-
-#define RAS_ARGS       black_PWorker  worker,
-#define RAS_ARG        black_PWorker  worker
-
-#define RAS_VARS       worker,
-#define RAS_VAR        worker
-
-#define FT_UNUSED_RASTER  FT_UNUSED( worker )
-
-
-#endif /* !FT_STATIC_RASTER */
-
-
-  typedef struct black_TWorker_  black_TWorker, *black_PWorker;
-
-
-  /* prototypes used for sweep function dispatch */
-  typedef void
-  Function_Sweep_Init( RAS_ARGS Short*  min,
-                                Short*  max );
-
-  typedef void
-  Function_Sweep_Span( RAS_ARGS Short       y,
-                                FT_F26Dot6  x1,
-                                FT_F26Dot6  x2,
-                                PProfile    left,
-                                PProfile    right );
-
-  typedef void
-  Function_Sweep_Step( RAS_ARG );
-
-
-  /* NOTE: These operations are only valid on 2's complement processors */
-#undef FLOOR
-#undef CEILING
-#undef TRUNC
-#undef SCALED
-
-#define FLOOR( x )    ( (x) & -ras.precision )
-#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 )   ( ( (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.                                                 */
-
-  struct  black_TWorker_
-  {
-    Int         precision_bits;     /* precision related variables         */
-    Int         precision;
-    Int         precision_half;
-    Int         precision_shift;
-    Int         precision_step;
-    Int         precision_jitter;
-
-    Int         scale_shift;        /* == precision_shift   for bitmaps    */
-                                    /* == precision_shift+1 for pixmaps    */
-
-    PLong       buff;               /* The profiles buffer                 */
-    PLong       sizeBuff;           /* Render pool size                    */
-    PLong       maxBuff;            /* Profiles buffer size                */
-    PLong       top;                /* Current cursor in buffer            */
-
-    FT_Error    error;
-
-    Int         numTurns;           /* number of Y-turns in outline        */
-
-    TPoint*     arc;                /* current Bezier arc pointer          */
-
-    UShort      bWidth;             /* target bitmap width                 */
-    PByte       bTarget;            /* target bitmap buffer                */
-    PByte       gTarget;            /* target pixmap buffer                */
-
-    Long        lastX, lastY;
-    Long        minY, maxY;
-
-    UShort      num_Profs;          /* current number of profiles          */
-
-    Bool        fresh;              /* signals a fresh new profile which   */
-                                    /* `start' field must be completed     */
-    Bool        joint;              /* signals that the last arc ended     */
-                                    /* exactly on a scanline.  Allows      */
-                                    /* removal of doublets                 */
-    PProfile    cProfile;           /* current profile                     */
-    PProfile    fProfile;           /* head of linked list of profiles     */
-    PProfile    gProfile;           /* contour's first profile in case     */
-                                    /* of impact                           */
-
-    TStates     state;              /* rendering state                     */
-
-    FT_Bitmap   target;             /* description of target bit/pixmap    */
-    FT_Outline  outline;
-
-    Long        traceOfs;           /* current offset in target bitmap     */
-    Long        traceG;             /* current offset in target pixmap     */
-
-    Short       traceIncr;          /* sweep's increment in target bitmap  */
-
-    /* dispatch variables */
-
-    Function_Sweep_Init*  Proc_Sweep_Init;
-    Function_Sweep_Span*  Proc_Sweep_Span;
-    Function_Sweep_Span*  Proc_Sweep_Drop;
-    Function_Sweep_Step*  Proc_Sweep_Step;
-
-    Byte        dropOutControl;     /* current drop_out control method     */
-
-    Bool        second_pass;        /* indicates whether a horizontal pass */
-                                    /* should be performed to control      */
-                                    /* drop-out accurately when calling    */
-                                    /* Render_Glyph.                       */
-
-    TPoint      arcs[3 * MaxBezier + 1]; /* The Bezier stack               */
-
-    black_TBand  band_stack[16];    /* band stack used for sub-banding     */
-    Int          band_top;          /* band stack top                      */
-
-  };
-
-
-  typedef struct  black_TRaster_
-  {
-    void*          memory;
-
-  } black_TRaster, *black_PRaster;
-
-#ifdef FT_STATIC_RASTER
-
-  static black_TWorker  cur_ras;
-#define ras  cur_ras
-
-#else /* !FT_STATIC_RASTER */
-
-#define ras  (*worker)
-
-#endif /* !FT_STATIC_RASTER */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /**                                                                     **/
-  /**  PROFILES COMPUTATION                                               **/
-  /**                                                                     **/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Set_High_Precision                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Set precision variables according to param flag.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    High :: Set to True for high precision (typically for ppem < 24),  */
-  /*            false otherwise.                                           */
-  /*                                                                       */
-  static void
-  Set_High_Precision( RAS_ARGS Int  High )
-  {
-    /*
-     * `precision_step' is used in `Bezier_Up' to decide when to split a
-     * given y-monotonous Bezier arc that crosses a scanline before
-     * approximating it as a straight segment.  The default value of 32 (for
-     * low accuracy) corresponds to
-     *
-     *   32 / 64 == 0.5 pixels,
-     *
-     * while for the high accuracy case we have
-     *
-     *   256 / (1 << 12) = 0.0625 pixels.
-     *
-     * `precision_jitter' is an epsilon threshold used in
-     * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier
-     * decomposition (after all, we are working with approximations only);
-     * it avoids switching on additional pixels which would cause artifacts
-     * otherwise.
-     *
-     * The value of `precision_jitter' has been determined heuristically.
-     *
-     */
-
-    if ( High )
-    {
-      ras.precision_bits   = 12;
-      ras.precision_step   = 256;
-      ras.precision_jitter = 30;
-    }
-    else
-    {
-      ras.precision_bits   = 6;
-      ras.precision_step   = 32;
-      ras.precision_jitter = 2;
-    }
-
-    FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
-
-    ras.precision       = 1 << ras.precision_bits;
-    ras.precision_half  = ras.precision / 2;
-    ras.precision_shift = ras.precision_bits - Pixel_Bits;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    New_Profile                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new profile in the render pool.                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    aState    :: The state/orientation of the new profile.             */
-  /*                                                                       */
-  /*    overshoot :: Whether the profile's unrounded start position        */
-  /*                 differs by at least a half pixel.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*   SUCCESS on success.  FAILURE in case of overflow or of incoherent   */
-  /*   profile.                                                            */
-  /*                                                                       */
-  static Bool
-  New_Profile( RAS_ARGS TStates  aState,
-                        Bool     overshoot )
-  {
-    if ( !ras.fProfile )
-    {
-      ras.cProfile  = (PProfile)ras.top;
-      ras.fProfile  = ras.cProfile;
-      ras.top      += AlignProfileSize;
-    }
-
-    if ( ras.top >= ras.maxBuff )
-    {
-      ras.error = FT_THROW( Overflow );
-      return FAILURE;
-    }
-
-    ras.cProfile->flags  = 0;
-    ras.cProfile->start  = 0;
-    ras.cProfile->height = 0;
-    ras.cProfile->offset = ras.top;
-    ras.cProfile->link   = (PProfile)0;
-    ras.cProfile->next   = (PProfile)0;
-    ras.cProfile->flags  = ras.dropOutControl;
-
-    switch ( aState )
-    {
-    case Ascending_State:
-      ras.cProfile->flags |= Flow_Up;
-      if ( overshoot )
-        ras.cProfile->flags |= Overshoot_Bottom;
-
-      FT_TRACE6(( "  new ascending profile = %p\n", ras.cProfile ));
-      break;
-
-    case Descending_State:
-      if ( overshoot )
-        ras.cProfile->flags |= Overshoot_Top;
-      FT_TRACE6(( "  new descending profile = %p\n", ras.cProfile ));
-      break;
-
-    default:
-      FT_ERROR(( "New_Profile: invalid profile direction\n" ));
-      ras.error = FT_THROW( Invalid );
-      return FAILURE;
-    }
-
-    if ( !ras.gProfile )
-      ras.gProfile = ras.cProfile;
-
-    ras.state = aState;
-    ras.fresh = TRUE;
-    ras.joint = FALSE;
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    End_Profile                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalize the current profile.                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    overshoot :: Whether the profile's unrounded end position differs  */
-  /*                 by at least a half pixel.                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success.  FAILURE in case of overflow or incoherency.   */
-  /*                                                                       */
-  static Bool
-  End_Profile( RAS_ARGS Bool  overshoot )
-  {
-    Long  h;
-
-
-    h = (Long)( ras.top - ras.cProfile->offset );
-
-    if ( h < 0 )
-    {
-      FT_ERROR(( "End_Profile: negative height encountered\n" ));
-      ras.error = FT_THROW( Neg_Height );
-      return FAILURE;
-    }
-
-    if ( h > 0 )
-    {
-      PProfile  oldProfile;
-
-
-      FT_TRACE6(( "  ending profile %p, start = %ld, height = %ld\n",
-                  ras.cProfile, ras.cProfile->start, h ));
-
-      ras.cProfile->height = h;
-      if ( overshoot )
-      {
-        if ( ras.cProfile->flags & Flow_Up )
-          ras.cProfile->flags |= Overshoot_Top;
-        else
-          ras.cProfile->flags |= Overshoot_Bottom;
-      }
-
-      oldProfile   = ras.cProfile;
-      ras.cProfile = (PProfile)ras.top;
-
-      ras.top += AlignProfileSize;
-
-      ras.cProfile->height = 0;
-      ras.cProfile->offset = ras.top;
-
-      oldProfile->next = ras.cProfile;
-      ras.num_Profs++;
-    }
-
-    if ( ras.top >= ras.maxBuff )
-    {
-      FT_TRACE1(( "overflow in End_Profile\n" ));
-      ras.error = FT_THROW( Overflow );
-      return FAILURE;
-    }
-
-    ras.joint = FALSE;
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Insert_Y_Turn                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Insert a salient into the sorted list placed on top of the render  */
-  /*    pool.                                                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    New y scanline position.                                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
-  /*                                                                       */
-  static Bool
-  Insert_Y_Turn( RAS_ARGS Int  y )
-  {
-    PLong  y_turns;
-    Int    n;
-
-
-    n       = ras.numTurns - 1;
-    y_turns = ras.sizeBuff - ras.numTurns;
-
-    /* look for first y value that is <= */
-    while ( n >= 0 && y < y_turns[n] )
-      n--;
-
-    /* if it is <, simply insert it, ignore if == */
-    if ( n >= 0 && y > y_turns[n] )
-      do
-      {
-        Int  y2 = (Int)y_turns[n];
-
-
-        y_turns[n] = y;
-        y = y2;
-      } while ( --n >= 0 );
-
-    if ( n < 0 )
-    {
-      ras.maxBuff--;
-      if ( ras.maxBuff <= ras.top )
-      {
-        ras.error = FT_THROW( Overflow );
-        return FAILURE;
-      }
-      ras.numTurns++;
-      ras.sizeBuff[-ras.numTurns] = y;
-    }
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Finalize_Profile_Table                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Adjust all links in the profiles list.                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success.  FAILURE in case of overflow.                  */
-  /*                                                                       */
-  static Bool
-  Finalize_Profile_Table( RAS_ARG )
-  {
-    UShort    n;
-    PProfile  p;
-
-
-    n = ras.num_Profs;
-    p = ras.fProfile;
-
-    if ( n > 1 && p )
-    {
-      do
-      {
-        Int  bottom, top;
-
-
-        if ( n > 1 )
-          p->link = (PProfile)( p->offset + p->height );
-        else
-          p->link = NULL;
-
-        if ( p->flags & Flow_Up )
-        {
-          bottom = (Int)p->start;
-          top    = (Int)( p->start + p->height - 1 );
-        }
-        else
-        {
-          bottom     = (Int)( p->start - p->height + 1 );
-          top        = (Int)p->start;
-          p->start   = bottom;
-          p->offset += p->height - 1;
-        }
-
-        if ( Insert_Y_Turn( RAS_VARS bottom )  ||
-             Insert_Y_Turn( RAS_VARS top + 1 ) )
-          return FAILURE;
-
-        p = p->link;
-      } while ( --n );
-    }
-    else
-      ras.fProfile = NULL;
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Split_Conic                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Subdivide one conic Bezier into two joint sub-arcs in the Bezier   */
-  /*    stack.                                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    None (subdivided Bezier is taken from the top of the stack).       */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This routine is the `beef' of this component.  It is  _the_ inner  */
-  /*    loop that should be optimized to hell to get the best performance. */
-  /*                                                                       */
-  static void
-  Split_Conic( TPoint*  base )
-  {
-    Long  a, b;
-
-
-    base[4].x = base[2].x;
-    b = base[1].x;
-    a = base[3].x = ( base[2].x + b ) / 2;
-    b = base[1].x = ( base[0].x + b ) / 2;
-    base[2].x = ( a + b ) / 2;
-
-    base[4].y = base[2].y;
-    b = base[1].y;
-    a = base[3].y = ( base[2].y + b ) / 2;
-    b = base[1].y = ( base[0].y + b ) / 2;
-    base[2].y = ( a + b ) / 2;
-
-    /* hand optimized.  gcc doesn't seem to be too good at common      */
-    /* expression substitution and instruction scheduling ;-)          */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Split_Cubic                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Subdivide a third-order Bezier arc into two joint sub-arcs in the  */
-  /*    Bezier stack.                                                      */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This routine is the `beef' of the component.  It is one of _the_   */
-  /*    inner loops that should be optimized like hell to get the best     */
-  /*    performance.                                                       */
-  /*                                                                       */
-  static void
-  Split_Cubic( TPoint*  base )
-  {
-    Long  a, b, c, d;
-
-
-    base[6].x = base[3].x;
-    c = base[1].x;
-    d = base[2].x;
-    base[1].x = a = ( base[0].x + c + 1 ) >> 1;
-    base[5].x = b = ( base[3].x + d + 1 ) >> 1;
-    c = ( c + d + 1 ) >> 1;
-    base[2].x = a = ( a + c + 1 ) >> 1;
-    base[4].x = b = ( b + c + 1 ) >> 1;
-    base[3].x = ( a + b + 1 ) >> 1;
-
-    base[6].y = base[3].y;
-    c = base[1].y;
-    d = base[2].y;
-    base[1].y = a = ( base[0].y + c + 1 ) >> 1;
-    base[5].y = b = ( base[3].y + d + 1 ) >> 1;
-    c = ( c + d + 1 ) >> 1;
-    base[2].y = a = ( a + c + 1 ) >> 1;
-    base[4].y = b = ( b + c + 1 ) >> 1;
-    base[3].y = ( a + b + 1 ) >> 1;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Line_Up                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Compute the x-coordinates of an ascending line segment and store   */
-  /*    them in the render pool.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    x1   :: The x-coordinate of the segment's start point.             */
-  /*                                                                       */
-  /*    y1   :: The y-coordinate of the segment's start point.             */
-  /*                                                                       */
-  /*    x2   :: The x-coordinate of the segment's end point.               */
-  /*                                                                       */
-  /*    y2   :: The y-coordinate of the segment's end point.               */
-  /*                                                                       */
-  /*    miny :: A lower vertical clipping bound value.                     */
-  /*                                                                       */
-  /*    maxy :: An upper vertical clipping bound value.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE on render pool overflow.               */
-  /*                                                                       */
-  static Bool
-  Line_Up( RAS_ARGS Long  x1,
-                    Long  y1,
-                    Long  x2,
-                    Long  y2,
-                    Long  miny,
-                    Long  maxy )
-  {
-    Long   Dx, Dy;
-    Int    e1, e2, f1, f2, size;     /* XXX: is `Short' sufficient? */
-    Long   Ix, Rx, Ax;
-
-    PLong  top;
-
-
-    Dx = x2 - x1;
-    Dy = y2 - y1;
-
-    if ( Dy <= 0 || y2 < miny || y1 > maxy )
-      return SUCCESS;
-
-    if ( y1 < miny )
-    {
-      /* Take care: miny-y1 can be a very large value; we use     */
-      /*            a slow MulDiv function to avoid clipping bugs */
-      x1 += SMulDiv( Dx, miny - y1, Dy );
-      e1  = (Int)TRUNC( miny );
-      f1  = 0;
-    }
-    else
-    {
-      e1 = (Int)TRUNC( y1 );
-      f1 = (Int)FRAC( y1 );
-    }
-
-    if ( y2 > maxy )
-    {
-      /* x2 += FMulDiv( Dx, maxy - y2, Dy );  UNNECESSARY */
-      e2  = (Int)TRUNC( maxy );
-      f2  = 0;
-    }
-    else
-    {
-      e2 = (Int)TRUNC( y2 );
-      f2 = (Int)FRAC( y2 );
-    }
-
-    if ( f1 > 0 )
-    {
-      if ( e1 == e2 )
-        return SUCCESS;
-      else
-      {
-        x1 += SMulDiv( Dx, ras.precision - f1, Dy );
-        e1 += 1;
-      }
-    }
-    else
-      if ( ras.joint )
-      {
-        ras.top--;
-        ras.joint = FALSE;
-      }
-
-    ras.joint = (char)( f2 == 0 );
-
-    if ( ras.fresh )
-    {
-      ras.cProfile->start = e1;
-      ras.fresh           = FALSE;
-    }
-
-    size = e2 - e1 + 1;
-    if ( ras.top + size >= ras.maxBuff )
-    {
-      ras.error = FT_THROW( Overflow );
-      return FAILURE;
-    }
-
-    if ( Dx > 0 )
-    {
-      Ix = SMulDiv_No_Round( ras.precision, Dx, Dy );
-      Rx = ( ras.precision * Dx ) % Dy;
-      Dx = 1;
-    }
-    else
-    {
-      Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy );
-      Rx = ( ras.precision * -Dx ) % Dy;
-      Dx = -1;
-    }
-
-    Ax  = -Dy;
-    top = ras.top;
-
-    while ( size > 0 )
-    {
-      *top++ = x1;
-
-      x1 += Ix;
-      Ax += Rx;
-      if ( Ax >= 0 )
-      {
-        Ax -= Dy;
-        x1 += Dx;
-      }
-      size--;
-    }
-
-    ras.top = top;
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Line_Down                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Compute the x-coordinates of an descending line segment and store  */
-  /*    them in the render pool.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    x1   :: The x-coordinate of the segment's start point.             */
-  /*                                                                       */
-  /*    y1   :: The y-coordinate of the segment's start point.             */
-  /*                                                                       */
-  /*    x2   :: The x-coordinate of the segment's end point.               */
-  /*                                                                       */
-  /*    y2   :: The y-coordinate of the segment's end point.               */
-  /*                                                                       */
-  /*    miny :: A lower vertical clipping bound value.                     */
-  /*                                                                       */
-  /*    maxy :: An upper vertical clipping bound value.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE on render pool overflow.               */
-  /*                                                                       */
-  static Bool
-  Line_Down( RAS_ARGS Long  x1,
-                      Long  y1,
-                      Long  x2,
-                      Long  y2,
-                      Long  miny,
-                      Long  maxy )
-  {
-    Bool  result, fresh;
-
-
-    fresh  = ras.fresh;
-
-    result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
-
-    if ( fresh && !ras.fresh )
-      ras.cProfile->start = -ras.cProfile->start;
-
-    return result;
-  }
-
-
-  /* A function type describing the functions used to split Bezier arcs */
-  typedef void  (*TSplitter)( TPoint*  base );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Bezier_Up                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Compute the x-coordinates of an ascending Bezier arc and store     */
-  /*    them in the render pool.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
-  /*                                                                       */
-  /*    splitter :: The function to split Bezier arcs.                     */
-  /*                                                                       */
-  /*    miny     :: A lower vertical clipping bound value.                 */
-  /*                                                                       */
-  /*    maxy     :: An upper vertical clipping bound value.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE on render pool overflow.               */
-  /*                                                                       */
-  static Bool
-  Bezier_Up( RAS_ARGS Int        degree,
-                      TSplitter  splitter,
-                      Long       miny,
-                      Long       maxy )
-  {
-    Long   y1, y2, e, e2, e0;
-    Short  f1;
-
-    TPoint*  arc;
-    TPoint*  start_arc;
-
-    PLong top;
-
-
-    arc = ras.arc;
-    y1  = arc[degree].y;
-    y2  = arc[0].y;
-    top = ras.top;
-
-    if ( y2 < miny || y1 > maxy )
-      goto Fin;
-
-    e2 = FLOOR( y2 );
-
-    if ( e2 > maxy )
-      e2 = maxy;
-
-    e0 = miny;
-
-    if ( y1 < miny )
-      e = miny;
-    else
-    {
-      e  = CEILING( y1 );
-      f1 = (Short)( FRAC( y1 ) );
-      e0 = e;
-
-      if ( f1 == 0 )
-      {
-        if ( ras.joint )
-        {
-          top--;
-          ras.joint = FALSE;
-        }
-
-        *top++ = arc[degree].x;
-
-        e += ras.precision;
-      }
-    }
-
-    if ( ras.fresh )
-    {
-      ras.cProfile->start = TRUNC( e0 );
-      ras.fresh = FALSE;
-    }
-
-    if ( e2 < e )
-      goto Fin;
-
-    if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
-    {
-      ras.top   = top;
-      ras.error = FT_THROW( Overflow );
-      return FAILURE;
-    }
-
-    start_arc = arc;
-
-    do
-    {
-      ras.joint = FALSE;
-
-      y2 = arc[0].y;
-
-      if ( y2 > e )
-      {
-        y1 = arc[degree].y;
-        if ( y2 - y1 >= ras.precision_step )
-        {
-          splitter( arc );
-          arc += degree;
-        }
-        else
-        {
-          *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x,
-                                            e - y1, y2 - y1 );
-          arc -= degree;
-          e   += ras.precision;
-        }
-      }
-      else
-      {
-        if ( y2 == e )
-        {
-          ras.joint  = TRUE;
-          *top++     = arc[0].x;
-
-          e += ras.precision;
-        }
-        arc -= degree;
-      }
-    } while ( arc >= start_arc && e <= e2 );
-
-  Fin:
-    ras.top  = top;
-    ras.arc -= degree;
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Bezier_Down                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Compute the x-coordinates of an descending Bezier arc and store    */
-  /*    them in the render pool.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    degree   :: The degree of the Bezier arc (either 2 or 3).          */
-  /*                                                                       */
-  /*    splitter :: The function to split Bezier arcs.                     */
-  /*                                                                       */
-  /*    miny     :: A lower vertical clipping bound value.                 */
-  /*                                                                       */
-  /*    maxy     :: An upper vertical clipping bound value.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE on render pool overflow.               */
-  /*                                                                       */
-  static Bool
-  Bezier_Down( RAS_ARGS Int        degree,
-                        TSplitter  splitter,
-                        Long       miny,
-                        Long       maxy )
-  {
-    TPoint*  arc = ras.arc;
-    Bool     result, fresh;
-
-
-    arc[0].y = -arc[0].y;
-    arc[1].y = -arc[1].y;
-    arc[2].y = -arc[2].y;
-    if ( degree > 2 )
-      arc[3].y = -arc[3].y;
-
-    fresh = ras.fresh;
-
-    result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny );
-
-    if ( fresh && !ras.fresh )
-      ras.cProfile->start = -ras.cProfile->start;
-
-    arc[0].y = -arc[0].y;
-    return result;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Line_To                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Inject a new line segment and adjust the Profiles list.            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*   x :: The x-coordinate of the segment's end point (its start point   */
-  /*        is stored in `lastX').                                         */
-  /*                                                                       */
-  /*   y :: The y-coordinate of the segment's end point (its start point   */
-  /*        is stored in `lastY').                                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
-  /*   profile.                                                            */
-  /*                                                                       */
-  static Bool
-  Line_To( RAS_ARGS Long  x,
-                    Long  y )
-  {
-    /* First, detect a change of direction */
-
-    switch ( ras.state )
-    {
-    case Unknown_State:
-      if ( y > ras.lastY )
-      {
-        if ( New_Profile( RAS_VARS Ascending_State,
-                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
-          return FAILURE;
-      }
-      else
-      {
-        if ( y < ras.lastY )
-          if ( New_Profile( RAS_VARS Descending_State,
-                                     IS_TOP_OVERSHOOT( ras.lastY ) ) )
-            return FAILURE;
-      }
-      break;
-
-    case Ascending_State:
-      if ( y < ras.lastY )
-      {
-        if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) ||
-             New_Profile( RAS_VARS Descending_State,
-                                   IS_TOP_OVERSHOOT( ras.lastY ) ) )
-          return FAILURE;
-      }
-      break;
-
-    case Descending_State:
-      if ( y > ras.lastY )
-      {
-        if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ||
-             New_Profile( RAS_VARS Ascending_State,
-                                   IS_BOTTOM_OVERSHOOT( ras.lastY ) ) )
-          return FAILURE;
-      }
-      break;
-
-    default:
-      ;
-    }
-
-    /* Then compute the lines */
-
-    switch ( ras.state )
-    {
-    case Ascending_State:
-      if ( Line_Up( RAS_VARS ras.lastX, ras.lastY,
-                             x, y, ras.minY, ras.maxY ) )
-        return FAILURE;
-      break;
-
-    case Descending_State:
-      if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
-                               x, y, ras.minY, ras.maxY ) )
-        return FAILURE;
-      break;
-
-    default:
-      ;
-    }
-
-    ras.lastX = x;
-    ras.lastY = y;
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Conic_To                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Inject a new conic arc and adjust the profile list.                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*   cx :: The x-coordinate of the arc's new control point.              */
-  /*                                                                       */
-  /*   cy :: The y-coordinate of the arc's new control point.              */
-  /*                                                                       */
-  /*   x  :: The x-coordinate of the arc's end point (its start point is   */
-  /*         stored in `lastX').                                           */
-  /*                                                                       */
-  /*   y  :: The y-coordinate of the arc's end point (its start point is   */
-  /*         stored in `lastY').                                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
-  /*   profile.                                                            */
-  /*                                                                       */
-  static Bool
-  Conic_To( RAS_ARGS Long  cx,
-                     Long  cy,
-                     Long  x,
-                     Long  y )
-  {
-    Long     y1, y2, y3, x3, ymin, ymax;
-    TStates  state_bez;
-
-
-    ras.arc      = ras.arcs;
-    ras.arc[2].x = ras.lastX;
-    ras.arc[2].y = ras.lastY;
-    ras.arc[1].x = cx;
-    ras.arc[1].y = cy;
-    ras.arc[0].x = x;
-    ras.arc[0].y = y;
-
-    do
-    {
-      y1 = ras.arc[2].y;
-      y2 = ras.arc[1].y;
-      y3 = ras.arc[0].y;
-      x3 = ras.arc[0].x;
-
-      /* first, categorize the Bezier arc */
-
-      if ( y1 <= y3 )
-      {
-        ymin = y1;
-        ymax = y3;
-      }
-      else
-      {
-        ymin = y3;
-        ymax = y1;
-      }
-
-      if ( y2 < ymin || y2 > ymax )
-      {
-        /* this arc has no given direction, split it! */
-        Split_Conic( ras.arc );
-        ras.arc += 2;
-      }
-      else if ( y1 == y3 )
-      {
-        /* this arc is flat, ignore it and pop it from the Bezier stack */
-        ras.arc -= 2;
-      }
-      else
-      {
-        /* the arc is y-monotonous, either ascending or descending */
-        /* detect a change of direction                            */
-        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 );
-
-
-          /* finalize current profile if any */
-          if ( ras.state != Unknown_State &&
-               End_Profile( RAS_VARS o )  )
-            goto Fail;
-
-          /* create a new profile */
-          if ( New_Profile( RAS_VARS state_bez, o ) )
-            goto Fail;
-        }
-
-        /* now call the appropriate routine */
-        if ( state_bez == Ascending_State )
-        {
-          if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
-            goto Fail;
-        }
-        else
-          if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) )
-            goto Fail;
-      }
-
-    } while ( ras.arc >= ras.arcs );
-
-    ras.lastX = x3;
-    ras.lastY = y3;
-
-    return SUCCESS;
-
-  Fail:
-    return FAILURE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Cubic_To                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Inject a new cubic arc and adjust the profile list.                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*   cx1 :: The x-coordinate of the arc's first new control point.       */
-  /*                                                                       */
-  /*   cy1 :: The y-coordinate of the arc's first new control point.       */
-  /*                                                                       */
-  /*   cx2 :: The x-coordinate of the arc's second new control point.      */
-  /*                                                                       */
-  /*   cy2 :: The y-coordinate of the arc's second new control point.      */
-  /*                                                                       */
-  /*   x   :: The x-coordinate of the arc's end point (its start point is  */
-  /*          stored in `lastX').                                          */
-  /*                                                                       */
-  /*   y   :: The y-coordinate of the arc's end point (its start point is  */
-  /*          stored in `lastY').                                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*   SUCCESS on success, FAILURE on render pool overflow or incorrect    */
-  /*   profile.                                                            */
-  /*                                                                       */
-  static Bool
-  Cubic_To( RAS_ARGS Long  cx1,
-                     Long  cy1,
-                     Long  cx2,
-                     Long  cy2,
-                     Long  x,
-                     Long  y )
-  {
-    Long     y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2;
-    TStates  state_bez;
-
-
-    ras.arc      = ras.arcs;
-    ras.arc[3].x = ras.lastX;
-    ras.arc[3].y = ras.lastY;
-    ras.arc[2].x = cx1;
-    ras.arc[2].y = cy1;
-    ras.arc[1].x = cx2;
-    ras.arc[1].y = cy2;
-    ras.arc[0].x = x;
-    ras.arc[0].y = y;
-
-    do
-    {
-      y1 = ras.arc[3].y;
-      y2 = ras.arc[2].y;
-      y3 = ras.arc[1].y;
-      y4 = ras.arc[0].y;
-      x4 = ras.arc[0].x;
-
-      /* first, categorize the Bezier arc */
-
-      if ( y1 <= y4 )
-      {
-        ymin1 = y1;
-        ymax1 = y4;
-      }
-      else
-      {
-        ymin1 = y4;
-        ymax1 = y1;
-      }
-
-      if ( y2 <= y3 )
-      {
-        ymin2 = y2;
-        ymax2 = y3;
-      }
-      else
-      {
-        ymin2 = y3;
-        ymax2 = y2;
-      }
-
-      if ( ymin2 < ymin1 || ymax2 > ymax1 )
-      {
-        /* this arc has no given direction, split it! */
-        Split_Cubic( ras.arc );
-        ras.arc += 3;
-      }
-      else if ( y1 == y4 )
-      {
-        /* this arc is flat, ignore it and pop it from the Bezier stack */
-        ras.arc -= 3;
-      }
-      else
-      {
-        state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State;
-
-        /* detect a change of direction */
-        if ( ras.state != state_bez )
-        {
-          Bool  o = ( state_bez == Ascending_State )
-                      ? IS_BOTTOM_OVERSHOOT( y1 )
-                      : IS_TOP_OVERSHOOT( y1 );
-
-
-          /* finalize current profile if any */
-          if ( ras.state != Unknown_State &&
-               End_Profile( RAS_VARS o )  )
-            goto Fail;
-
-          if ( New_Profile( RAS_VARS state_bez, o ) )
-            goto Fail;
-        }
-
-        /* compute intersections */
-        if ( state_bez == Ascending_State )
-        {
-          if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
-            goto Fail;
-        }
-        else
-          if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) )
-            goto Fail;
-      }
-
-    } while ( ras.arc >= ras.arcs );
-
-    ras.lastX = x4;
-    ras.lastY = y4;
-
-    return SUCCESS;
-
-  Fail:
-    return FAILURE;
-  }
-
-
-#undef  SWAP_
-#define SWAP_( x, y )  do                \
-                       {                 \
-                         Long  swap = x; \
-                                         \
-                                         \
-                         x = y;          \
-                         y = swap;       \
-                       } while ( 0 )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Decompose_Curve                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Scan the outline arrays in order to emit individual segments and   */
-  /*    Beziers by calling Line_To() and Bezier_To().  It handles all      */
-  /*    weird cases, like when the first point is off the curve, or when   */
-  /*    there are simply no `on' points in the contour!                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    first   :: The index of the first point in the contour.            */
-  /*                                                                       */
-  /*    last    :: The index of the last point in the contour.             */
-  /*                                                                       */
-  /*    flipped :: If set, flip the direction of the curve.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE on error.                              */
-  /*                                                                       */
-  static Bool
-  Decompose_Curve( RAS_ARGS UShort  first,
-                            UShort  last,
-                            Int     flipped )
-  {
-    FT_Vector   v_last;
-    FT_Vector   v_control;
-    FT_Vector   v_start;
-
-    FT_Vector*  points;
-    FT_Vector*  point;
-    FT_Vector*  limit;
-    char*       tags;
-
-    UInt        tag;       /* current point's state           */
-
-
-    points = ras.outline.points;
-    limit  = points + last;
-
-    v_start.x = SCALED( points[first].x );
-    v_start.y = SCALED( points[first].y );
-    v_last.x  = SCALED( points[last].x );
-    v_last.y  = SCALED( points[last].y );
-
-    if ( flipped )
-    {
-      SWAP_( v_start.x, v_start.y );
-      SWAP_( v_last.x, v_last.y );
-    }
-
-    v_control = v_start;
-
-    point = points + first;
-    tags  = ras.outline.tags + first;
-
-    /* set scan mode if necessary */
-    if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE )
-      ras.dropOutControl = (Byte)tags[0] >> 5;
-
-    tag = FT_CURVE_TAG( tags[0] );
-
-    /* A contour cannot start with a cubic control point! */
-    if ( tag == FT_CURVE_TAG_CUBIC )
-      goto Invalid_Outline;
-
-    /* check first point to determine origin */
-    if ( tag == FT_CURVE_TAG_CONIC )
-    {
-      /* first point is conic control.  Yes, this happens. */
-      if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON )
-      {
-        /* start at last point if it is on the curve */
-        v_start = v_last;
-        limit--;
-      }
-      else
-      {
-        /* if both first and last points are conic,         */
-        /* start at their middle and record its position    */
-        /* for closure                                      */
-        v_start.x = ( v_start.x + v_last.x ) / 2;
-        v_start.y = ( v_start.y + v_last.y ) / 2;
-
-     /* v_last = v_start; */
-      }
-      point--;
-      tags--;
-    }
-
-    ras.lastX = v_start.x;
-    ras.lastY = v_start.y;
-
-    while ( point < limit )
-    {
-      point++;
-      tags++;
-
-      tag = FT_CURVE_TAG( tags[0] );
-
-      switch ( tag )
-      {
-      case FT_CURVE_TAG_ON:  /* emit a single line_to */
-        {
-          Long  x, y;
-
-
-          x = SCALED( point->x );
-          y = SCALED( point->y );
-          if ( flipped )
-            SWAP_( x, y );
-
-          if ( Line_To( RAS_VARS x, y ) )
-            goto Fail;
-          continue;
-        }
-
-      case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
-        v_control.x = SCALED( point[0].x );
-        v_control.y = SCALED( point[0].y );
-
-        if ( flipped )
-          SWAP_( v_control.x, v_control.y );
-
-      Do_Conic:
-        if ( point < limit )
-        {
-          FT_Vector  v_middle;
-          Long       x, y;
-
-
-          point++;
-          tags++;
-          tag = FT_CURVE_TAG( tags[0] );
-
-          x = SCALED( point[0].x );
-          y = SCALED( point[0].y );
-
-          if ( flipped )
-            SWAP_( x, y );
-
-          if ( tag == FT_CURVE_TAG_ON )
-          {
-            if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) )
-              goto Fail;
-            continue;
-          }
-
-          if ( tag != FT_CURVE_TAG_CONIC )
-            goto Invalid_Outline;
-
-          v_middle.x = ( v_control.x + x ) / 2;
-          v_middle.y = ( v_control.y + y ) / 2;
-
-          if ( Conic_To( RAS_VARS v_control.x, v_control.y,
-                                  v_middle.x,  v_middle.y ) )
-            goto Fail;
-
-          v_control.x = x;
-          v_control.y = y;
-
-          goto Do_Conic;
-        }
-
-        if ( Conic_To( RAS_VARS v_control.x, v_control.y,
-                                v_start.x,   v_start.y ) )
-          goto Fail;
-
-        goto Close;
-
-      default:  /* FT_CURVE_TAG_CUBIC */
-        {
-          Long  x1, y1, x2, y2, x3, y3;
-
-
-          if ( point + 1 > limit                             ||
-               FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
-            goto Invalid_Outline;
-
-          point += 2;
-          tags  += 2;
-
-          x1 = SCALED( point[-2].x );
-          y1 = SCALED( point[-2].y );
-          x2 = SCALED( point[-1].x );
-          y2 = SCALED( point[-1].y );
-
-          if ( flipped )
-          {
-            SWAP_( x1, y1 );
-            SWAP_( x2, y2 );
-          }
-
-          if ( point <= limit )
-          {
-            x3 = SCALED( point[0].x );
-            y3 = SCALED( point[0].y );
-
-            if ( flipped )
-              SWAP_( x3, y3 );
-
-            if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) )
-              goto Fail;
-            continue;
-          }
-
-          if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) )
-            goto Fail;
-          goto Close;
-        }
-      }
-    }
-
-    /* close the contour with a line segment */
-    if ( Line_To( RAS_VARS v_start.x, v_start.y ) )
-      goto Fail;
-
-  Close:
-    return SUCCESS;
-
-  Invalid_Outline:
-    ras.error = FT_THROW( Invalid );
-
-  Fail:
-    return FAILURE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Convert_Glyph                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Convert a glyph into a series of segments and arcs and make a      */
-  /*    profiles list with them.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    flipped :: If set, flip the direction of curve.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS on success, FAILURE if any error was encountered during    */
-  /*    rendering.                                                         */
-  /*                                                                       */
-  static Bool
-  Convert_Glyph( RAS_ARGS Int  flipped )
-  {
-    Int   i;
-    UInt  start;
-
-
-    ras.fProfile = NULL;
-    ras.joint    = FALSE;
-    ras.fresh    = FALSE;
-
-    ras.maxBuff  = ras.sizeBuff - AlignProfileSize;
-
-    ras.numTurns = 0;
-
-    ras.cProfile         = (PProfile)ras.top;
-    ras.cProfile->offset = ras.top;
-    ras.num_Profs        = 0;
-
-    start = 0;
-
-    for ( i = 0; i < ras.outline.n_contours; i++ )
-    {
-      PProfile  lastProfile;
-      Bool      o;
-
-
-      ras.state    = Unknown_State;
-      ras.gProfile = NULL;
-
-      if ( Decompose_Curve( RAS_VARS (UShort)start,
-                                     (UShort)ras.outline.contours[i],
-                                     flipped ) )
-        return FAILURE;
-
-      start = (UShort)ras.outline.contours[i] + 1;
-
-      /* we must now check whether the extreme arcs join or not */
-      if ( FRAC( ras.lastY ) == 0 &&
-           ras.lastY >= ras.minY  &&
-           ras.lastY <= ras.maxY  )
-        if ( ras.gProfile                        &&
-             ( ras.gProfile->flags & Flow_Up ) ==
-               ( ras.cProfile->flags & Flow_Up ) )
-          ras.top--;
-        /* Note that ras.gProfile can be nil if the contour was too small */
-        /* to be drawn.                                                   */
-
-      lastProfile = ras.cProfile;
-      if ( ras.top != ras.cProfile->offset &&
-           ( ras.cProfile->flags & Flow_Up ) )
-        o = IS_TOP_OVERSHOOT( ras.lastY );
-      else
-        o = IS_BOTTOM_OVERSHOOT( ras.lastY );
-      if ( End_Profile( RAS_VARS o ) )
-        return FAILURE;
-
-      /* close the `next profile in contour' linked list */
-      if ( ras.gProfile )
-        lastProfile->next = ras.gProfile;
-    }
-
-    if ( Finalize_Profile_Table( RAS_VAR ) )
-      return FAILURE;
-
-    return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /**                                                                     **/
-  /**  SCAN-LINE SWEEPS AND DRAWING                                       **/
-  /**                                                                     **/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Init_Linked                                                          */
-  /*                                                                       */
-  /*    Initializes an empty linked list.                                  */
-  /*                                                                       */
-  static void
-  Init_Linked( TProfileList*  l )
-  {
-    *l = NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  InsNew                                                               */
-  /*                                                                       */
-  /*    Inserts a new profile in a linked list.                            */
-  /*                                                                       */
-  static void
-  InsNew( PProfileList  list,
-          PProfile      profile )
-  {
-    PProfile  *old, current;
-    Long       x;
-
-
-    old     = list;
-    current = *old;
-    x       = profile->X;
-
-    while ( current )
-    {
-      if ( x < current->X )
-        break;
-      old     = &current->link;
-      current = *old;
-    }
-
-    profile->link = current;
-    *old          = profile;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  DelOld                                                               */
-  /*                                                                       */
-  /*    Removes an old profile from a linked list.                         */
-  /*                                                                       */
-  static void
-  DelOld( PProfileList  list,
-          PProfile      profile )
-  {
-    PProfile  *old, current;
-
-
-    old     = list;
-    current = *old;
-
-    while ( current )
-    {
-      if ( current == profile )
-      {
-        *old = current->link;
-        return;
-      }
-
-      old     = &current->link;
-      current = *old;
-    }
-
-    /* we should never get there, unless the profile was not part of */
-    /* the list.                                                     */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Sort                                                                 */
-  /*                                                                       */
-  /*    Sorts a trace list.  In 95%, the list is already sorted.  We need  */
-  /*    an algorithm which is fast in this case.  Bubble sort is enough    */
-  /*    and simple.                                                        */
-  /*                                                                       */
-  static void
-  Sort( PProfileList  list )
-  {
-    PProfile  *old, current, next;
-
-
-    /* First, set the new X coordinate of each profile */
-    current = *list;
-    while ( current )
-    {
-      current->X       = *current->offset;
-      current->offset += ( current->flags & Flow_Up ) ? 1 : -1;
-      current->height--;
-      current = current->link;
-    }
-
-    /* Then sort them */
-    old     = list;
-    current = *old;
-
-    if ( !current )
-      return;
-
-    next = current->link;
-
-    while ( next )
-    {
-      if ( current->X <= next->X )
-      {
-        old     = &current->link;
-        current = *old;
-
-        if ( !current )
-          return;
-      }
-      else
-      {
-        *old          = next;
-        current->link = next->link;
-        next->link    = current;
-
-        old     = list;
-        current = *old;
-      }
-
-      next = current->link;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Vertical Sweep Procedure Set                                         */
-  /*                                                                       */
-  /*  These four routines are used during the vertical black/white sweep   */
-  /*  phase by the generic Draw_Sweep() function.                          */
-  /*                                                                       */
-  /*************************************************************************/
-
-  static void
-  Vertical_Sweep_Init( RAS_ARGS Short*  min,
-                                Short*  max )
-  {
-    Long  pitch = ras.target.pitch;
-
-    FT_UNUSED( max );
-
-
-    ras.traceIncr = (Short)-pitch;
-    ras.traceOfs  = -*min * pitch;
-    if ( pitch > 0 )
-      ras.traceOfs += (Long)( ras.target.rows - 1 ) * pitch;
-  }
-
-
-  static void
-  Vertical_Sweep_Span( RAS_ARGS Short       y,
-                                FT_F26Dot6  x1,
-                                FT_F26Dot6  x2,
-                                PProfile    left,
-                                PProfile    right )
-  {
-    Long   e1, e2;
-    Byte*  target;
-
-    Int  dropOutControl = left->flags & 7;
-
-    FT_UNUSED( y );
-    FT_UNUSED( left );
-    FT_UNUSED( right );
-
-
-    /* in high-precision mode, we need 12 digits after the comma to */
-    /* represent multiples of 1/(1<<12) = 1/4096                    */
-    FT_TRACE7(( "  y=%d x=[%.12f;%.12f], drop-out=%d",
-                y,
-                x1 / (double)ras.precision,
-                x2 / (double)ras.precision,
-                dropOutControl ));
-
-    /* Drop-out control */
-
-    e1 = TRUNC( CEILING( x1 ) );
-
-    if ( dropOutControl != 2                             &&
-         x2 - x1 - ras.precision <= ras.precision_jitter )
-      e2 = e1;
-    else
-      e2 = TRUNC( FLOOR( x2 ) );
-
-    if ( e2 >= 0 && e1 < ras.bWidth )
-    {
-      Int   c1, c2;
-      Byte  f1, f2;
-
-
-      if ( e1 < 0 )
-        e1 = 0;
-      if ( e2 >= ras.bWidth )
-        e2 = ras.bWidth - 1;
-
-      FT_TRACE7(( " -> x=[%d;%d]", e1, e2 ));
-
-      c1 = (Short)( e1 >> 3 );
-      c2 = (Short)( e2 >> 3 );
-
-      f1 = (Byte)  ( 0xFF >> ( e1 & 7 ) );
-      f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) );
-
-      target = ras.bTarget + ras.traceOfs + c1;
-      c2 -= c1;
-
-      if ( c2 > 0 )
-      {
-        target[0] |= f1;
-
-        /* memset() is slower than the following code on many platforms. */
-        /* This is due to the fact that, in the vast majority of cases,  */
-        /* the span length in bytes is relatively small.                 */
-        c2--;
-        while ( c2 > 0 )
-        {
-          *(++target) = 0xFF;
-          c2--;
-        }
-        target[1] |= f2;
-      }
-      else
-        *target |= ( f1 & f2 );
-    }
-
-    FT_TRACE7(( "\n" ));
-  }
-
-
-  static void
-  Vertical_Sweep_Drop( RAS_ARGS Short       y,
-                                FT_F26Dot6  x1,
-                                FT_F26Dot6  x2,
-                                PProfile    left,
-                                PProfile    right )
-  {
-    Long   e1, e2, pxl;
-    Short  c1, f1;
-
-
-    FT_TRACE7(( "  y=%d x=[%.12f;%.12f]",
-                y,
-                x1 / (double)ras.precision,
-                x2 / (double)ras.precision ));
-
-    /* Drop-out control */
-
-    /*   e2            x2                    x1           e1   */
-    /*                                                         */
-    /*                 ^                     |                 */
-    /*                 |                     |                 */
-    /*   +-------------+---------------------+------------+    */
-    /*                 |                     |                 */
-    /*                 |                     v                 */
-    /*                                                         */
-    /* pixel         contour              contour       pixel  */
-    /* center                                           center */
-
-    /* drop-out mode    scan conversion rules (as defined in OpenType) */
-    /* --------------------------------------------------------------- */
-    /*  0                1, 2, 3                                       */
-    /*  1                1, 2, 4                                       */
-    /*  2                1, 2                                          */
-    /*  3                same as mode 2                                */
-    /*  4                1, 2, 5                                       */
-    /*  5                1, 2, 6                                       */
-    /*  6, 7             same as mode 2                                */
-
-    e1  = CEILING( x1 );
-    e2  = FLOOR  ( x2 );
-    pxl = e1;
-
-    if ( e1 > e2 )
-    {
-      Int  dropOutControl = left->flags & 7;
-
-
-      FT_TRACE7(( ", drop-out=%d", dropOutControl ));
-
-      if ( e1 == e2 + ras.precision )
-      {
-        switch ( dropOutControl )
-        {
-        case 0: /* simple drop-outs including stubs */
-          pxl = e2;
-          break;
-
-        case 4: /* smart drop-outs including stubs */
-          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
-          break;
-
-        case 1: /* simple drop-outs excluding stubs */
-        case 5: /* smart drop-outs excluding stubs  */
-
-          /* Drop-out Control Rules #4 and #6 */
-
-          /* The specification neither provides an exact definition */
-          /* of a `stub' nor gives exact rules to exclude them.     */
-          /*                                                        */
-          /* Here the constraints we use to recognize a stub.       */
-          /*                                                        */
-          /*  upper stub:                                           */
-          /*                                                        */
-          /*   - P_Left and P_Right are in the same contour         */
-          /*   - P_Right is the successor of P_Left in that contour */
-          /*   - y is the top of P_Left and P_Right                 */
-          /*                                                        */
-          /*  lower stub:                                           */
-          /*                                                        */
-          /*   - P_Left and P_Right are in the same contour         */
-          /*   - P_Left is the successor of P_Right in that contour */
-          /*   - y is the bottom of P_Left                          */
-          /*                                                        */
-          /* We draw a stub if the following constraints are met.   */
-          /*                                                        */
-          /*   - for an upper or lower stub, there is top or bottom */
-          /*     overshoot, respectively                            */
-          /*   - the covered interval is greater or equal to a half */
-          /*     pixel                                              */
-
-          /* upper stub test */
-          if ( left->next == right                &&
-               left->height <= 0                  &&
-               !( left->flags & Overshoot_Top   &&
-                  x2 - x1 >= ras.precision_half ) )
-            goto Exit;
-
-          /* lower stub test */
-          if ( right->next == left                 &&
-               left->start == y                    &&
-               !( left->flags & Overshoot_Bottom &&
-                  x2 - x1 >= ras.precision_half  ) )
-            goto Exit;
-
-          if ( dropOutControl == 1 )
-            pxl = e2;
-          else
-            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
-          break;
-
-        default: /* modes 2, 3, 6, 7 */
-          goto Exit;  /* no drop-out control */
-        }
-
-        /* undocumented but confirmed: If the drop-out would result in a  */
-        /* pixel outside of the bounding box, use the pixel inside of the */
-        /* bounding box instead                                           */
-        if ( pxl < 0 )
-          pxl = e1;
-        else if ( TRUNC( pxl ) >= ras.bWidth )
-          pxl = e2;
-
-        /* check that the other pixel isn't set */
-        e1 = ( pxl == e1 ) ? e2 : e1;
-
-        e1 = TRUNC( e1 );
-
-        c1 = (Short)( e1 >> 3 );
-        f1 = (Short)( e1 &  7 );
-
-        if ( e1 >= 0 && e1 < ras.bWidth                      &&
-             ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) )
-          goto Exit;
-      }
-      else
-        goto Exit;
-    }
-
-    e1 = TRUNC( pxl );
-
-    if ( e1 >= 0 && e1 < ras.bWidth )
-    {
-      FT_TRACE7(( " -> x=%d (drop-out)", e1 ));
-
-      c1 = (Short)( e1 >> 3 );
-      f1 = (Short)( e1 & 7 );
-
-      ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 );
-    }
-
-  Exit:
-    FT_TRACE7(( "\n" ));
-  }
-
-
-  static void
-  Vertical_Sweep_Step( RAS_ARG )
-  {
-    ras.traceOfs += ras.traceIncr;
-  }
-
-
-  /***********************************************************************/
-  /*                                                                     */
-  /*  Horizontal Sweep Procedure Set                                     */
-  /*                                                                     */
-  /*  These four routines are used during the horizontal black/white     */
-  /*  sweep phase by the generic Draw_Sweep() function.                  */
-  /*                                                                     */
-  /***********************************************************************/
-
-  static void
-  Horizontal_Sweep_Init( RAS_ARGS Short*  min,
-                                  Short*  max )
-  {
-    /* nothing, really */
-    FT_UNUSED_RASTER;
-    FT_UNUSED( min );
-    FT_UNUSED( max );
-  }
-
-
-  static void
-  Horizontal_Sweep_Span( RAS_ARGS Short       y,
-                                  FT_F26Dot6  x1,
-                                  FT_F26Dot6  x2,
-                                  PProfile    left,
-                                  PProfile    right )
-  {
-    FT_UNUSED( left );
-    FT_UNUSED( right );
-
-
-    if ( x2 - x1 < ras.precision )
-    {
-      Long  e1, e2;
-
-
-      FT_TRACE7(( "  x=%d y=[%.12f;%.12f]",
-                  y,
-                  x1 / (double)ras.precision,
-                  x2 / (double)ras.precision ));
-
-      e1 = CEILING( x1 );
-      e2 = FLOOR  ( x2 );
-
-      if ( e1 == e2 )
-      {
-        e1 = TRUNC( e1 );
-
-        if ( e1 >= 0 && (ULong)e1 < ras.target.rows )
-        {
-          Byte   f1;
-          PByte  bits;
-          PByte  p;
-
-
-          FT_TRACE7(( " -> y=%d (drop-out)", e1 ));
-
-          bits = ras.bTarget + ( y >> 3 );
-          f1   = (Byte)( 0x80 >> ( y & 7 ) );
-          p    = bits - e1 * ras.target.pitch;
-
-          if ( ras.target.pitch > 0 )
-            p += (Long)( ras.target.rows - 1 ) * ras.target.pitch;
-
-          p[0] |= f1;
-        }
-      }
-
-      FT_TRACE7(( "\n" ));
-    }
-  }
-
-
-  static void
-  Horizontal_Sweep_Drop( RAS_ARGS Short       y,
-                                  FT_F26Dot6  x1,
-                                  FT_F26Dot6  x2,
-                                  PProfile    left,
-                                  PProfile    right )
-  {
-    Long   e1, e2, pxl;
-    PByte  bits;
-    Byte   f1;
-
-
-    FT_TRACE7(( "  x=%d y=[%.12f;%.12f]",
-                y,
-                x1 / (double)ras.precision,
-                x2 / (double)ras.precision ));
-
-    /* During the horizontal sweep, we only take care of drop-outs */
-
-    /* e1     +       <-- pixel center */
-    /*        |                        */
-    /* x1  ---+-->    <-- contour      */
-    /*        |                        */
-    /*        |                        */
-    /* x2  <--+---    <-- contour      */
-    /*        |                        */
-    /*        |                        */
-    /* e2     +       <-- pixel center */
-
-    e1  = CEILING( x1 );
-    e2  = FLOOR  ( x2 );
-    pxl = e1;
-
-    if ( e1 > e2 )
-    {
-      Int  dropOutControl = left->flags & 7;
-
-
-      FT_TRACE7(( ", dropout=%d", dropOutControl ));
-
-      if ( e1 == e2 + ras.precision )
-      {
-        switch ( dropOutControl )
-        {
-        case 0: /* simple drop-outs including stubs */
-          pxl = e2;
-          break;
-
-        case 4: /* smart drop-outs including stubs */
-          pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
-          break;
-
-        case 1: /* simple drop-outs excluding stubs */
-        case 5: /* smart drop-outs excluding stubs  */
-          /* see Vertical_Sweep_Drop for details */
-
-          /* rightmost stub test */
-          if ( left->next == right                &&
-               left->height <= 0                  &&
-               !( left->flags & Overshoot_Top   &&
-                  x2 - x1 >= ras.precision_half ) )
-            goto Exit;
-
-          /* leftmost stub test */
-          if ( right->next == left                 &&
-               left->start == y                    &&
-               !( left->flags & Overshoot_Bottom &&
-                  x2 - x1 >= ras.precision_half  ) )
-            goto Exit;
-
-          if ( dropOutControl == 1 )
-            pxl = e2;
-          else
-            pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half );
-          break;
-
-        default: /* modes 2, 3, 6, 7 */
-          goto Exit;  /* no drop-out control */
-        }
-
-        /* undocumented but confirmed: If the drop-out would result in a  */
-        /* pixel outside of the bounding box, use the pixel inside of the */
-        /* bounding box instead                                           */
-        if ( pxl < 0 )
-          pxl = e1;
-        else if ( (ULong)( TRUNC( pxl ) ) >= ras.target.rows )
-          pxl = e2;
-
-        /* check that the other pixel isn't set */
-        e1 = ( pxl == e1 ) ? e2 : e1;
-
-        e1 = TRUNC( e1 );
-
-        bits = ras.bTarget + ( y >> 3 );
-        f1   = (Byte)( 0x80 >> ( y & 7 ) );
-
-        bits -= e1 * ras.target.pitch;
-        if ( ras.target.pitch > 0 )
-          bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch;
-
-        if ( e1 >= 0                     &&
-             (ULong)e1 < ras.target.rows &&
-             *bits & f1                  )
-          goto Exit;
-      }
-      else
-        goto Exit;
-    }
-
-    e1 = TRUNC( pxl );
-
-    if ( e1 >= 0 && (ULong)e1 < ras.target.rows )
-    {
-      FT_TRACE7(( " -> y=%d (drop-out)", e1 ));
-
-      bits  = ras.bTarget + ( y >> 3 );
-      f1    = (Byte)( 0x80 >> ( y & 7 ) );
-      bits -= e1 * ras.target.pitch;
-
-      if ( ras.target.pitch > 0 )
-        bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch;
-
-      bits[0] |= f1;
-    }
-
-  Exit:
-    FT_TRACE7(( "\n" ));
-  }
-
-
-  static void
-  Horizontal_Sweep_Step( RAS_ARG )
-  {
-    /* Nothing, really */
-    FT_UNUSED_RASTER;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  Generic Sweep Drawing routine                                        */
-  /*                                                                       */
-  /*************************************************************************/
-
-  static Bool
-  Draw_Sweep( RAS_ARG )
-  {
-    Short         y, y_change, y_height;
-
-    PProfile      P, Q, P_Left, P_Right;
-
-    Short         min_Y, max_Y, top, bottom, dropouts;
-
-    Long          x1, x2, xs, e1, e2;
-
-    TProfileList  waiting;
-    TProfileList  draw_left, draw_right;
-
-
-    /* initialize empty linked lists */
-
-    Init_Linked( &waiting );
-
-    Init_Linked( &draw_left  );
-    Init_Linked( &draw_right );
-
-    /* first, compute min and max Y */
-
-    P     = ras.fProfile;
-    max_Y = (Short)TRUNC( ras.minY );
-    min_Y = (Short)TRUNC( ras.maxY );
-
-    while ( P )
-    {
-      Q = P->link;
-
-      bottom = (Short)P->start;
-      top    = (Short)( P->start + P->height - 1 );
-
-      if ( min_Y > bottom )
-        min_Y = bottom;
-      if ( max_Y < top )
-        max_Y = top;
-
-      P->X = 0;
-      InsNew( &waiting, P );
-
-      P = Q;
-    }
-
-    /* check the Y-turns */
-    if ( ras.numTurns == 0 )
-    {
-      ras.error = FT_THROW( Invalid );
-      return FAILURE;
-    }
-
-    /* now initialize the sweep */
-
-    ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
-
-    /* then compute the distance of each profile from min_Y */
-
-    P = waiting;
-
-    while ( P )
-    {
-      P->countL = P->start - min_Y;
-      P = P->link;
-    }
-
-    /* let's go */
-
-    y        = min_Y;
-    y_height = 0;
-
-    if ( ras.numTurns > 0                     &&
-         ras.sizeBuff[-ras.numTurns] == min_Y )
-      ras.numTurns--;
-
-    while ( ras.numTurns > 0 )
-    {
-      /* check waiting list for new activations */
-
-      P = waiting;
-
-      while ( P )
-      {
-        Q = P->link;
-        P->countL -= y_height;
-        if ( P->countL == 0 )
-        {
-          DelOld( &waiting, P );
-
-          if ( P->flags & Flow_Up )
-            InsNew( &draw_left,  P );
-          else
-            InsNew( &draw_right, P );
-        }
-
-        P = Q;
-      }
-
-      /* sort the drawing lists */
-
-      Sort( &draw_left );
-      Sort( &draw_right );
-
-      y_change = (Short)ras.sizeBuff[-ras.numTurns--];
-      y_height = (Short)( y_change - y );
-
-      while ( y < y_change )
-      {
-        /* let's trace */
-
-        dropouts = 0;
-
-        P_Left  = draw_left;
-        P_Right = draw_right;
-
-        while ( P_Left )
-        {
-          x1 = P_Left ->X;
-          x2 = P_Right->X;
-
-          if ( x1 > x2 )
-          {
-            xs = x1;
-            x1 = x2;
-            x2 = xs;
-          }
-
-          e1 = FLOOR( x1 );
-          e2 = CEILING( x2 );
-
-          if ( x2 - x1 <= ras.precision &&
-               e1 != x1 && e2 != x2     )
-          {
-            if ( e1 > e2 || e2 == e1 + ras.precision )
-            {
-              Int  dropOutControl = P_Left->flags & 7;
-
-
-              if ( dropOutControl != 2 )
-              {
-                /* a drop-out was detected */
-
-                P_Left ->X = x1;
-                P_Right->X = x2;
-
-                /* mark profile for drop-out processing */
-                P_Left->countL = 1;
-                dropouts++;
-              }
-
-              goto Skip_To_Next;
-            }
-          }
-
-          ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
-
-        Skip_To_Next:
-
-          P_Left  = P_Left->link;
-          P_Right = P_Right->link;
-        }
-
-        /* handle drop-outs _after_ the span drawing --       */
-        /* drop-out processing has been moved out of the loop */
-        /* for performance tuning                             */
-        if ( dropouts > 0 )
-          goto Scan_DropOuts;
-
-      Next_Line:
-
-        ras.Proc_Sweep_Step( RAS_VAR );
-
-        y++;
-
-        if ( y < y_change )
-        {
-          Sort( &draw_left  );
-          Sort( &draw_right );
-        }
-      }
-
-      /* now finalize the profiles that need it */
-
-      P = draw_left;
-      while ( P )
-      {
-        Q = P->link;
-        if ( P->height == 0 )
-          DelOld( &draw_left, P );
-        P = Q;
-      }
-
-      P = draw_right;
-      while ( P )
-      {
-        Q = P->link;
-        if ( P->height == 0 )
-          DelOld( &draw_right, P );
-        P = Q;
-      }
-    }
-
-    /* for gray-scaling, flush the bitmap scanline cache */
-    while ( y <= max_Y )
-    {
-      ras.Proc_Sweep_Step( RAS_VAR );
-      y++;
-    }
-
-    return SUCCESS;
-
-  Scan_DropOuts:
-
-    P_Left  = draw_left;
-    P_Right = draw_right;
-
-    while ( P_Left )
-    {
-      if ( P_Left->countL )
-      {
-        P_Left->countL = 0;
-#if 0
-        dropouts--;  /* -- this is useful when debugging only */
-#endif
-        ras.Proc_Sweep_Drop( RAS_VARS y,
-                                      P_Left->X,
-                                      P_Right->X,
-                                      P_Left,
-                                      P_Right );
-      }
-
-      P_Left  = P_Left->link;
-      P_Right = P_Right->link;
-    }
-
-    goto Next_Line;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Render_Single_Pass                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Perform one sweep with sub-banding.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    flipped :: If set, flip the direction of the outline.              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Renderer error code.                                               */
-  /*                                                                       */
-  static int
-  Render_Single_Pass( RAS_ARGS Bool  flipped )
-  {
-    Short  i, j, k;
-
-
-    while ( ras.band_top >= 0 )
-    {
-      ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
-      ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
-
-      ras.top = ras.buff;
-
-      ras.error = Raster_Err_None;
-
-      if ( Convert_Glyph( RAS_VARS flipped ) )
-      {
-        if ( ras.error != Raster_Err_Overflow )
-          return FAILURE;
-
-        ras.error = Raster_Err_None;
-
-        /* sub-banding */
-
-#ifdef DEBUG_RASTER
-        ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
-#endif
-
-        i = ras.band_stack[ras.band_top].y_min;
-        j = ras.band_stack[ras.band_top].y_max;
-
-        k = (Short)( ( i + j ) / 2 );
-
-        if ( ras.band_top >= 7 || k < i )
-        {
-          ras.band_top = 0;
-          ras.error    = FT_THROW( Invalid );
-
-          return ras.error;
-        }
-
-        ras.band_stack[ras.band_top + 1].y_min = k;
-        ras.band_stack[ras.band_top + 1].y_max = j;
-
-        ras.band_stack[ras.band_top].y_max = (Short)( k - 1 );
-
-        ras.band_top++;
-      }
-      else
-      {
-        if ( ras.fProfile )
-          if ( Draw_Sweep( RAS_VAR ) )
-             return ras.error;
-        ras.band_top--;
-      }
-    }
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Render_Glyph                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Render a glyph in a bitmap.  Sub-banding if needed.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  Render_Glyph( RAS_ARG )
-  {
-    FT_Error  error;
-
-
-    Set_High_Precision( RAS_VARS ras.outline.flags &
-                                 FT_OUTLINE_HIGH_PRECISION );
-    ras.scale_shift = ras.precision_shift;
-
-    if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS )
-      ras.dropOutControl = 2;
-    else
-    {
-      if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS )
-        ras.dropOutControl = 4;
-      else
-        ras.dropOutControl = 0;
-
-      if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) )
-        ras.dropOutControl += 1;
-    }
-
-    ras.second_pass = (Bool)( !( ras.outline.flags      &
-                                 FT_OUTLINE_SINGLE_PASS ) );
-
-    /* Vertical Sweep */
-    FT_TRACE7(( "Vertical pass (ftraster)\n" ));
-
-    ras.Proc_Sweep_Init = Vertical_Sweep_Init;
-    ras.Proc_Sweep_Span = Vertical_Sweep_Span;
-    ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
-    ras.Proc_Sweep_Step = Vertical_Sweep_Step;
-
-    ras.band_top            = 0;
-    ras.band_stack[0].y_min = 0;
-    ras.band_stack[0].y_max = (Short)( ras.target.rows - 1 );
-
-    ras.bWidth  = (UShort)ras.target.width;
-    ras.bTarget = (Byte*)ras.target.buffer;
-
-    if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 )
-      return error;
-
-    /* Horizontal Sweep */
-    if ( ras.second_pass && ras.dropOutControl != 2 )
-    {
-      FT_TRACE7(( "Horizontal pass (ftraster)\n" ));
-
-      ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
-      ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
-      ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
-      ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
-
-      ras.band_top            = 0;
-      ras.band_stack[0].y_min = 0;
-      ras.band_stack[0].y_max = (Short)( ras.target.width - 1 );
-
-      if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 )
-        return error;
-    }
-
-    return Raster_Err_None;
-  }
-
-
-  static void
-  ft_black_init( black_PRaster  raster )
-  {
-    FT_UNUSED( raster );
-  }
-
-
-  /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/
-  /****                         a static object.                  *****/
-
-
-#ifdef STANDALONE_
-
-
-  static int
-  ft_black_new( void*       memory,
-                FT_Raster  *araster )
-  {
-     static black_TRaster  the_raster;
-     FT_UNUSED( memory );
-
-
-     *araster = (FT_Raster)&the_raster;
-     FT_ZERO( &the_raster );
-     ft_black_init( &the_raster );
-
-     return 0;
-  }
-
-
-  static void
-  ft_black_done( FT_Raster  raster )
-  {
-    /* nothing */
-    FT_UNUSED( raster );
-  }
-
-
-#else /* !STANDALONE_ */
-
-
-  static int
-  ft_black_new( FT_Memory       memory,
-                black_PRaster  *araster )
-  {
-    FT_Error       error;
-    black_PRaster  raster = NULL;
-
-
-    *araster = 0;
-    if ( !FT_NEW( raster ) )
-    {
-      raster->memory = memory;
-      ft_black_init( raster );
-
-      *araster = raster;
-    }
-
-    return error;
-  }
-
-
-  static void
-  ft_black_done( black_PRaster  raster )
-  {
-    FT_Memory  memory = (FT_Memory)raster->memory;
-
-
-    FT_FREE( raster );
-  }
-
-
-#endif /* !STANDALONE_ */
-
-
-  static void
-  ft_black_reset( FT_Raster  raster,
-                  PByte      pool_base,
-                  ULong      pool_size )
-  {
-    FT_UNUSED( raster );
-    FT_UNUSED( pool_base );
-    FT_UNUSED( pool_size );
-  }
-
-
-  static int
-  ft_black_set_mode( FT_Raster  raster,
-                     ULong      mode,
-                     void*      args )
-  {
-    FT_UNUSED( raster );
-    FT_UNUSED( mode );
-    FT_UNUSED( args );
-
-    return 0;
-  }
-
-
-  static int
-  ft_black_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;
-
-    black_TWorker  worker[1];
-
-    Long  buffer[FT_MAX_BLACK_POOL];
-
-
-    if ( !raster )
-      return FT_THROW( Not_Ini );
-
-    if ( !outline )
-      return FT_THROW( Invalid );
-
-    /* return immediately if the outline is empty */
-    if ( outline->n_points == 0 || outline->n_contours <= 0 )
-      return Raster_Err_None;
-
-    if ( !outline->contours || !outline->points )
-      return FT_THROW( Invalid );
-
-    if ( outline->n_points !=
-           outline->contours[outline->n_contours - 1] + 1 )
-      return FT_THROW( Invalid );
-
-    /* this version of the raster does not support direct rendering, sorry */
-    if ( params->flags & FT_RASTER_FLAG_DIRECT )
-      return FT_THROW( Unsupported );
-
-    if ( params->flags & FT_RASTER_FLAG_AA )
-      return FT_THROW( Unsupported );
-
-    if ( !target_map )
-      return FT_THROW( Invalid );
-
-    /* nothing to do */
-    if ( !target_map->width || !target_map->rows )
-      return Raster_Err_None;
-
-    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;
-
-    worker->buff     = buffer;
-    worker->sizeBuff = (&buffer)[1]; /* Points to right after buffer. */
-
-    return Render_Glyph( RAS_VAR );
-  }
-
-
-  FT_DEFINE_RASTER_FUNCS(
-    ft_standard_raster,
-
-    FT_GLYPH_FORMAT_OUTLINE,
-
-    (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/third_party/freetype/src/raster/ftraster.h b/third_party/freetype/src/raster/ftraster.h
deleted file mode 100644
index 6b3050c..0000000
--- a/third_party/freetype/src/raster/ftraster.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftraster.h                                                             */
-/*                                                                         */
-/*    The FreeType glyph rasterizer (specification).                       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTRASTER_H_
-#define FTRASTER_H_
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_IMAGE_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Uncomment the following line if you are using ftraster.c as a         */
-  /* standalone module, fully independent of FreeType.                     */
-  /*                                                                       */
-/* #define STANDALONE_ */
-
-  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_standard_raster;
-
-
-FT_END_HEADER
-
-#endif /* FTRASTER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/ftrend1.c b/third_party/freetype/src/raster/ftrend1.c
deleted file mode 100644
index 1a83e9e..0000000
--- a/third_party/freetype/src/raster/ftrend1.c
+++ /dev/null
@@ -1,254 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftrend1.c                                                              */
-/*                                                                         */
-/*    The FreeType glyph rasterizer interface (body).                      */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_OUTLINE_H
-#include "ftrend1.h"
-#include "ftraster.h"
-#include "rastpic.h"
-
-#include "rasterrs.h"
-
-
-  /* initialize renderer -- init its raster */
-  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 );
-
-    return FT_Err_Ok;
-  }
-
-
-  /* set render-specific mode */
-  static FT_Error
-  ft_raster1_set_mode( FT_Renderer  render,
-                       FT_ULong     mode_tag,
-                       FT_Pointer   data )
-  {
-    /* we simply pass it to the raster */
-    return render->clazz->raster_class->raster_set_mode( render->raster,
-                                                         mode_tag,
-                                                         data );
-  }
-
-
-  /* transform a given glyph image */
-  static FT_Error
-  ft_raster1_transform( FT_Renderer       render,
-                        FT_GlyphSlot      slot,
-                        const FT_Matrix*  matrix,
-                        const FT_Vector*  delta )
-  {
-    FT_Error error = FT_Err_Ok;
-
-
-    if ( slot->format != render->glyph_format )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( matrix )
-      FT_Outline_Transform( &slot->outline, matrix );
-
-    if ( delta )
-      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
-
-  Exit:
-    return error;
-  }
-
-
-  /* return the glyph's control box */
-  static void
-  ft_raster1_get_cbox( FT_Renderer   render,
-                       FT_GlyphSlot  slot,
-                       FT_BBox*      cbox )
-  {
-    FT_ZERO( cbox );
-
-    if ( slot->format == render->glyph_format )
-      FT_Outline_Get_CBox( &slot->outline, cbox );
-  }
-
-
-  /* convert a slot's glyph image into a bitmap */
-  static FT_Error
-  ft_raster1_render( FT_Renderer       render,
-                     FT_GlyphSlot      slot,
-                     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_Raster_Params  params;
-
-
-    /* check glyph image format */
-    if ( slot->format != render->glyph_format )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* check rendering mode */
-    if ( mode != FT_RENDER_MODE_MONO )
-    {
-      /* raster1 is only capable of producing monochrome bitmaps */
-      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 )
-    {
-      FT_FREE( bitmap->buffer );
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-
-    pitch              = ( ( width + 15 ) >> 4 ) << 1;
-    bitmap->pixel_mode = FT_PIXEL_MODE_MONO;
-
-    bitmap->width = width;
-    bitmap->rows  = height;
-    bitmap->pitch = (int)pitch;
-
-    if ( FT_ALLOC_MULT( bitmap->buffer, pitch, height ) )
-      goto Exit;
-
-    slot->internal->flags |= FT_GLYPH_OWN_BITMAP;
-
-    /* translate outline to render it into the bitmap */
-    FT_Outline_Translate( outline, -cbox.xMin, -cbox.yMin );
-
-    /* set up parameters */
-    params.target = bitmap;
-    params.source = outline;
-    params.flags  = 0;
-
-    /* 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:
-    return error;
-  }
-
-
-  FT_DEFINE_RENDERER(
-    ft_raster1_renderer_class,
-
-      FT_MODULE_RENDERER,
-      sizeof ( FT_RendererRec ),
-
-      "raster1",
-      0x10000L,
-      0x20000L,
-
-      NULL,    /* module specific interface */
-
-      (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,     /* 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         /* raster_class    */
-  )
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/ftrend1.h b/third_party/freetype/src/raster/ftrend1.h
deleted file mode 100644
index cff702d..0000000
--- a/third_party/freetype/src/raster/ftrend1.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftrend1.h                                                              */
-/*                                                                         */
-/*    The FreeType glyph rasterizer interface (specification).             */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTREND1_H_
-#define FTREND1_H_
-
-
-#include <ft2build.h>
-#include FT_RENDER_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_RENDERER( ft_raster1_renderer_class )
-
-
-FT_END_HEADER
-
-#endif /* FTREND1_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/raster.c b/third_party/freetype/src/raster/raster.c
deleted file mode 100644
index ee54ae1..0000000
--- a/third_party/freetype/src/raster/raster.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  raster.c                                                               */
-/*                                                                         */
-/*    FreeType monochrome rasterer module component (body only).           */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "rastpic.c"
-#include "ftraster.c"
-#include "ftrend1.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/rasterrs.h b/third_party/freetype/src/raster/rasterrs.h
deleted file mode 100644
index 0d64690..0000000
--- a/third_party/freetype/src/raster/rasterrs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  rasterrs.h                                                             */
-/*                                                                         */
-/*    monochrome renderer error codes (specification only).                */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the monochrome renderer error enumeration */
-  /* constants.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef RASTERRS_H_
-#define RASTERRS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  Raster_Err_
-#define FT_ERR_BASE    FT_Mod_Err_Raster
-
-#include FT_ERRORS_H
-
-#endif /* RASTERRS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/rastpic.c b/third_party/freetype/src/raster/rastpic.c
deleted file mode 100644
index 7085339..0000000
--- a/third_party/freetype/src/raster/rastpic.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  rastpic.c                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for raster module.   */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "rastpic.h"
-#include "rasterrs.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from ftraster.c */
-  void
-  FT_Init_Class_ft_standard_raster( FT_Raster_Funcs*  funcs );
-
-
-  void
-  ft_raster1_renderer_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->raster )
-    {
-      RasterPIC*  container = (RasterPIC*)pic_container->raster;
-
-
-      if ( --container->ref_count )
-        return;
-      FT_FREE( container );
-      pic_container->raster = NULL;
-    }
-  }
-
-
-  FT_Error
-  ft_raster1_renderer_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    RasterPIC*         container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* 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++;
-      return error;
-    }
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->raster = container;
-
-    container->ref_count = 1;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    FT_Init_Class_ft_standard_raster( &container->ft_standard_raster );
-
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/rastpic.h b/third_party/freetype/src/raster/rastpic.h
deleted file mode 100644
index dcd6913..0000000
--- a/third_party/freetype/src/raster/rastpic.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  rastpic.h                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for raster module.   */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 RASTPIC_H_
-#define RASTPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-FT_BEGIN_HEADER
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_STANDARD_RASTER_GET  ft_standard_raster
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-  typedef struct  RasterPIC_
-  {
-    int              ref_count;
-    FT_Raster_Funcs  ft_standard_raster;
-
-  } RasterPIC;
-
-
-#define GET_PIC( lib )                                    \
-          ( (RasterPIC*)( (lib)->pic_container.raster ) )
-#define FT_STANDARD_RASTER_GET  ( GET_PIC( library )->ft_standard_raster )
-
-
-  /* see rastpic.c for the implementation */
-  void
-  ft_raster1_renderer_class_pic_free( FT_Library  library );
-
-  FT_Error
-  ft_raster1_renderer_class_pic_init( FT_Library  library );
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-FT_END_HEADER
-
-#endif /* RASTPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfdriver.c b/third_party/freetype/src/sfnt/sfdriver.c
deleted file mode 100644
index 0b9867a..0000000
--- a/third_party/freetype/src/sfnt/sfdriver.c
+++ /dev/null
@@ -1,553 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfdriver.c                                                             */
-/*                                                                         */
-/*    High-level SFNT driver interface (body).                             */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_SFNT_H
-#include FT_INTERNAL_OBJECTS_H
-
-#include "sfdriver.h"
-#include "ttload.h"
-#include "sfobjs.h"
-#include "sfntpic.h"
-
-#include "sferrors.h"
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-#include "ttsbit.h"
-#endif
-
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
-#include "ttpost.h"
-#endif
-
-#ifdef TT_CONFIG_OPTION_BDF
-#include "ttbdf.h"
-#include FT_SERVICE_BDF_H
-#endif
-
-#include "ttcmap.h"
-#include "ttkern.h"
-#include "ttmtx.h"
-
-#include FT_SERVICE_GLYPH_DICT_H
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_SFNT_H
-#include FT_SERVICE_TT_CMAP_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_sfdriver
-
-
-  /*
-   *  SFNT TABLE SERVICE
-   *
-   */
-
-  static void*
-  get_sfnt_table( TT_Face      face,
-                  FT_Sfnt_Tag  tag )
-  {
-    void*  table;
-
-
-    switch ( tag )
-    {
-    case FT_SFNT_HEAD:
-      table = &face->header;
-      break;
-
-    case FT_SFNT_HHEA:
-      table = &face->horizontal;
-      break;
-
-    case FT_SFNT_VHEA:
-      table = face->vertical_info ? &face->vertical : NULL;
-      break;
-
-    case FT_SFNT_OS2:
-      table = ( face->os2.version == 0xFFFFU ) ? NULL : &face->os2;
-      break;
-
-    case FT_SFNT_POST:
-      table = &face->postscript;
-      break;
-
-    case FT_SFNT_MAXP:
-      table = &face->max_profile;
-      break;
-
-    case FT_SFNT_PCLT:
-      table = face->pclt.Version ? &face->pclt : NULL;
-      break;
-
-    default:
-      table = NULL;
-    }
-
-    return table;
-  }
-
-
-  static FT_Error
-  sfnt_table_info( TT_Face    face,
-                   FT_UInt    idx,
-                   FT_ULong  *tag,
-                   FT_ULong  *offset,
-                   FT_ULong  *length )
-  {
-    if ( !offset || !length )
-      return FT_THROW( Invalid_Argument );
-
-    if ( !tag )
-      *length = face->num_tables;
-    else
-    {
-      if ( idx >= face->num_tables )
-        return FT_THROW( Table_Missing );
-
-      *tag    = face->dir_tables[idx].Tag;
-      *offset = face->dir_tables[idx].Offset;
-      *length = face->dir_tables[idx].Length;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_SERVICE_SFNT_TABLEREC(
-    sfnt_service_sfnt_table,
-
-    (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
-
-  /*
-   *  GLYPH DICT SERVICE
-   *
-   */
-
-  static FT_Error
-  sfnt_get_glyph_name( FT_Face     face,
-                       FT_UInt     glyph_index,
-                       FT_Pointer  buffer,
-                       FT_UInt     buffer_max )
-  {
-    FT_String*  gname;
-    FT_Error    error;
-
-
-    error = tt_face_get_ps_name( (TT_Face)face, glyph_index, &gname );
-    if ( !error )
-      FT_STRCPYN( buffer, gname, buffer_max );
-
-    return error;
-  }
-
-
-  static FT_UInt
-  sfnt_get_name_index( FT_Face     face,
-                       FT_String*  glyph_name )
-  {
-    TT_Face  ttface = (TT_Face)face;
-
-    FT_UInt  i, max_gid = FT_UINT_MAX;
-
-
-    if ( face->num_glyphs < 0 )
-      return 0;
-    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, face->num_glyphs ));
-
-    for ( i = 0; i < max_gid; i++ )
-    {
-      FT_String*  gname;
-      FT_Error    error = tt_face_get_ps_name( ttface, i, &gname );
-
-
-      if ( error )
-        continue;
-
-      if ( !ft_strcmp( glyph_name, gname ) )
-        return i;
-    }
-
-    return 0;
-  }
-
-
-  FT_DEFINE_SERVICE_GLYPHDICTREC(
-    sfnt_service_glyph_dict,
-
-    (FT_GlyphDict_GetNameFunc)  sfnt_get_glyph_name,    /* get_name   */
-    (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index     /* name_index */
-  )
-
-#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */
-
-
-  /*
-   *  POSTSCRIPT NAME SERVICE
-   *
-   */
-
-  static const char*
-  sfnt_get_ps_name( TT_Face  face )
-  {
-    FT_Int       n, found_win, found_apple;
-    const char*  result = NULL;
-
-
-    /* shouldn't happen, but just in case to avoid memory leaks */
-    if ( face->postscript_name )
-      return face->postscript_name;
-
-    /* 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;
-
-    for ( n = 0; n < face->num_names; n++ )
-    {
-      TT_NameEntryRec*  name = face->name_table.names + n;
-
-
-      if ( name->nameID == 6 && name->stringLength > 0 )
-      {
-        if ( name->platformID == 3     &&
-             name->encodingID == 1     &&
-             name->languageID == 0x409 )
-          found_win = n;
-
-        if ( name->platformID == 1 &&
-             name->encodingID == 0 &&
-             name->languageID == 0 )
-          found_apple = n;
-      }
-    }
-
-    if ( found_win != -1 )
-    {
-      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;
-    }
-
-    if ( found_apple != -1 )
-    {
-      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;
-
-      FT_UNUSED( error );
-
-
-      if ( !FT_ALLOC( result, len + 1 ) )
-      {
-        FT_Stream  stream = face->name_table.stream;
-
-
-        if ( FT_STREAM_SEEK( name->stringOffset ) ||
-             FT_STREAM_READ( result, len )        )
-        {
-          name->stringOffset = 0;
-          name->stringLength = 0;
-          FT_FREE( name->string );
-          FT_FREE( result );
-          goto Exit;
-        }
-        ((char*)result)[len] = '\0';
-      }
-    }
-
-  Exit:
-    face->postscript_name = result;
-    return result;
-  }
-
-
-  FT_DEFINE_SERVICE_PSFONTNAMEREC(
-    sfnt_service_ps_name,
-
-    (FT_PsName_GetFunc)sfnt_get_ps_name       /* get_ps_font_name */
-  )
-
-
-  /*
-   *  TT CMAP INFO
-   */
-  FT_DEFINE_SERVICE_TTCMAPSREC(
-    tt_service_get_cmap_info,
-
-    (TT_CMap_Info_GetFunc)tt_get_cmap_info    /* get_cmap_info */
-  )
-
-
-#ifdef TT_CONFIG_OPTION_BDF
-
-  static FT_Error
-  sfnt_get_charset_id( TT_Face       face,
-                       const char*  *acharset_encoding,
-                       const char*  *acharset_registry )
-  {
-    BDF_PropertyRec  encoding, registry;
-    FT_Error         error;
-
-
-    /* XXX: I don't know whether this is correct, since
-     *      tt_face_find_bdf_prop only returns something correct if we have
-     *      previously selected a size that is listed in the BDF table.
-     *      Should we change the BDF table format to include single offsets
-     *      for `CHARSET_REGISTRY' and `CHARSET_ENCODING'?
-     */
-    error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", &registry );
-    if ( !error )
-    {
-      error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding );
-      if ( !error )
-      {
-        if ( registry.type == BDF_PROPERTY_TYPE_ATOM &&
-             encoding.type == BDF_PROPERTY_TYPE_ATOM )
-        {
-          *acharset_encoding = encoding.u.atom;
-          *acharset_registry = registry.u.atom;
-        }
-        else
-          error = FT_THROW( Invalid_Argument );
-      }
-    }
-
-    return error;
-  }
-
-
-  FT_DEFINE_SERVICE_BDFRec(
-    sfnt_service_bdf,
-
-    (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 */
-
-
-  /*
-   *  SERVICE LIST
-   */
-
-#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,
-    FT_SERVICE_ID_BDF,                  &SFNT_SERVICE_BDF_GET,
-    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
-#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,
-    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
-#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,
-    FT_SERVICE_ID_TT_CMAP,              &TT_SERVICE_CMAP_INFO_GET )
-#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 )
-#endif
-
-
-  FT_CALLBACK_DEF( FT_Module_Interface )
-  sfnt_get_interface( FT_Module    module,
-                      const char*  module_interface )
-  {
-    /* SFNT_SERVICES_GET dereferences `library' in PIC mode */
-#ifdef FT_CONFIG_OPTION_PIC
-    FT_Library  library;
-
-
-    if ( !module )
-      return NULL;
-    library = module->library;
-    if ( !library )
-      return NULL;
-#else
-    FT_UNUSED( module );
-#endif
-
-    return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface );
-  }
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-#define PUT_EMBEDDED_BITMAPS( a )  a
-#else
-#define PUT_EMBEDDED_BITMAPS( a )  NULL
-#endif
-
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
-#define PUT_PS_NAMES( a )  a
-#else
-#define PUT_PS_NAMES( a )  NULL
-#endif
-
-  FT_DEFINE_SFNT_INTERFACE(
-    sfnt_interface,
-
-    tt_face_goto_table,     /* TT_Loader_GotoTableFunc goto_table      */
-
-    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_any,       /* TT_Load_Any_Func        load_any        */
-
-    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_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_GetKerningFunc  get_kerning     */
-
-    /* since version 2.2 */
-    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_Get_Metrics_Func     get_metrics     */
-
-    tt_face_get_name        /* TT_Get_Name_Func        get_name        */
-  )
-
-
-  FT_DEFINE_MODULE(
-    sfnt_module_class,
-
-    0,  /* not a font driver or renderer */
-    sizeof ( FT_ModuleRec ),
-
-    "sfnt",     /* driver name                            */
-    0x10000L,   /* driver version 1.0                     */
-    0x20000L,   /* driver requires FreeType 2.0 or higher */
-
-    (const void*)&SFNT_INTERFACE_GET,  /* module specific 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/third_party/freetype/src/sfnt/sfdriver.h b/third_party/freetype/src/sfnt/sfdriver.h
deleted file mode 100644
index 38710b6..0000000
--- a/third_party/freetype/src/sfnt/sfdriver.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfdriver.h                                                             */
-/*                                                                         */
-/*    High-level SFNT driver interface (specification).                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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 SFDRIVER_H_
-#define SFDRIVER_H_
-
-
-#include <ft2build.h>
-#include FT_MODULE_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_MODULE( sfnt_module_class )
-
-
-FT_END_HEADER
-
-#endif /* SFDRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sferrors.h b/third_party/freetype/src/sfnt/sferrors.h
deleted file mode 100644
index 3cf73d7..0000000
--- a/third_party/freetype/src/sfnt/sferrors.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sferrors.h                                                             */
-/*                                                                         */
-/*    SFNT error codes (specification only).                               */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the SFNT error enumeration constants.     */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef SFERRORS_H_
-#define SFERRORS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  SFNT_Err_
-#define FT_ERR_BASE    FT_Mod_Err_SFNT
-
-#include FT_ERRORS_H
-
-#endif /* SFERRORS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfnt.c b/third_party/freetype/src/sfnt/sfnt.c
deleted file mode 100644
index cffda6e..0000000
--- a/third_party/freetype/src/sfnt/sfnt.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfnt.c                                                                 */
-/*                                                                         */
-/*    Single object library component.                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "sfntpic.c"
-#include "ttload.c"
-#include "ttmtx.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 "ttpost.c"
-#endif
-
-#ifdef TT_CONFIG_OPTION_BDF
-#include "ttbdf.c"
-#endif
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfntpic.c b/third_party/freetype/src/sfnt/sfntpic.c
deleted file mode 100644
index 8eadd60..0000000
--- a/third_party/freetype/src/sfnt/sfntpic.c
+++ /dev/null
@@ -1,143 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfntpic.c                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for sfnt module.     */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "sfntpic.h"
-#include "sferrors.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from sfdriver.c */
-  FT_Error
-  FT_Create_Class_sfnt_services( FT_Library           library,
-                                 FT_ServiceDescRec**  output_class );
-  void
-  FT_Destroy_Class_sfnt_services( FT_Library          library,
-                                  FT_ServiceDescRec*  clazz );
-  void
-  FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec*  clazz );
-  void
-  FT_Init_Class_sfnt_interface( FT_Library       library,
-                                SFNT_Interface*  clazz );
-  void
-  FT_Init_Class_sfnt_service_glyph_dict(
-    FT_Library                library,
-    FT_Service_GlyphDictRec*  clazz );
-  void
-  FT_Init_Class_sfnt_service_ps_name(
-    FT_Library                 library,
-    FT_Service_PsFontNameRec*  clazz );
-  void
-  FT_Init_Class_tt_service_get_cmap_info(
-    FT_Library              library,
-    FT_Service_TTCMapsRec*  clazz );
-  void
-  FT_Init_Class_sfnt_service_sfnt_table(
-    FT_Service_SFNT_TableRec*  clazz );
-
-
-  /* forward declaration of PIC init functions from ttcmap.c */
-  FT_Error
-  FT_Create_Class_tt_cmap_classes( FT_Library       library,
-                                   TT_CMap_Class**  output_class );
-  void
-  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,
-                                    TT_CMap_Class*  clazz );
-
-
-  void
-  sfnt_module_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->sfnt )
-    {
-      sfntModulePIC*  container = (sfntModulePIC*)pic_container->sfnt;
-
-
-      if ( container->sfnt_services )
-        FT_Destroy_Class_sfnt_services( library,
-                                        container->sfnt_services );
-      container->sfnt_services = NULL;
-
-      if ( container->tt_cmap_classes )
-        FT_Destroy_Class_tt_cmap_classes( library,
-                                          container->tt_cmap_classes );
-      container->tt_cmap_classes = NULL;
-
-      FT_FREE( container );
-      pic_container->sfnt = NULL;
-    }
-  }
-
-
-  FT_Error
-  sfnt_module_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    sfntModulePIC*     container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->sfnt = container;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    error = FT_Create_Class_sfnt_services( library,
-                                           &container->sfnt_services );
-    if ( error )
-      goto Exit;
-
-    error = FT_Create_Class_tt_cmap_classes( library,
-                                             &container->tt_cmap_classes );
-    if ( error )
-      goto Exit;
-
-    FT_Init_Class_sfnt_service_glyph_dict(
-      library, &container->sfnt_service_glyph_dict );
-    FT_Init_Class_sfnt_service_ps_name(
-      library, &container->sfnt_service_ps_name );
-    FT_Init_Class_tt_service_get_cmap_info(
-      library, &container->tt_service_get_cmap_info );
-    FT_Init_Class_sfnt_service_sfnt_table(
-      &container->sfnt_service_sfnt_table );
-#ifdef TT_CONFIG_OPTION_BDF
-    FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf );
-#endif
-    FT_Init_Class_sfnt_interface( library, &container->sfnt_interface );
-
-  Exit:
-    if ( error )
-      sfnt_module_class_pic_free( library );
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfntpic.h b/third_party/freetype/src/sfnt/sfntpic.h
deleted file mode 100644
index 3afb668..0000000
--- a/third_party/freetype/src/sfnt/sfntpic.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfntpic.h                                                              */
-/*                                                                         */
-/*    The FreeType position independent code services for sfnt module.     */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 SFNTPIC_H_
-#define SFNTPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define SFNT_SERVICES_GET            sfnt_services
-#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 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
-#define SFNT_INTERFACE_GET           sfnt_interface
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-  /* some include files required for members of sfntModulePIC */
-#include FT_SERVICE_GLYPH_DICT_H
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_SFNT_H
-#include FT_SERVICE_TT_CMAP_H
-
-#ifdef TT_CONFIG_OPTION_BDF
-#include "ttbdf.h"
-#include FT_SERVICE_BDF_H
-#endif
-
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H
-#include "ttcmap.h"
-
-
-FT_BEGIN_HEADER
-
-  typedef struct  sfntModulePIC_
-  {
-    FT_ServiceDescRec*        sfnt_services;
-    FT_Service_GlyphDictRec   sfnt_service_glyph_dict;
-    FT_Service_PsFontNameRec  sfnt_service_ps_name;
-    FT_Service_TTCMapsRec     tt_service_get_cmap_info;
-    TT_CMap_Class*            tt_cmap_classes;
-    FT_Service_SFNT_TableRec  sfnt_service_sfnt_table;
-#ifdef TT_CONFIG_OPTION_BDF
-    FT_Service_BDFRec         sfnt_service_bdf;
-#endif
-    SFNT_Interface            sfnt_interface;
-
-  } sfntModulePIC;
-
-
-#define GET_PIC( lib )                                      \
-          ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) )
-
-#define SFNT_SERVICES_GET                       \
-          ( GET_PIC( library )->sfnt_services )
-#define SFNT_SERVICE_GLYPH_DICT_GET                       \
-          ( GET_PIC( library )->sfnt_service_glyph_dict )
-#define SFNT_SERVICE_PS_NAME_GET                       \
-          ( GET_PIC( library )->sfnt_service_ps_name )
-#define TT_SERVICE_CMAP_INFO_GET                           \
-          ( GET_PIC( library )->tt_service_get_cmap_info )
-#define TT_CMAP_CLASSES_GET                       \
-          ( GET_PIC( library )->tt_cmap_classes )
-#define SFNT_SERVICE_SFNT_TABLE_GET                       \
-          ( GET_PIC( library )->sfnt_service_sfnt_table )
-#define SFNT_SERVICE_BDF_GET                       \
-          ( GET_PIC( library )->sfnt_service_bdf )
-#define SFNT_INTERFACE_GET                       \
-          ( GET_PIC( library )->sfnt_interface )
-
-
-  /* see sfntpic.c for the implementation */
-  void
-  sfnt_module_class_pic_free( FT_Library  library );
-
-  FT_Error
-  sfnt_module_class_pic_init( FT_Library  library );
-
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-#endif /* SFNTPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfobjs.c b/third_party/freetype/src/sfnt/sfobjs.c
deleted file mode 100644
index 8ac868d..0000000
--- a/third_party/freetype/src/sfnt/sfobjs.c
+++ /dev/null
@@ -1,1700 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfobjs.c                                                               */
-/*                                                                         */
-/*    SFNT object management (base).                                       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "sfobjs.h"
-#include "ttload.h"
-#include "ttcmap.h"
-#include "ttkern.h"
-#include FT_INTERNAL_SFNT_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_TRUETYPE_IDS_H
-#include FT_TRUETYPE_TAGS_H
-#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
-#include "ttbdf.h"
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_sfobjs
-
-
-
-  /* convert a UTF-16 name entry to ASCII */
-  static FT_String*
-  tt_name_entry_ascii_from_utf16( TT_NameEntry  entry,
-                                  FT_Memory     memory )
-  {
-    FT_String*  string = NULL;
-    FT_UInt     len, code, n;
-    FT_Byte*    read   = (FT_Byte*)entry->string;
-    FT_Error    error;
-
-
-    len = (FT_UInt)entry->stringLength / 2;
-
-    if ( FT_NEW_ARRAY( string, len + 1 ) )
-      return NULL;
-
-    for ( n = 0; n < len; n++ )
-    {
-      code = FT_NEXT_USHORT( read );
-
-      if ( code == 0 )
-        break;
-
-      if ( code < 32 || code > 127 )
-        code = '?';
-
-      string[n] = (char)code;
-    }
-
-    string[n] = 0;
-
-    return string;
-  }
-
-
-  /* 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 )
-  {
-    FT_String*  string = NULL;
-    FT_UInt     len, code, n;
-    FT_Byte*    read   = (FT_Byte*)entry->string;
-    FT_Error    error;
-
-
-    len = (FT_UInt)entry->stringLength;
-
-    if ( FT_NEW_ARRAY( string, len + 1 ) )
-      return NULL;
-
-    for ( n = 0; n < len; n++ )
-    {
-      code = *read++;
-
-      if ( code == 0 )
-        break;
-
-      if ( code < 32 || code > 127 )
-        code = '?';
-
-      string[n] = (char)code;
-    }
-
-    string[n] = 0;
-
-    return string;
-  }
-
-
-  typedef FT_String*  (*TT_NameEntry_ConvertFunc)( TT_NameEntry  entry,
-                                                   FT_Memory     memory );
-
-
-  /* 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_Bool           is_english = 0;
-
-    TT_NameEntry_ConvertFunc  convert;
-
-
-    FT_ASSERT( name );
-
-    rec = face->name_table.names;
-    for ( n = 0; n < face->num_names; n++, rec++ )
-    {
-      /* According to the OpenType 1.3 specification, only Microsoft or  */
-      /* Apple platform IDs might be used in the `name' table.  The      */
-      /* `Unicode' platform is reserved for the `cmap' table, and the    */
-      /* `ISO' one is deprecated.                                        */
-      /*                                                                 */
-      /* However, the Apple TrueType specification doesn't say the same  */
-      /* thing and goes to suggest that all Unicode `name' table entries */
-      /* should be coded in UTF-16 (in big-endian format I suppose).     */
-      /*                                                                 */
-      if ( rec->nameID == nameid && rec->stringLength > 0 )
-      {
-        switch ( rec->platformID )
-        {
-        case TT_PLATFORM_APPLE_UNICODE:
-        case TT_PLATFORM_ISO:
-          /* there is `languageID' to check there.  We should use this */
-          /* field only as a last solution when nothing else is        */
-          /* available.                                                */
-          /*                                                           */
-          found_unicode = n;
-          break;
-
-        case TT_PLATFORM_MACINTOSH:
-          /* This is a bit special because some fonts will use either    */
-          /* an English language id, or a Roman encoding id, to indicate */
-          /* the English version of its font name.                       */
-          /*                                                             */
-          if ( rec->languageID == TT_MAC_LANGID_ENGLISH )
-            found_apple_english = n;
-          else if ( rec->encodingID == TT_MAC_ID_ROMAN )
-            found_apple_roman = n;
-          break;
-
-        case TT_PLATFORM_MICROSOFT:
-          /* we only take a non-English name when there is nothing */
-          /* else available in the font                            */
-          /*                                                       */
-          if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 )
-          {
-            switch ( rec->encodingID )
-            {
-            case TT_MS_ID_SYMBOL_CS:
-            case TT_MS_ID_UNICODE_CS:
-            case TT_MS_ID_UCS_4:
-              is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 );
-              found_win  = n;
-              break;
-
-            default:
-              ;
-            }
-          }
-          break;
-
-        default:
-          ;
-        }
-      }
-    }
-
-    found_apple = found_apple_roman;
-    if ( found_apple_english >= 0 )
-      found_apple = found_apple_english;
-
-    /* some fonts contain invalid Unicode or Macintosh formatted entries; */
-    /* we will thus favor names encoded in Windows formats if available   */
-    /* (provided it is an English name)                                   */
-    /*                                                                    */
-    convert = NULL;
-    if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) )
-    {
-      rec = face->name_table.names + found_win;
-      switch ( rec->encodingID )
-      {
-        /* 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;
-        break;
-
-      case TT_MS_ID_UCS_4:
-        /* Apparently, if this value is found in a name table entry, it is */
-        /* documented as `full Unicode repertoire'.  Experience with the   */
-        /* 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;
-        break;
-
-      default:
-        ;
-      }
-    }
-    else if ( found_apple >= 0 )
-    {
-      rec     = face->name_table.names + found_apple;
-      convert = tt_name_entry_ascii_from_other;
-    }
-    else if ( found_unicode >= 0 )
-    {
-      rec     = face->name_table.names + found_unicode;
-      convert = tt_name_entry_ascii_from_utf16;
-    }
-
-    if ( rec && convert )
-    {
-      if ( !rec->string )
-      {
-        FT_Stream  stream = face->name_table.stream;
-
-
-        if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) ||
-             FT_STREAM_SEEK( rec->stringOffset )              ||
-             FT_STREAM_READ( rec->string, rec->stringLength ) )
-        {
-          FT_FREE( rec->string );
-          rec->stringLength = 0;
-          result            = NULL;
-          goto Exit;
-        }
-      }
-
-      result = convert( rec, memory );
-    }
-
-  Exit:
-    *name = result;
-    return error;
-  }
-
-
-  static FT_Encoding
-  sfnt_find_encoding( int  platform_id,
-                      int  encoding_id )
-  {
-    typedef struct  TEncoding_
-    {
-      int          platform_id;
-      int          encoding_id;
-      FT_Encoding  encoding;
-
-    } TEncoding;
-
-    static
-    const TEncoding  tt_encodings[] =
-    {
-      { TT_PLATFORM_ISO,           -1,                  FT_ENCODING_UNICODE },
-
-      { TT_PLATFORM_APPLE_UNICODE, -1,                  FT_ENCODING_UNICODE },
-
-      { TT_PLATFORM_MACINTOSH,     TT_MAC_ID_ROMAN,     FT_ENCODING_APPLE_ROMAN },
-
-      { TT_PLATFORM_MICROSOFT,     TT_MS_ID_SYMBOL_CS,  FT_ENCODING_MS_SYMBOL },
-      { 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_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 }
-    };
-
-    const TEncoding  *cur, *limit;
-
-
-    cur   = tt_encodings;
-    limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] );
-
-    for ( ; cur < limit; cur++ )
-    {
-      if ( cur->platform_id == platform_id )
-      {
-        if ( cur->encoding_id == encoding_id ||
-             cur->encoding_id == -1          )
-          return cur->encoding;
-      }
-    }
-
-    return FT_ENCODING_NONE;
-  }
-
-
-#define WRITE_USHORT( p, v )                \
-          do                                \
-          {                                 \
-            *(p)++ = (FT_Byte)( (v) >> 8 ); \
-            *(p)++ = (FT_Byte)( (v) >> 0 ); \
-                                            \
-          } while ( 0 )
-
-#define WRITE_ULONG( p, v )                  \
-          do                                 \
-          {                                  \
-            *(p)++ = (FT_Byte)( (v) >> 24 ); \
-            *(p)++ = (FT_Byte)( (v) >> 16 ); \
-            *(p)++ = (FT_Byte)( (v) >>  8 ); \
-            *(p)++ = (FT_Byte)( (v) >>  0 ); \
-                                             \
-          } while ( 0 )
-
-
-  static void
-  sfnt_stream_close( FT_Stream  stream )
-  {
-    FT_Memory  memory = stream->memory;
-
-
-    FT_FREE( stream->base );
-
-    stream->size  = 0;
-    stream->base  = NULL;
-    stream->close = NULL;
-  }
-
-
-  FT_CALLBACK_DEF( int )
-  compare_offsets( const void*  a,
-                   const void*  b )
-  {
-    WOFF_Table  table1 = *(WOFF_Table*)a;
-    WOFF_Table  table2 = *(WOFF_Table*)b;
-
-    FT_ULong  offset1 = table1->Offset;
-    FT_ULong  offset2 = table2->Offset;
-
-
-    if ( offset1 > offset2 )
-      return 1;
-    else if ( offset1 < offset2 )
-      return -1;
-    else
-      return 0;
-  }
-
-
-  /* Replace `face->root.stream' with a stream containing the extracted */
-  /* SFNT of a WOFF font.                                               */
-
-  static FT_Error
-  woff_open_font( FT_Stream  stream,
-                  TT_Face    face )
-  {
-    FT_Memory       memory = stream->memory;
-    FT_Error        error  = FT_Err_Ok;
-
-    WOFF_HeaderRec  woff;
-    WOFF_Table      tables  = NULL;
-    WOFF_Table*     indices = NULL;
-
-    FT_ULong        woff_offset;
-
-    FT_Byte*        sfnt        = NULL;
-    FT_Stream       sfnt_stream = NULL;
-
-    FT_Byte*        sfnt_header;
-    FT_ULong        sfnt_offset;
-
-    FT_Int          nn;
-    FT_ULong        old_tag = 0;
-
-    static const FT_Frame_Field  woff_header_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  WOFF_HeaderRec
-
-      FT_FRAME_START( 44 ),
-        FT_FRAME_ULONG ( signature ),
-        FT_FRAME_ULONG ( flavor ),
-        FT_FRAME_ULONG ( length ),
-        FT_FRAME_USHORT( num_tables ),
-        FT_FRAME_USHORT( reserved ),
-        FT_FRAME_ULONG ( totalSfntSize ),
-        FT_FRAME_USHORT( majorVersion ),
-        FT_FRAME_USHORT( minorVersion ),
-        FT_FRAME_ULONG ( metaOffset ),
-        FT_FRAME_ULONG ( metaLength ),
-        FT_FRAME_ULONG ( metaOrigLength ),
-        FT_FRAME_ULONG ( privOffset ),
-        FT_FRAME_ULONG ( privLength ),
-      FT_FRAME_END
-    };
-
-
-    FT_ASSERT( stream == face->root.stream );
-    FT_ASSERT( FT_STREAM_POS() == 0 );
-
-    if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) )
-      return error;
-
-    /* Make sure we don't recurse back here or hit TTC code. */
-    if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf )
-      return FT_THROW( Invalid_Table );
-
-    /* Miscellaneous checks. */
-    if ( woff.length != stream->size                              ||
-         woff.num_tables == 0                                     ||
-         44 + woff.num_tables * 20UL >= woff.length               ||
-         12 + woff.num_tables * 16UL >= woff.totalSfntSize        ||
-         ( woff.totalSfntSize & 3 ) != 0                          ||
-         ( woff.metaOffset == 0 && ( woff.metaLength != 0     ||
-                                     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 );
-    }
-
-    /* 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;
-
-    /* Write sfnt header. */
-    {
-      FT_UInt  searchRange, entrySelector, rangeShift, x;
-
-
-      x             = woff.num_tables;
-      entrySelector = 0;
-      while ( x )
-      {
-        x            >>= 1;
-        entrySelector += 1;
-      }
-      entrySelector--;
-
-      searchRange = ( 1 << entrySelector ) * 16;
-      rangeShift  = woff.num_tables * 16 - searchRange;
-
-      WRITE_ULONG ( sfnt_header, woff.flavor );
-      WRITE_USHORT( sfnt_header, woff.num_tables );
-      WRITE_USHORT( sfnt_header, searchRange );
-      WRITE_USHORT( sfnt_header, entrySelector );
-      WRITE_USHORT( sfnt_header, rangeShift );
-    }
-
-    /* While the entries in the sfnt header must be sorted by the */
-    /* tag value, the tables themselves are not.  We thus have to */
-    /* sort them by offset and check that they don't overlap.     */
-
-    if ( FT_NEW_ARRAY( tables, woff.num_tables )  ||
-         FT_NEW_ARRAY( indices, woff.num_tables ) )
-      goto Exit;
-
-    FT_TRACE2(( "\n"
-                "  tag    offset    compLen  origLen  checksum\n"
-                "  -------------------------------------------\n" ));
-
-    if ( FT_FRAME_ENTER( 20L * woff.num_tables ) )
-      goto Exit;
-
-    for ( nn = 0; nn < woff.num_tables; nn++ )
-    {
-      WOFF_Table  table = tables + nn;
-
-      table->Tag        = FT_GET_TAG4();
-      table->Offset     = FT_GET_ULONG();
-      table->CompLength = FT_GET_ULONG();
-      table->OrigLength = FT_GET_ULONG();
-      table->CheckSum   = FT_GET_ULONG();
-
-      FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx  %08lx\n",
-                  (FT_Char)( table->Tag >> 24 ),
-                  (FT_Char)( table->Tag >> 16 ),
-                  (FT_Char)( table->Tag >> 8  ),
-                  (FT_Char)( table->Tag       ),
-                  table->Offset,
-                  table->CompLength,
-                  table->OrigLength,
-                  table->CheckSum ));
-
-      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;
-      }
-
-      old_tag     = table->Tag;
-      indices[nn] = table;
-    }
-
-    FT_FRAME_EXIT();
-
-    /* Sort by offset. */
-
-    ft_qsort( indices,
-              woff.num_tables,
-              sizeof ( WOFF_Table ),
-              compare_offsets );
-
-    /* Check offsets and lengths. */
-
-    woff_offset = 44 + woff.num_tables * 20L;
-    sfnt_offset = 12 + woff.num_tables * 16L;
-
-    for ( nn = 0; nn < woff.num_tables; nn++ )
-    {
-      WOFF_Table  table = indices[nn];
-
-
-      if ( table->Offset != woff_offset                         ||
-           table->CompLength > woff.length                      ||
-           table->Offset > woff.length - table->CompLength      ||
-           table->OrigLength > woff.totalSfntSize               ||
-           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;
-      }
-
-      table->OrigOffset = sfnt_offset;
-
-      /* The offsets must be multiples of 4. */
-      woff_offset += ( table->CompLength + 3 ) & ~3U;
-      sfnt_offset += ( table->OrigLength + 3 ) & ~3U;
-    }
-
-    /*
-     * Final checks!
-     *
-     * We don't decode and check the metadata block.
-     * We don't check table checksums either.
-     * But other than those, I think we implement all
-     * `MUST' checks from the spec.
-     */
-
-    if ( woff.metaOffset )
-    {
-      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;
-      }
-
-      /* We have padding only ... */
-      woff_offset += woff.metaLength;
-    }
-
-    if ( woff.privOffset )
-    {
-      /* ... if it isn't the last block. */
-      woff_offset = ( woff_offset + 3 ) & ~3U;
-
-      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;
-      }
-
-      /* No padding for the last block. */
-      woff_offset += woff.privLength;
-    }
-
-    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++ )
-    {
-      WOFF_Table  table = tables + nn;
-
-
-      /* Write SFNT table entry. */
-      WRITE_ULONG( sfnt_header, table->Tag );
-      WRITE_ULONG( sfnt_header, table->CheckSum );
-      WRITE_ULONG( sfnt_header, table->OrigOffset );
-      WRITE_ULONG( sfnt_header, table->OrigLength );
-
-      /* Write table data. */
-      if ( FT_STREAM_SEEK( table->Offset )     ||
-           FT_FRAME_ENTER( table->CompLength ) )
-        goto Exit;
-
-      if ( table->CompLength == table->OrigLength )
-      {
-        /* Uncompressed data; just copy. */
-        ft_memcpy( sfnt + table->OrigOffset,
-                   stream->cursor,
-                   table->OrigLength );
-      }
-      else
-      {
-#ifdef FT_CONFIG_OPTION_USE_ZLIB
-
-        /* Uncompress with zlib. */
-        FT_ULong  output_len = table->OrigLength;
-
-
-        error = FT_Gzip_Uncompress( memory,
-                                    sfnt + table->OrigOffset, &output_len,
-                                    stream->cursor, table->CompLength );
-        if ( error )
-          goto Exit;
-        if ( output_len != table->OrigLength )
-        {
-          FT_ERROR(( "woff_font_open: compressed table length mismatch\n" ));
-          error = FT_THROW( Invalid_Table );
-          goto Exit;
-        }
-
-#else /* !FT_CONFIG_OPTION_USE_ZLIB */
-
-        error = FT_THROW( Unimplemented_Feature );
-        goto Exit;
-
-#endif /* !FT_CONFIG_OPTION_USE_ZLIB */
-      }
-
-      FT_FRAME_EXIT();
-
-      /* We don't check whether the padding bytes in the WOFF file are     */
-      /* actually '\0'.  For the output, however, we do set them properly. */
-      sfnt_offset = table->OrigOffset + table->OrigLength;
-      while ( sfnt_offset & 3 )
-      {
-        sfnt[sfnt_offset] = '\0';
-        sfnt_offset++;
-      }
-    }
-
-    /* Ok!  Finally ready.  Swap out stream and return. */
-    FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize );
-    sfnt_stream->memory = stream->memory;
-    sfnt_stream->close  = sfnt_stream_close;
-
-    FT_Stream_Free(
-      face->root.stream,
-      ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 );
-
-    face->root.stream = sfnt_stream;
-
-    face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM;
-
-  Exit:
-    FT_FREE( tables );
-    FT_FREE( indices );
-
-    if ( error )
-    {
-      FT_FREE( sfnt );
-      FT_Stream_Close( sfnt_stream );
-      FT_FREE( sfnt_stream );
-    }
-
-    return error;
-  }
-
-
-#undef WRITE_USHORT
-#undef WRITE_ULONG
-
-
-  /* Fill in face->ttc_header.  If the font is not a TTC, it is */
-  /* synthesized into a TTC with one offset table.              */
-  static FT_Error
-  sfnt_open_font( FT_Stream  stream,
-                  TT_Face    face )
-  {
-    FT_Memory  memory = stream->memory;
-    FT_Error   error;
-    FT_ULong   tag, offset;
-
-    static const FT_Frame_Field  ttc_header_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TTC_HeaderRec
-
-      FT_FRAME_START( 8 ),
-        FT_FRAME_LONG( version ),
-        FT_FRAME_LONG( count   ),  /* this is ULong in the specs */
-      FT_FRAME_END
-    };
-
-
-    face->ttc_header.tag     = 0;
-    face->ttc_header.version = 0;
-    face->ttc_header.count   = 0;
-
-  retry:
-    offset = FT_STREAM_POS();
-
-    if ( FT_READ_ULONG( tag ) )
-      return error;
-
-    if ( tag == TTAG_wOFF )
-    {
-      FT_TRACE2(( "sfnt_open_font: file is a WOFF; synthesizing SFNT\n" ));
-
-      if ( FT_STREAM_SEEK( offset ) )
-        return error;
-
-      error = woff_open_font( stream, face );
-      if ( error )
-        return error;
-
-      /* Swap out stream and retry! */
-      stream = face->root.stream;
-      goto retry;
-    }
-
-    if ( tag != 0x00010000UL &&
-         tag != TTAG_ttcf    &&
-         tag != TTAG_OTTO    &&
-         tag != TTAG_true    &&
-         tag != TTAG_typ1    &&
-         tag != 0x00020000UL )
-    {
-      FT_TRACE2(( "  not a font using the SFNT container format\n" ));
-      return FT_THROW( Unknown_File_Format );
-    }
-
-    face->ttc_header.tag = TTAG_ttcf;
-
-    if ( tag == TTAG_ttcf )
-    {
-      FT_Int  n;
-
-
-      FT_TRACE3(( "sfnt_open_font: file is a collection\n" ));
-
-      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 );
-
-      /* a rough size estimate: let's conservatively assume that there   */
-      /* is just a single table info in each subfont header (12 + 16*1 = */
-      /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */
-      /* size of the TTC header plus `28*count' bytes for all subfont    */
-      /* headers                                                         */
-      if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) )
-        return FT_THROW( Array_Too_Large );
-
-      /* now read the offsets of each font in the file */
-      if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) )
-        return error;
-
-      if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) )
-        return error;
-
-      for ( n = 0; n < face->ttc_header.count; n++ )
-        face->ttc_header.offsets[n] = FT_GET_ULONG();
-
-      FT_FRAME_EXIT();
-    }
-    else
-    {
-      FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" ));
-
-      face->ttc_header.version = 1 << 16;
-      face->ttc_header.count   = 1;
-
-      if ( FT_NEW( face->ttc_header.offsets ) )
-        return error;
-
-      face->ttc_header.offsets[0] = offset;
-    }
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  sfnt_init_face( FT_Stream      stream,
-                  TT_Face        face,
-                  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_Int        face_index;
-
-
-    /* for now, parameters are unused */
-    FT_UNUSED( num_params );
-    FT_UNUSED( params );
-
-
-    sfnt = (SFNT_Service)face->sfnt;
-    if ( !sfnt )
-    {
-      sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
-      if ( !sfnt )
-      {
-        FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" ));
-        return FT_THROW( Missing_Module );
-      }
-
-      face->sfnt       = sfnt;
-      face->goto_table = sfnt->goto_table;
-    }
-
-    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 );
-    }
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, face->var, METRICS_VARIATIONS );
-#endif
-
-    FT_TRACE2(( "SFNT driver\n" ));
-
-    error = sfnt_open_font( stream, face );
-    if ( error )
-      return error;
-
-    /* Stream may have changed in sfnt_open_font. */
-    stream = face->root.stream;
-
-    FT_TRACE2(( "sfnt_init_face: %08p, %d\n", face, face_instance_index ));
-
-    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 )
-    {
-      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 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_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;
-
-
-      face->is_default_instance = 1;
-
-      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 ) /* count_size_pairs */             ||
-           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                    ||
-#if 0
-           /* fonts like `JamRegular.ttf' have an incorrect value for   */
-           /* `count_size_pairs'; since value 2 is hard-coded in `fvar' */
-           /* version 1.0, we simply ignore it                          */
-           count_size_pairs != 2                      ||
-#endif
-           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 > 0x7EFF                     ||
-           offset                          +
-             axis_size * num_axes          +
-             instance_size * num_instances > fvar_len )
-        num_instances = 0;
-      else
-        face->variation_support |= TT_FACE_FLAG_VAR_FVAR;
-
-      /* we don't support Multiple Master CFFs yet */
-      if ( !face->goto_table( face, TTAG_CFF, stream, 0 ) )
-        num_instances = 0;
-
-      /* we support at most 2^15 - 1 instances */
-      if ( num_instances >= ( 1U << 15 ) - 1 )
-      {
-        if ( face_instance_index >= 0 )
-          return FT_THROW( Invalid_Argument );
-        else
-          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_instance_index;
-
-    return error;
-  }
-
-
-#define LOAD_( x )                                          \
-  do                                                        \
-  {                                                         \
-    FT_TRACE2(( "`" #x "' " ));                             \
-    FT_TRACE3(( "-->\n" ));                                 \
-                                                            \
-    error = sfnt->load_ ## x( face, stream );               \
-                                                            \
-    FT_TRACE2(( "%s\n", ( !error )                          \
-                        ? "loaded"                          \
-                        : FT_ERR_EQ( error, Table_Missing ) \
-                          ? "missing"                       \
-                          : "failed to load" ));            \
-    FT_TRACE3(( "\n" ));                                    \
-  } while ( 0 )
-
-#define LOADM_( x, vertical )                               \
-  do                                                        \
-  {                                                         \
-    FT_TRACE2(( "`%s" #x "' ",                              \
-                vertical ? "vertical " : "" ));             \
-    FT_TRACE3(( "-->\n" ));                                 \
-                                                            \
-    error = sfnt->load_ ## x( face, stream, vertical );     \
-                                                            \
-    FT_TRACE2(( "%s\n", ( !error )                          \
-                        ? "loaded"                          \
-                        : FT_ERR_EQ( error, Table_Missing ) \
-                          ? "missing"                       \
-                          : "failed to load" ));            \
-    FT_TRACE3(( "\n" ));                                    \
-  } while ( 0 )
-
-#define GET_NAME( id, field )                                   \
-  do                                                            \
-  {                                                             \
-    error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \
-    if ( error )                                                \
-      goto Exit;                                                \
-  } while ( 0 )
-
-
-  FT_LOCAL_DEF( FT_Error )
-  sfnt_load_face( FT_Stream      stream,
-                  TT_Face        face,
-                  FT_Int         face_instance_index,
-                  FT_Int         num_params,
-                  FT_Parameter*  params )
-  {
-    FT_Error      error;
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
-    FT_Error      psnames_error;
-#endif
-    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;
-
-    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
-
-    FT_UNUSED( face_instance_index );
-
-
-    /* Check parameters */
-
-    {
-      FT_Int  i;
-
-
-      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;
-      }
-    }
-
-    /* Load tables */
-
-    /* We now support two SFNT-based bitmapped font formats.  They */
-    /* are recognized easily as they do not include a `glyf'       */
-    /* table.                                                      */
-    /*                                                             */
-    /* The first format comes from Apple, and uses a table named   */
-    /* `bhed' instead of `head' to store the font header (using    */
-    /* the same format).  It also doesn't include horizontal and   */
-    /* vertical metrics tables (i.e. `hhea' and `vhea' tables are  */
-    /* missing).                                                   */
-    /*                                                             */
-    /* The other format comes from Microsoft, and is used with     */
-    /* WinCE/PocketPC.  It looks like a standard TTF, except that  */
-    /* it doesn't contain outlines.                                */
-    /*                                                             */
-
-    FT_TRACE2(( "sfnt_load_face: %08p\n\n", face ));
-
-    /* do we have outlines in there? */
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    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 ) ||
-                           tt_face_lookup_table( face, TTAG_CFF )  ||
-                           tt_face_lookup_table( face, TTAG_CFF2 ) );
-#endif
-
-    is_apple_sbit = 0;
-    is_apple_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 );
-
-    /* Apple '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. */
-    if ( is_apple_sbix )
-      has_outline = FALSE;
-
-    /* if this font doesn't contain outlines, we try to load */
-    /* a `bhed' table                                        */
-    if ( !has_outline && sfnt->load_bhed )
-    {
-      LOAD_( bhed );
-      is_apple_sbit = FT_BOOL( !error );
-    }
-
-    /* load the font header (`head' table) if this isn't an Apple */
-    /* sbit font file                                             */
-    if ( !is_apple_sbit || is_apple_sbix )
-    {
-      LOAD_( head );
-      if ( error )
-        goto Exit;
-    }
-
-    if ( face->header.Units_Per_EM == 0 )
-    {
-      error = FT_THROW( Invalid_Table );
-
-      goto Exit;
-    }
-
-    /* the following tables are often not present in embedded TrueType */
-    /* fonts within PDF documents, so don't check for them.            */
-    LOAD_( maxp );
-    LOAD_( cmap );
-
-    /* the following tables are optional in PCL fonts -- */
-    /* don't check for errors                            */
-    LOAD_( name );
-    LOAD_( post );
-
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
-    psnames_error = error;
-#endif
-
-    /* do not load the metrics headers and tables if this is an Apple */
-    /* sbit font file                                                 */
-    if ( !is_apple_sbit )
-    {
-      /* load the `hhea' and `hmtx' tables */
-      LOADM_( hhea, 0 );
-      if ( !error )
-      {
-        LOADM_( hmtx, 0 );
-        if ( FT_ERR_EQ( error, Table_Missing ) )
-        {
-          error = FT_THROW( Hmtx_Table_Missing );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-          /* If this is an incrementally loaded font and there are */
-          /* overriding metrics, tolerate a missing `hmtx' table.  */
-          if ( face->root.internal->incremental_interface          &&
-               face->root.internal->incremental_interface->funcs->
-                 get_glyph_metrics                                 )
-          {
-            face->horizontal.number_Of_HMetrics = 0;
-            error                               = FT_Err_Ok;
-          }
-#endif
-        }
-      }
-      else if ( FT_ERR_EQ( error, Table_Missing ) )
-      {
-        /* No `hhea' table necessary for SFNT Mac fonts. */
-        if ( face->format_tag == TTAG_true )
-        {
-          FT_TRACE2(( "This is an SFNT Mac font.\n" ));
-
-          has_outline = 0;
-          error       = FT_Err_Ok;
-        }
-        else
-        {
-          error = FT_THROW( Horiz_Header_Missing );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-          /* If this is an incrementally loaded font and there are */
-          /* overriding metrics, tolerate a missing `hhea' table.  */
-          if ( face->root.internal->incremental_interface          &&
-               face->root.internal->incremental_interface->funcs->
-                 get_glyph_metrics                                 )
-          {
-            face->horizontal.number_Of_HMetrics = 0;
-            error                               = FT_Err_Ok;
-          }
-#endif
-
-        }
-      }
-
-      if ( error )
-        goto Exit;
-
-      /* try to load the `vhea' and `vmtx' tables */
-      LOADM_( hhea, 1 );
-      if ( !error )
-      {
-        LOADM_( hmtx, 1 );
-        if ( !error )
-          face->vertical_info = 1;
-      }
-
-      if ( error && FT_ERR_NEQ( error, Table_Missing ) )
-        goto Exit;
-
-      LOAD_( os2 );
-      if ( error )
-      {
-        /* we treat the table as missing if there are any errors */
-        face->os2.version = 0xFFFFU;
-      }
-    }
-
-    /* the optional tables */
-
-    /* embedded bitmap support */
-    if ( sfnt->load_eblc )
-      LOAD_( eblc );
-
-    /* consider the pclt, kerning, and gasp tables as optional */
-    LOAD_( pclt );
-    LOAD_( gasp );
-    LOAD_( kern );
-
-    face->root.num_glyphs = face->max_profile.numGlyphs;
-
-    /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes  */
-    /* a WWS-only font face.  `WWS' stands for `weight', width', and */
-    /* `slope', a term used by Microsoft's Windows Presentation      */
-    /* Foundation (WPF).  This flag has been introduced in version   */
-    /* 1.5 of the OpenType specification (May 2008).                 */
-
-    face->root.family_name = NULL;
-    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 ( !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 ( !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 )
-        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 )
-        GET_NAME( FONT_SUBFAMILY, &face->root.style_name );
-    }
-
-    /* now set up root fields */
-    {
-      FT_Face  root  = &face->root;
-      FT_Long  flags = root->face_flags;
-
-
-      /*********************************************************************/
-      /*                                                                   */
-      /* Compute face flags.                                               */
-      /*                                                                   */
-      if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC ||
-           face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX )
-        flags |= FT_FACE_FLAG_COLOR;      /* color glyphs */
-
-      if ( has_outline == TRUE )
-        flags |= FT_FACE_FLAG_SCALABLE;   /* scalable outlines */
-
-      /* The sfnt driver only supports bitmap fonts natively, thus we */
-      /* don't set FT_FACE_FLAG_HINTER.                               */
-      flags |= FT_FACE_FLAG_SFNT       |  /* SFNT file format  */
-               FT_FACE_FLAG_HORIZONTAL;   /* horizontal data   */
-
-#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES
-      if ( !psnames_error                             &&
-           face->postscript.FormatType != 0x00030000L )
-        flags |= FT_FACE_FLAG_GLYPH_NAMES;
-#endif
-
-      /* fixed width font? */
-      if ( face->postscript.isFixedPitch )
-        flags |= FT_FACE_FLAG_FIXED_WIDTH;
-
-      /* vertical information? */
-      if ( face->vertical_info )
-        flags |= FT_FACE_FLAG_VERTICAL;
-
-      /* kerning available ? */
-      if ( TT_FACE_HAS_KERNING( face ) )
-        flags |= FT_FACE_FLAG_KERNING;
-
-#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 ( 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;
-
-      /*********************************************************************/
-      /*                                                                   */
-      /* Compute style flags.                                              */
-      /*                                                                   */
-
-      flags = 0;
-      if ( has_outline == TRUE && face->os2.version != 0xFFFFU )
-      {
-        /* We have an OS/2 table; use the `fsSelection' field.  Bit 9 */
-        /* indicates an oblique font face.  This flag has been        */
-        /* introduced in version 1.5 of the OpenType specification.   */
-
-        if ( face->os2.fsSelection & 512 )       /* bit 9 */
-          flags |= FT_STYLE_FLAG_ITALIC;
-        else if ( face->os2.fsSelection & 1 )    /* bit 0 */
-          flags |= FT_STYLE_FLAG_ITALIC;
-
-        if ( face->os2.fsSelection & 32 )        /* bit 5 */
-          flags |= FT_STYLE_FLAG_BOLD;
-      }
-      else
-      {
-        /* this is an old Mac font, use the header field */
-
-        if ( face->header.Mac_Style & 1 )
-          flags |= FT_STYLE_FLAG_BOLD;
-
-        if ( face->header.Mac_Style & 2 )
-          flags |= FT_STYLE_FLAG_ITALIC;
-      }
-
-      root->style_flags |= flags;
-
-      /*********************************************************************/
-      /*                                                                   */
-      /* Polish the charmaps.                                              */
-      /*                                                                   */
-      /*   Try to set the charmap encoding according to the platform &     */
-      /*   encoding ID of each charmap.                                    */
-      /*                                                                   */
-
-      tt_face_build_cmaps( face );  /* ignore errors */
-
-
-      /* set the encoding fields */
-      {
-        FT_Int  m;
-
-
-        for ( m = 0; m < root->num_charmaps; m++ )
-        {
-          FT_CharMap  charmap = root->charmaps[m];
-
-
-          charmap->encoding = sfnt_find_encoding( charmap->platform_id,
-                                                  charmap->encoding_id );
-
-#if 0
-          if ( !root->charmap                           &&
-               charmap->encoding == FT_ENCODING_UNICODE )
-          {
-            /* set 'root->charmap' to the first Unicode encoding we find */
-            root->charmap = charmap;
-          }
-#endif
-        }
-      }
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-      /*
-       *  Now allocate the root array of FT_Bitmap_Size records and
-       *  populate them.  Unfortunately, it isn't possible to indicate bit
-       *  depths in the FT_Bitmap_Size record.  This is a design error.
-       */
-      {
-        FT_UInt  count;
-
-
-        count = face->sbit_num_strikes;
-
-        if ( count > 0 )
-        {
-          FT_Memory        memory   = face->root.stream->memory;
-          FT_UShort        em_size  = face->header.Units_Per_EM;
-          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 )
-          {
-            avgwidth = 1;
-            em_size = 1;
-          }
-
-          /* 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;
-
-          bsize_idx = 0;
-          for ( strike_idx = 0; strike_idx < count; strike_idx++ )
-          {
-            FT_Bitmap_Size*  bsize = root->available_sizes + bsize_idx;
-
-
-            error = sfnt->load_strike_metrics( face, strike_idx, &metrics );
-            if ( error )
-              continue;
-
-            bsize->height = (FT_Short)( metrics.height >> 6 );
-            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;
-          }
-
-          /* 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;
-          }
-        }
-      }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-      /* a font with no bitmaps and no outlines is scalable; */
-      /* it has only empty glyphs then                       */
-      if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) )
-        root->face_flags |= FT_FACE_FLAG_SCALABLE;
-
-
-      /*********************************************************************/
-      /*                                                                   */
-      /*  Set up metrics.                                                  */
-      /*                                                                   */
-      if ( FT_IS_SCALABLE( root ) )
-      {
-        /* XXX What about if outline header is missing */
-        /*     (e.g. sfnt wrapped bitmap)?             */
-        root->bbox.xMin    = face->header.xMin;
-        root->bbox.yMin    = face->header.yMin;
-        root->bbox.xMax    = face->header.xMax;
-        root->bbox.yMax    = face->header.yMax;
-        root->units_per_EM = face->header.Units_Per_EM;
-
-
-        /* XXX: Computing the ascender/descender/height is very different */
-        /*      from what the specification tells you.  Apparently, we    */
-        /*      must be careful because                                   */
-        /*                                                                */
-        /*      - not all fonts have an OS/2 table; in this case, we take */
-        /*        the values in the horizontal header.  However, these    */
-        /*        values very often are not reliable.                     */
-        /*                                                                */
-        /*      - otherwise, the correct typographic values are in the    */
-        /*        sTypoAscender, sTypoDescender & sTypoLineGap fields.    */
-        /*                                                                */
-        /*        However, certain fonts have these fields set to 0.      */
-        /*        Rather, they have usWinAscent & usWinDescent correctly  */
-        /*        set (but with different values).                        */
-        /*                                                                */
-        /*      As an example, Arial Narrow is implemented through four   */
-        /*      files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */
-        /*                                                                */
-        /*      Strangely, all fonts have the same values in their        */
-        /*      sTypoXXX fields, except ARIALNB which sets them to 0.     */
-        /*                                                                */
-        /*      On the other hand, they all have different                */
-        /*      usWinAscent/Descent values -- as a conclusion, the OS/2   */
-        /*      table cannot be used to compute the text height reliably! */
-        /*                                                                */
-
-        /* The ascender and descender are taken from the `hhea' table. */
-        /* If zero, they are taken from the `OS/2' table.              */
-
-        root->ascender  = face->horizontal.Ascender;
-        root->descender = face->horizontal.Descender;
-
-        root->height = root->ascender - root->descender +
-                       face->horizontal.Line_Gap;
-
-        if ( !( root->ascender || root->descender ) )
-        {
-          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->max_advance_width  =
-          (FT_Short)face->horizontal.advance_Width_Max;
-        root->max_advance_height =
-          (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.  */
-        root->underline_position  = face->postscript.underlinePosition -
-                                    face->postscript.underlineThickness / 2;
-        root->underline_thickness = face->postscript.underlineThickness;
-      }
-
-    }
-
-  Exit:
-    FT_TRACE2(( "sfnt_load_face: done\n" ));
-
-    return error;
-  }
-
-
-#undef LOAD_
-#undef LOADM_
-#undef GET_NAME
-
-
-  FT_LOCAL_DEF( void )
-  sfnt_done_face( TT_Face  face )
-  {
-    FT_Memory     memory;
-    SFNT_Service  sfnt;
-
-
-    if ( !face )
-      return;
-
-    memory = face->root.memory;
-    sfnt   = (SFNT_Service)face->sfnt;
-
-    if ( sfnt )
-    {
-      /* destroy the postscript names table if it is loaded */
-      if ( sfnt->free_psnames )
-        sfnt->free_psnames( face );
-
-      /* destroy the embedded bitmaps table if it is loaded */
-      if ( sfnt->free_eblc )
-        sfnt->free_eblc( face );
-    }
-
-#ifdef TT_CONFIG_OPTION_BDF
-    /* freeing the embedded BDF properties */
-    tt_face_free_bdf_props( face );
-#endif
-
-    /* freeing the kerning table */
-    tt_face_done_kern( face );
-
-    /* freeing the collection table */
-    FT_FREE( face->ttc_header.offsets );
-    face->ttc_header.count = 0;
-
-    /* freeing table directory */
-    FT_FREE( face->dir_tables );
-    face->num_tables = 0;
-
-    {
-      FT_Stream  stream = FT_FACE_STREAM( face );
-
-
-      /* simply release the 'cmap' table frame */
-      FT_FRAME_RELEASE( face->cmap_table );
-      face->cmap_size = 0;
-    }
-
-    face->horz_metrics_size = 0;
-    face->vert_metrics_size = 0;
-
-    /* freeing vertical metrics, if any */
-    if ( face->vertical_info )
-    {
-      FT_FREE( face->vertical.long_metrics  );
-      FT_FREE( face->vertical.short_metrics );
-      face->vertical_info = 0;
-    }
-
-    /* freeing the gasp table */
-    FT_FREE( face->gasp.gaspRanges );
-    face->gasp.numRanges = 0;
-
-    /* freeing the name table */
-    if ( sfnt )
-      sfnt->free_name( face );
-
-    /* freeing family and style name */
-    FT_FREE( face->root.family_name );
-    FT_FREE( face->root.style_name );
-
-    /* freeing sbit size table */
-    FT_FREE( face->root.available_sizes );
-    FT_FREE( face->sbit_strike_map );
-    face->root.num_fixed_sizes = 0;
-
-    FT_FREE( face->postscript_name );
-
-    face->sfnt = NULL;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/sfobjs.h b/third_party/freetype/src/sfnt/sfobjs.h
deleted file mode 100644
index 7053814..0000000
--- a/third_party/freetype/src/sfnt/sfobjs.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  sfobjs.h                                                               */
-/*                                                                         */
-/*    SFNT object management (specification).                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 SFOBJS_H_
-#define SFOBJS_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_SFNT_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  sfnt_init_face( FT_Stream      stream,
-                  TT_Face        face,
-                  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_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_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttcmap.c b/third_party/freetype/src/sfnt/ttcmap.c
deleted file mode 100644
index 5afa6ae..0000000
--- a/third_party/freetype/src/sfnt/ttcmap.c
+++ /dev/null
@@ -1,3809 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttcmap.c                                                               */
-/*                                                                         */
-/*    TrueType character mapping table (cmap) support (body).              */
-/*                                                                         */
-/*  Copyright 2002-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include "sferrors.h"           /* must come before FT_INTERNAL_VALIDATE_H */
-
-#include FT_INTERNAL_VALIDATE_H
-#include FT_INTERNAL_STREAM_H
-#include "ttload.h"
-#include "ttcmap.h"
-#include "sfntpic.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_ttcmap
-
-
-#define TT_PEEK_SHORT   FT_PEEK_SHORT
-#define TT_PEEK_USHORT  FT_PEEK_USHORT
-#define TT_PEEK_UINT24  FT_PEEK_UOFF3
-#define TT_PEEK_LONG    FT_PEEK_LONG
-#define TT_PEEK_ULONG   FT_PEEK_ULONG
-
-#define TT_NEXT_SHORT   FT_NEXT_SHORT
-#define TT_NEXT_USHORT  FT_NEXT_USHORT
-#define TT_NEXT_UINT24  FT_NEXT_UOFF3
-#define TT_NEXT_LONG    FT_NEXT_LONG
-#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 )
-  {
-    cmap->data = table;
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                           FORMAT 0                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET         TYPE          DESCRIPTION                */
-  /*                                                                       */
-  /*   format      0              USHORT        must be 0                  */
-  /*   length      2              USHORT        table length in bytes      */
-  /*   language    4              USHORT        Mac language code          */
-  /*   glyph_ids   6              BYTE[256]     array of glyph indices     */
-  /*               262                                                     */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_0
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap0_validate( FT_Byte*      table,
-                     FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_UInt   length;
-
-
-    if ( table + 2 + 2 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 2;           /* skip format */
-    length = TT_NEXT_USHORT( p );
-
-    if ( table + length > valid->limit || length < 262 )
-      FT_INVALID_TOO_SHORT;
-
-    /* check glyph indices whenever necessary */
-    if ( valid->level >= FT_VALIDATE_TIGHT )
-    {
-      FT_UInt  n, idx;
-
-
-      p = table + 6;
-      for ( n = 0; n < 256; n++ )
-      {
-        idx = *p++;
-        if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
-          FT_INVALID_GLYPH_ID;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap0_char_index( TT_CMap    cmap,
-                       FT_UInt32  char_code )
-  {
-    FT_Byte*  table = cmap->data;
-
-
-    return char_code < 256 ? table[6 + char_code] : 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap0_char_next( TT_CMap     cmap,
-                      FT_UInt32  *pchar_code )
-  {
-    FT_Byte*   table    = cmap->data;
-    FT_UInt32  charcode = *pchar_code;
-    FT_UInt32  result   = 0;
-    FT_UInt    gindex   = 0;
-
-
-    table += 6;  /* go to glyph IDs */
-    while ( ++charcode < 256 )
-    {
-      gindex = table[charcode];
-      if ( gindex != 0 )
-      {
-        result = charcode;
-        break;
-      }
-    }
-
-    *pchar_code = result;
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap0_get_info( TT_CMap       cmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 4;
-
-
-    cmap_info->format   = 0;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap0_class_rec,
-
-      sizeof ( TT_CMapRec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap0_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_0 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 2                             *****/
-  /*****                                                               *****/
-  /***** This is used for certain CJK encodings that encode text in a  *****/
-  /***** 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).    *****/
-  /*****                                                               *****/
-  /***** * Certain byte values signal the first byte of a 2-byte       *****/
-  /*****   character code (but these values are also valid as the      *****/
-  /*****   second byte of a 2-byte character).                         *****/
-  /*****                                                               *****/
-  /***** The following charmap lookup and iteration functions all      *****/
-  /***** assume that the value `charcode' fulfills the following.      *****/
-  /*****                                                               *****/
-  /*****   - 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 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 checks the        *****/
-  /***** arguments.                                                    *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET         TYPE            DESCRIPTION              */
-  /*                                                                       */
-  /*   format      0              USHORT          must be 2                */
-  /*   length      2              USHORT          table length in bytes    */
-  /*   language    4              USHORT          Mac language code        */
-  /*   keys        6              USHORT[256]     sub-header keys          */
-  /*   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 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'     */
-  /* table, i.e., it is the corresponding sub-header index multiplied      */
-  /* by 8.                                                                 */
-  /*                                                                       */
-  /* Each sub-header has the following format.                             */
-  /*                                                                       */
-  /*   NAME        OFFSET      TYPE            DESCRIPTION                 */
-  /*                                                                       */
-  /*   first       0           USHORT          first valid low-byte        */
-  /*   count       2           USHORT          number of valid low-bytes   */
-  /*   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' */
-  /* 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.                       */
-  /*                                                                       */
-  /* * 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).  */
-  /*                                                                       */
-  /* * 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      */
-  /*   added to it (modulo 65536) to form a new glyph index.               */
-  /*                                                                       */
-  /* It is up to the validation routine to check that all offsets fall     */
-  /* within the glyph IDs table (and not within the `subs' table itself or */
-  /* outside of the CMap).                                                 */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_2
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap2_validate( FT_Byte*      table,
-                     FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_UInt   length;
-
-    FT_UInt   n, max_subs;
-    FT_Byte*  keys;        /* keys table     */
-    FT_Byte*  subs;        /* sub-headers    */
-    FT_Byte*  glyph_ids;   /* glyph ID array */
-
-
-    if ( table + 2 + 2 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 2;           /* skip format */
-    length = TT_NEXT_USHORT( p );
-
-    if ( table + length > valid->limit || length < 6 + 512 )
-      FT_INVALID_TOO_SHORT;
-
-    keys = table + 6;
-
-    /* parse keys to compute sub-headers count */
-    p        = keys;
-    max_subs = 0;
-    for ( n = 0; n < 256; n++ )
-    {
-      FT_UInt  idx = TT_NEXT_USHORT( p );
-
-
-      /* value must be multiple of 8 */
-      if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 )
-        FT_INVALID_DATA;
-
-      idx >>= 3;
-
-      if ( idx > max_subs )
-        max_subs = idx;
-    }
-
-    FT_ASSERT( p == table + 518 );
-
-    subs      = p;
-    glyph_ids = subs + ( max_subs + 1 ) * 8;
-    if ( glyph_ids > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    /* parse sub-headers */
-    for ( n = 0; n <= max_subs; n++ )
-    {
-      FT_UInt  first_code, code_count, offset;
-      FT_Int   delta;
-
-
-      first_code = TT_NEXT_USHORT( p );
-      code_count = TT_NEXT_USHORT( p );
-      delta      = TT_NEXT_SHORT( p );
-      offset     = TT_NEXT_USHORT( p );
-
-      /* many Dynalab fonts have empty sub-headers */
-      if ( code_count == 0 )
-        continue;
-
-      /* check range within 0..255 */
-      if ( valid->level >= FT_VALIDATE_PARANOID )
-      {
-        if ( first_code >= 256 || first_code + code_count > 256 )
-          FT_INVALID_DATA;
-      }
-
-      /* check offset */
-      if ( offset != 0 )
-      {
-        FT_Byte*  ids;
-
-
-        ids = p - 2 + offset;
-        if ( ids < glyph_ids || ids + code_count * 2 > table + length )
-          FT_INVALID_OFFSET;
-
-        /* check glyph IDs */
-        if ( valid->level >= FT_VALIDATE_TIGHT )
-        {
-          FT_Byte*  limit = p + code_count * 2;
-          FT_UInt   idx;
-
-
-          for ( ; p < limit; )
-          {
-            idx = TT_NEXT_USHORT( p );
-            if ( idx != 0 )
-            {
-              idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU;
-              if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
-                FT_INVALID_GLYPH_ID;
-            }
-          }
-        }
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* return sub header corresponding to a given character code */
-  /* NULL on invalid charcode                                  */
-  static FT_Byte*
-  tt_cmap2_get_subheader( FT_Byte*   table,
-                          FT_UInt32  char_code )
-  {
-    FT_Byte*  result = NULL;
-
-
-    if ( char_code < 0x10000UL )
-    {
-      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*  subs    = table + 518;  /* subheaders table */
-      FT_Byte*  sub;
-
-
-      if ( char_hi == 0 )
-      {
-        /* an 8-bit character code -- we use subHeader 0 in this case */
-        /* to test whether the character code is in the charmap       */
-        /*                                                            */
-        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                                 */
-        /*                                                     */
-        p += char_lo * 2;
-        if ( TT_PEEK_USHORT( p ) != 0 )
-          goto Exit;
-      }
-      else
-      {
-        /* a 16-bit character code */
-
-        /* jump to key entry  */
-        p  += char_hi * 2;
-        /* jump to sub-header */
-        sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) );
-
-        /* check that the high byte isn't a valid one-byte value */
-        if ( sub == subs )
-          goto Exit;
-      }
-      result = sub;
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap2_char_index( TT_CMap    cmap,
-                       FT_UInt32  char_code )
-  {
-    FT_Byte*  table   = cmap->data;
-    FT_UInt   result  = 0;
-    FT_Byte*  subheader;
-
-
-    subheader = tt_cmap2_get_subheader( table, char_code );
-    if ( subheader )
-    {
-      FT_Byte*  p   = subheader;
-      FT_UInt   idx = (FT_UInt)(char_code & 0xFF);
-      FT_UInt   start, count;
-      FT_Int    delta;
-      FT_UInt   offset;
-
-
-      start  = TT_NEXT_USHORT( p );
-      count  = TT_NEXT_USHORT( p );
-      delta  = TT_NEXT_SHORT ( p );
-      offset = TT_PEEK_USHORT( p );
-
-      idx -= start;
-      if ( idx < count && offset != 0 )
-      {
-        p  += offset + 2 * idx;
-        idx = TT_PEEK_USHORT( p );
-
-        if ( idx != 0 )
-          result = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU;
-      }
-    }
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap2_char_next( TT_CMap     cmap,
-                      FT_UInt32  *pcharcode )
-  {
-    FT_Byte*   table    = cmap->data;
-    FT_UInt    gindex   = 0;
-    FT_UInt32  result   = 0;
-    FT_UInt32  charcode = *pcharcode + 1;
-    FT_Byte*   subheader;
-
-
-    while ( charcode < 0x10000UL )
-    {
-      subheader = tt_cmap2_get_subheader( table, charcode );
-      if ( subheader )
-      {
-        FT_Byte*  p       = subheader;
-        FT_UInt   start   = TT_NEXT_USHORT( p );
-        FT_UInt   count   = TT_NEXT_USHORT( p );
-        FT_Int    delta   = TT_NEXT_SHORT ( p );
-        FT_UInt   offset  = TT_PEEK_USHORT( p );
-        FT_UInt   char_lo = (FT_UInt)( charcode & 0xFF );
-        FT_UInt   pos, idx;
-
-
-        if ( offset == 0 )
-          goto Next_SubHeader;
-
-        if ( char_lo < start )
-        {
-          char_lo = start;
-          pos     = 0;
-        }
-        else
-          pos = (FT_UInt)( char_lo - start );
-
-        p       += offset + pos * 2;
-        charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo;
-
-        for ( ; pos < count; pos++, charcode++ )
-        {
-          idx = TT_NEXT_USHORT( p );
-
-          if ( idx != 0 )
-          {
-            gindex = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU;
-            if ( gindex != 0 )
-            {
-              result = charcode;
-              goto Exit;
-            }
-          }
-        }
-      }
-
-      /* jump to next sub-header, i.e. higher byte value */
-    Next_SubHeader:
-      charcode = FT_PAD_FLOOR( charcode, 256 ) + 256;
-    }
-
-  Exit:
-    *pcharcode = result;
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap2_get_info( TT_CMap       cmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 4;
-
-
-    cmap_info->format   = 2;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap2_class_rec,
-
-      sizeof ( TT_CMapRec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap2_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_2 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                           FORMAT 4                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME          OFFSET         TYPE              DESCRIPTION          */
-  /*                                                                       */
-  /*   format        0              USHORT            must be 4            */
-  /*   length        2              USHORT            table length         */
-  /*                                                  in bytes             */
-  /*   language      4              USHORT            Mac language code    */
-  /*                                                                       */
-  /*   segCountX2    6              USHORT            2*NUM_SEGS           */
-  /*   searchRange   8              USHORT            2*(1 << LOG_SEGS)    */
-  /*   entrySelector 10             USHORT            LOG_SEGS             */
-  /*   rangeShift    12             USHORT            segCountX2 -         */
-  /*                                                    searchRange        */
-  /*                                                                       */
-  /*   endCount      14             USHORT[NUM_SEGS]  end charcode for     */
-  /*                                                  each segment; last   */
-  /*                                                  is 0xFFFF            */
-  /*                                                                       */
-  /*   pad           14+NUM_SEGS*2  USHORT            padding              */
-  /*                                                                       */
-  /*   startCount    16+NUM_SEGS*2  USHORT[NUM_SEGS]  first charcode for   */
-  /*                                                  each segment         */
-  /*                                                                       */
-  /*   idDelta       16+NUM_SEGS*4  SHORT[NUM_SEGS]   delta for each       */
-  /*                                                  segment              */
-  /*   idOffset      16+NUM_SEGS*6  SHORT[NUM_SEGS]   range offset for     */
-  /*                                                  each segment; can be */
-  /*                                                  zero                 */
-  /*                                                                       */
-  /*   glyphIds      16+NUM_SEGS*8  USHORT[]          array of glyph ID    */
-  /*                                                  ranges               */
-  /*                                                                       */
-  /* Character codes are modelled by a series of ordered (increasing)      */
-  /* intervals called segments.  Each segment has start and end codes,     */
-  /* provided by the `startCount' and `endCount' arrays.  Segments must    */
-  /* not overlap, and the last segment should always contain the value     */
-  /* 0xFFFF for `endCount'.                                                */
-  /*                                                                       */
-  /* The fields `searchRange', `entrySelector' and `rangeShift' are better */
-  /* ignored (they are traces of over-engineering in the TrueType          */
-  /* specification).                                                       */
-  /*                                                                       */
-  /* Each segment also has a signed `delta', as well as an optional offset */
-  /* within the `glyphIds' table.                                          */
-  /*                                                                       */
-  /* If a segment's idOffset is 0, the glyph index corresponding to any    */
-  /* charcode within the segment is obtained by adding the value of        */
-  /* `idDelta' directly to the charcode, modulo 65536.                     */
-  /*                                                                       */
-  /* Otherwise, a glyph index is taken from the glyph IDs sub-array for    */
-  /* the segment, and the value of `idDelta' is added to it.               */
-  /*                                                                       */
-  /*                                                                       */
-  /* Finally, note that a lot of fonts contain an invalid last segment,    */
-  /* where `start' and `end' are correctly set to 0xFFFF but both `delta'  */
-  /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with     */
-  /* OpenOffice.org).  We need special code to deal with them correctly.   */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_4
-
-  typedef struct  TT_CMap4Rec_
-  {
-    TT_CMapRec  cmap;
-    FT_UInt32   cur_charcode;   /* current charcode */
-    FT_UInt     cur_gindex;     /* current glyph index */
-
-    FT_UInt     num_ranges;
-    FT_UInt     cur_range;
-    FT_UInt     cur_start;
-    FT_UInt     cur_end;
-    FT_Int      cur_delta;
-    FT_Byte*    cur_values;
-
-  } TT_CMap4Rec, *TT_CMap4;
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap4_init( TT_CMap4  cmap,
-                 FT_Byte*  table )
-  {
-    FT_Byte*  p;
-
-
-    cmap->cmap.data    = table;
-
-    p                  = table + 6;
-    cmap->num_ranges   = FT_PEEK_USHORT( p ) >> 1;
-    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
-    cmap->cur_gindex   = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Int
-  tt_cmap4_set_range( TT_CMap4  cmap,
-                      FT_UInt   range_index )
-  {
-    FT_Byte*  table = cmap->cmap.data;
-    FT_Byte*  p;
-    FT_UInt   num_ranges = cmap->num_ranges;
-
-
-    while ( range_index < num_ranges )
-    {
-      FT_UInt  offset;
-
-
-      p             = table + 14 + range_index * 2;
-      cmap->cur_end = FT_PEEK_USHORT( p );
-
-      p              += 2 + num_ranges * 2;
-      cmap->cur_start = FT_PEEK_USHORT( p );
-
-      p              += num_ranges * 2;
-      cmap->cur_delta = FT_PEEK_SHORT( p );
-
-      p     += num_ranges * 2;
-      offset = FT_PEEK_USHORT( p );
-
-      /* some fonts have an incorrect last segment; */
-      /* we have to catch it                        */
-      if ( range_index     >= num_ranges - 1 &&
-           cmap->cur_start == 0xFFFFU        &&
-           cmap->cur_end   == 0xFFFFU        )
-      {
-        TT_Face   face  = (TT_Face)cmap->cmap.cmap.charmap.face;
-        FT_Byte*  limit = face->cmap_table + face->cmap_size;
-
-
-        if ( offset && p + offset + 2 > limit )
-        {
-          cmap->cur_delta = 1;
-          offset          = 0;
-        }
-      }
-
-      if ( offset != 0xFFFFU )
-      {
-        cmap->cur_values = offset ? p + offset : NULL;
-        cmap->cur_range  = range_index;
-        return 0;
-      }
-
-      /* we skip empty segments */
-      range_index++;
-    }
-
-    return -1;
-  }
-
-
-  /* search the index of the charcode next to cmap->cur_charcode; */
-  /* caller should call tt_cmap4_set_range with proper range      */
-  /* before calling this function                                 */
-  /*                                                              */
-  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;
-
-
-    if ( cmap->cur_charcode >= 0xFFFFUL )
-      goto Fail;
-
-    charcode = (FT_UInt)cmap->cur_charcode + 1;
-
-    if ( charcode < cmap->cur_start )
-      charcode = cmap->cur_start;
-
-    for (;;)
-    {
-      FT_Byte*  values = cmap->cur_values;
-      FT_UInt   end    = cmap->cur_end;
-      FT_Int    delta  = cmap->cur_delta;
-
-
-      if ( charcode <= end )
-      {
-        if ( values )
-        {
-          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 )
-            {
-              gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU;
-              if ( gindex )
-              {
-                cmap->cur_charcode = charcode;
-                cmap->cur_gindex   = gindex;
-                return;
-              }
-            }
-          } while ( ++charcode <= end );
-        }
-        else
-        {
-          do
-          {
-            FT_UInt  gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU;
-
-
-            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;
-              return;
-            }
-          } while ( ++charcode <= end );
-        }
-      }
-
-    Next_Segment:
-      /* we need to find another range */
-      if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 )
-        break;
-
-      if ( charcode < cmap->cur_start )
-        charcode = cmap->cur_start;
-    }
-
-  Fail:
-    cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL;
-    cmap->cur_gindex   = 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap4_validate( FT_Byte*      table,
-                     FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_UInt   length;
-
-    FT_Byte   *ends, *starts, *offsets, *deltas, *glyph_ids;
-    FT_UInt   num_segs;
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( table + 2 + 2 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 2;           /* skip format */
-    length = TT_NEXT_USHORT( p );
-
-    /* in certain fonts, the `length' field is invalid and goes */
-    /* out of bound.  We try to correct this here...            */
-    if ( table + length > valid->limit )
-    {
-      if ( valid->level >= FT_VALIDATE_TIGHT )
-        FT_INVALID_TOO_SHORT;
-
-      length = (FT_UInt)( valid->limit - table );
-    }
-
-    if ( length < 16 )
-      FT_INVALID_TOO_SHORT;
-
-    p        = table + 6;
-    num_segs = TT_NEXT_USHORT( p );   /* read segCountX2 */
-
-    if ( valid->level >= FT_VALIDATE_PARANOID )
-    {
-      /* check that we have an even value here */
-      if ( num_segs & 1 )
-        FT_INVALID_DATA;
-    }
-
-    num_segs /= 2;
-
-    if ( length < 16 + num_segs * 2 * 4 )
-      FT_INVALID_TOO_SHORT;
-
-    /* check the search parameters - even though we never use them */
-    /*                                                             */
-    if ( valid->level >= FT_VALIDATE_PARANOID )
-    {
-      /* check the values of `searchRange', `entrySelector', `rangeShift' */
-      FT_UInt  search_range   = TT_NEXT_USHORT( p );
-      FT_UInt  entry_selector = TT_NEXT_USHORT( p );
-      FT_UInt  range_shift    = TT_NEXT_USHORT( p );
-
-
-      if ( ( search_range | range_shift ) & 1 )  /* must be even values */
-        FT_INVALID_DATA;
-
-      search_range /= 2;
-      range_shift  /= 2;
-
-      /* `search range' is the greatest power of 2 that is <= num_segs */
-
-      if ( search_range                > num_segs                 ||
-           search_range * 2            < num_segs                 ||
-           search_range + range_shift != num_segs                 ||
-           search_range               != ( 1U << entry_selector ) )
-        FT_INVALID_DATA;
-    }
-
-    ends      = table   + 14;
-    starts    = table   + 16 + num_segs * 2;
-    deltas    = starts  + num_segs * 2;
-    offsets   = deltas  + num_segs * 2;
-    glyph_ids = offsets + num_segs * 2;
-
-    /* check last segment; its end count value must be 0xFFFF */
-    if ( valid->level >= FT_VALIDATE_PARANOID )
-    {
-      p = ends + ( num_segs - 1 ) * 2;
-      if ( TT_PEEK_USHORT( p ) != 0xFFFFU )
-        FT_INVALID_DATA;
-    }
-
-    {
-      FT_UInt   start, end, offset, n;
-      FT_UInt   last_start = 0, last_end = 0;
-      FT_Int    delta;
-      FT_Byte*  p_start   = starts;
-      FT_Byte*  p_end     = ends;
-      FT_Byte*  p_delta   = deltas;
-      FT_Byte*  p_offset  = offsets;
-
-
-      for ( n = 0; n < num_segs; n++ )
-      {
-        p      = p_offset;
-        start  = TT_NEXT_USHORT( p_start );
-        end    = TT_NEXT_USHORT( p_end );
-        delta  = TT_NEXT_SHORT( p_delta );
-        offset = TT_NEXT_USHORT( p_offset );
-
-        if ( start > end )
-          FT_INVALID_DATA;
-
-        /* this test should be performed at default validation level; */
-        /* unfortunately, some popular Asian fonts have overlapping   */
-        /* ranges in their charmaps                                   */
-        /*                                                            */
-        if ( start <= last_end && n > 0 )
-        {
-          if ( valid->level >= FT_VALIDATE_TIGHT )
-            FT_INVALID_DATA;
-          else
-          {
-            /* allow overlapping segments, provided their start points */
-            /* and end points, respectively, are in ascending order    */
-            /*                                                         */
-            if ( last_start > start || last_end > end )
-              error |= TT_CMAP_FLAG_UNSORTED;
-            else
-              error |= TT_CMAP_FLAG_OVERLAPPING;
-          }
-        }
-
-        if ( offset && offset != 0xFFFFU )
-        {
-          p += offset;  /* start of glyph ID array */
-
-          /* check that we point within the glyph IDs table only */
-          if ( valid->level >= FT_VALIDATE_TIGHT )
-          {
-            if ( p < glyph_ids                                ||
-                 p + ( end - start + 1 ) * 2 > table + length )
-              FT_INVALID_DATA;
-          }
-          /* Some fonts handle the last segment incorrectly.  In */
-          /* theory, 0xFFFF might point to an ordinary glyph --  */
-          /* a cmap 4 is versatile and could be used for any     */
-          /* encoding, not only Unicode.  However, reality shows */
-          /* that far too many fonts are sloppy and incorrectly  */
-          /* set all fields but `start' and `end' for the last   */
-          /* segment if it contains only a single character.     */
-          /*                                                     */
-          /* We thus omit the test here, delaying it to the      */
-          /* routines that actually access the cmap.             */
-          else if ( n != num_segs - 1                       ||
-                    !( start == 0xFFFFU && end == 0xFFFFU ) )
-          {
-            if ( p < glyph_ids                              ||
-                 p + ( end - start + 1 ) * 2 > valid->limit )
-              FT_INVALID_DATA;
-          }
-
-          /* check glyph indices within the segment range */
-          if ( valid->level >= FT_VALIDATE_TIGHT )
-          {
-            FT_UInt  i, idx;
-
-
-            for ( i = start; i < end; i++ )
-            {
-              idx = FT_NEXT_USHORT( p );
-              if ( idx != 0 )
-              {
-                idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU;
-
-                if ( idx >= TT_VALID_GLYPH_COUNT( valid ) )
-                  FT_INVALID_GLYPH_ID;
-              }
-            }
-          }
-        }
-        else if ( offset == 0xFFFFU )
-        {
-          /* some fonts (erroneously?) use a range offset of 0xFFFF */
-          /* to mean missing glyph in cmap table                    */
-          /*                                                        */
-          if ( valid->level >= FT_VALIDATE_PARANOID    ||
-               n != num_segs - 1                       ||
-               !( start == 0xFFFFU && end == 0xFFFFU ) )
-            FT_INVALID_DATA;
-        }
-
-        last_start = start;
-        last_end   = end;
-      }
-    }
-
-    return error;
-  }
-
-
-  static FT_UInt
-  tt_cmap4_char_map_linear( TT_CMap     cmap,
-                            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;
-    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
-
-    num_segs = num_segs2 >> 1;
-
-    if ( !num_segs )
-      return 0;
-
-    if ( next )
-      charcode++;
-
-    if ( charcode > 0xFFFFU )
-      return 0;
-
-    /* linear search */
-    p = cmap->data + 14;               /* ends table   */
-    q = cmap->data + 16 + num_segs2;   /* starts table */
-
-    for ( i = 0; i < num_segs; i++ )
-    {
-      end   = TT_NEXT_USHORT( p );
-      start = TT_NEXT_USHORT( q );
-
-      if ( charcode < start )
-      {
-        if ( next )
-          charcode = start;
-        else
-          break;
-      }
-
-    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 )
-      *pcharcode = charcode;
-
-    return gindex;
-  }
-
-
-  static FT_UInt
-  tt_cmap4_char_map_binary( TT_CMap     cmap,
-                            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;
-    FT_UInt   charcode = (FT_UInt)*pcharcode;
-    FT_UInt   gindex   = 0;
-    FT_Byte*  p;
-
-
-    p = cmap->data + 6;
-    num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 );
-
-    if ( !num_segs2 )
-      return 0;
-
-    num_segs = num_segs2 >> 1;
-
-    /* make compiler happy */
-    mid = num_segs;
-    end = 0xFFFFU;
-
-    if ( next )
-      charcode++;
-
-    min = 0;
-    max = num_segs;
-
-    /* binary search */
-    while ( min < max )
-    {
-      mid    = ( min + max ) >> 1;
-      p      = cmap->data + 14 + mid * 2;
-      end    = TT_PEEK_USHORT( p );
-      p     += 2 + num_segs2;
-      start  = TT_PEEK_USHORT( p );
-
-      if ( charcode < start )
-        max = mid;
-      else if ( charcode > end )
-        min = mid + 1;
-      else
-      {
-        p     += 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 ( mid >= num_segs - 1                &&
-             start == 0xFFFFU && end == 0xFFFFU )
-        {
-          if ( offset && p + offset + 2 > limit )
-          {
-            delta  = 1;
-            offset = 0;
-          }
-        }
-
-        /* search the first segment containing `charcode' */
-        if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING )
-        {
-          FT_UInt  i;
-
-
-          /* call the current segment `max' */
-          max = mid;
-
-          if ( offset == 0xFFFFU )
-            mid = max + 1;
-
-          /* search in segments before the current segment */
-          for ( i = max; i > 0; i-- )
-          {
-            FT_UInt   prev_end;
-            FT_Byte*  old_p;
-
-
-            old_p    = p;
-            p        = cmap->data + 14 + ( i - 1 ) * 2;
-            prev_end = TT_PEEK_USHORT( p );
-
-            if ( charcode > prev_end )
-            {
-              p = old_p;
-              break;
-            }
-
-            end    = prev_end;
-            p     += 2 + num_segs2;
-            start  = TT_PEEK_USHORT( p );
-            p     += num_segs2;
-            delta  = TT_PEEK_SHORT( p );
-            p     += num_segs2;
-            offset = TT_PEEK_USHORT( p );
-
-            if ( offset != 0xFFFFU )
-              mid = i - 1;
-          }
-
-          /* no luck */
-          if ( mid == max + 1 )
-          {
-            if ( i != max )
-            {
-              p      = cmap->data + 14 + max * 2;
-              end    = TT_PEEK_USHORT( p );
-              p     += 2 + num_segs2;
-              start  = TT_PEEK_USHORT( p );
-              p     += num_segs2;
-              delta  = TT_PEEK_SHORT( p );
-              p     += num_segs2;
-              offset = TT_PEEK_USHORT( p );
-            }
-
-            mid = max;
-
-            /* search in segments after the current segment */
-            for ( i = max + 1; i < num_segs; i++ )
-            {
-              FT_UInt  next_end, next_start;
-
-
-              p          = cmap->data + 14 + i * 2;
-              next_end   = TT_PEEK_USHORT( p );
-              p         += 2 + num_segs2;
-              next_start = TT_PEEK_USHORT( p );
-
-              if ( charcode < next_start )
-                break;
-
-              end    = next_end;
-              start  = next_start;
-              p     += num_segs2;
-              delta  = TT_PEEK_SHORT( p );
-              p     += num_segs2;
-              offset = TT_PEEK_USHORT( p );
-
-              if ( offset != 0xFFFFU )
-                mid = i;
-            }
-            i--;
-
-            /* still no luck */
-            if ( mid == max )
-            {
-              mid = i;
-
-              break;
-            }
-          }
-
-          /* end, start, delta, and offset are for the i'th segment */
-          if ( mid != i )
-          {
-            p      = cmap->data + 14 + mid * 2;
-            end    = TT_PEEK_USHORT( p );
-            p     += 2 + num_segs2;
-            start  = TT_PEEK_USHORT( p );
-            p     += num_segs2;
-            delta  = TT_PEEK_SHORT( p );
-            p     += num_segs2;
-            offset = TT_PEEK_USHORT( p );
-          }
-        }
-        else
-        {
-          if ( offset == 0xFFFFU )
-            break;
-        }
-
-        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 )
-          {
-            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;
-      }
-    }
-
-    if ( next )
-    {
-      TT_CMap4  cmap4 = (TT_CMap4)cmap;
-
-
-      /* if `charcode' is not in any segment, then `mid' is */
-      /* the segment nearest to `charcode'                  */
-
-      if ( charcode > end )
-      {
-        mid++;
-        if ( mid == num_segs )
-          return 0;
-      }
-
-      if ( tt_cmap4_set_range( cmap4, mid ) )
-      {
-        if ( gindex )
-          *pcharcode = charcode;
-      }
-      else
-      {
-        cmap4->cur_charcode = charcode;
-
-        if ( gindex )
-          cmap4->cur_gindex = gindex;
-        else
-        {
-          cmap4->cur_charcode = charcode;
-          tt_cmap4_next( cmap4 );
-          gindex = cmap4->cur_gindex;
-        }
-
-        if ( gindex )
-          *pcharcode = cmap4->cur_charcode;
-      }
-    }
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap4_char_index( TT_CMap    cmap,
-                       FT_UInt32  char_code )
-  {
-    if ( char_code >= 0x10000UL )
-      return 0;
-
-    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
-      return tt_cmap4_char_map_linear( cmap, &char_code, 0 );
-    else
-      return tt_cmap4_char_map_binary( cmap, &char_code, 0 );
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap4_char_next( TT_CMap     cmap,
-                      FT_UInt32  *pchar_code )
-  {
-    FT_UInt  gindex;
-
-
-    if ( *pchar_code >= 0xFFFFU )
-      return 0;
-
-    if ( cmap->flags & TT_CMAP_FLAG_UNSORTED )
-      gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 );
-    else
-    {
-      TT_CMap4  cmap4 = (TT_CMap4)cmap;
-
-
-      /* no need to search */
-      if ( *pchar_code == cmap4->cur_charcode )
-      {
-        tt_cmap4_next( cmap4 );
-        gindex = cmap4->cur_gindex;
-        if ( gindex )
-          *pchar_code = cmap4->cur_charcode;
-      }
-      else
-        gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 );
-    }
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap4_get_info( TT_CMap       cmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 4;
-
-
-    cmap_info->format   = 4;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap4_class_rec,
-
-      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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap4_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_4 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 6                             *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET          TYPE             DESCRIPTION            */
-  /*                                                                       */
-  /*   format       0              USHORT           must be 6              */
-  /*   length       2              USHORT           table length in bytes  */
-  /*   language     4              USHORT           Mac language code      */
-  /*                                                                       */
-  /*   first        6              USHORT           first segment code     */
-  /*   count        8              USHORT           segment size in chars  */
-  /*   glyphIds     10             USHORT[count]    glyph IDs              */
-  /*                                                                       */
-  /* A very simplified segment mapping.                                    */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_6
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap6_validate( FT_Byte*      table,
-                     FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_UInt   length, count;
-
-
-    if ( table + 10 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 2;
-    length = TT_NEXT_USHORT( p );
-
-    p      = table + 8;             /* skip language and start index */
-    count  = TT_NEXT_USHORT( p );
-
-    if ( table + length > valid->limit || length < 10 + count * 2 )
-      FT_INVALID_TOO_SHORT;
-
-    /* check glyph indices */
-    if ( valid->level >= FT_VALIDATE_TIGHT )
-    {
-      FT_UInt  gindex;
-
-
-      for ( ; count > 0; count-- )
-      {
-        gindex = TT_NEXT_USHORT( p );
-        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
-          FT_INVALID_GLYPH_ID;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap6_char_index( TT_CMap    cmap,
-                       FT_UInt32  char_code )
-  {
-    FT_Byte*  table  = cmap->data;
-    FT_UInt   result = 0;
-    FT_Byte*  p      = table + 6;
-    FT_UInt   start  = TT_NEXT_USHORT( p );
-    FT_UInt   count  = TT_NEXT_USHORT( p );
-    FT_UInt   idx    = (FT_UInt)( char_code - start );
-
-
-    if ( idx < count )
-    {
-      p += 2 * idx;
-      result = TT_PEEK_USHORT( p );
-    }
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap6_char_next( TT_CMap     cmap,
-                      FT_UInt32  *pchar_code )
-  {
-    FT_Byte*   table     = cmap->data;
-    FT_UInt32  result    = 0;
-    FT_UInt32  char_code = *pchar_code + 1;
-    FT_UInt    gindex    = 0;
-
-    FT_Byte*   p         = table + 6;
-    FT_UInt    start     = TT_NEXT_USHORT( p );
-    FT_UInt    count     = TT_NEXT_USHORT( p );
-    FT_UInt    idx;
-
-
-    if ( char_code >= 0x10000UL )
-      return 0;
-
-    if ( char_code < start )
-      char_code = start;
-
-    idx = (FT_UInt)( char_code - start );
-    p  += 2 * idx;
-
-    for ( ; idx < count; idx++ )
-    {
-      gindex = TT_NEXT_USHORT( p );
-      if ( gindex != 0 )
-      {
-        result = char_code;
-        break;
-      }
-
-      if ( char_code >= 0xFFFFU )
-        return 0;
-
-      char_code++;
-    }
-
-    *pchar_code = result;
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap6_get_info( TT_CMap       cmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 4;
-
-
-    cmap_info->format   = 6;
-    cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap6_class_rec,
-
-      sizeof ( TT_CMapRec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap6_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_6 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 8                             *****/
-  /*****                                                               *****/
-  /***** It is hard to completely understand what the OpenType spec    *****/
-  /***** says about this format, but here is my conclusion.            *****/
-  /*****                                                               *****/
-  /***** 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.                                        *****/
-  /*****                                                               *****/
-  /*****   - A 16-bit value that isn't part of the Unicode Surrogates  *****/
-  /*****     Area (i.e. U+D800-U+DFFF).                                *****/
-  /*****                                                               *****/
-  /*****   - A 32-bit value, made of two surrogate values, i.e.. if    *****/
-  /*****     `char_code = (char_hi << 16) | char_lo', then both        *****/
-  /*****     `char_hi' and `char_lo' must be in the Surrogates Area.   *****/
-  /*****      Area.                                                    *****/
-  /*****                                                               *****/
-  /***** 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.   *****/
-  /*****                                                               *****/
-  /*****   If `char_hi == 0' then we must have `is32[char_lo] == 0'.   *****/
-  /*****                                                               *****/
-  /*****   If `char_hi != 0' then we must have both                    *****/
-  /*****   `is32[char_hi] != 0' and `is32[char_lo] != 0'.              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET         TYPE        DESCRIPTION                  */
-  /*                                                                       */
-  /*   format      0              USHORT      must be 8                    */
-  /*   reserved    2              USHORT      reserved                     */
-  /*   length      4              ULONG       length in bytes              */
-  /*   language    8              ULONG       Mac language code            */
-  /*   is32        12             BYTE[8192]  32-bitness bitmap            */
-  /*   count       8204           ULONG       number of groups             */
-  /*                                                                       */
-  /* This header is followed by `count' groups of the following format:    */
-  /*                                                                       */
-  /*   start       0              ULONG       first charcode               */
-  /*   end         4              ULONG       last charcode                */
-  /*   startId     8              ULONG       start glyph ID for the group */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_8
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap8_validate( FT_Byte*      table,
-                     FT_Validator  valid )
-  {
-    FT_Byte*   p = table + 4;
-    FT_Byte*   is32;
-    FT_UInt32  length;
-    FT_UInt32  num_groups;
-
-
-    if ( table + 16 + 8192 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    length = TT_NEXT_ULONG( p );
-    if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 )
-      FT_INVALID_TOO_SHORT;
-
-    is32       = table + 12;
-    p          = is32  + 8192;          /* skip `is32' array */
-    num_groups = TT_NEXT_ULONG( p );
-
-    /* p + num_groups * 12 > valid->limit ? */
-    if ( num_groups > (FT_UInt32)( valid->limit - p ) / 12 )
-      FT_INVALID_TOO_SHORT;
-
-    /* check groups, they must be in increasing order */
-    {
-      FT_UInt32  n, start, end, start_id, count, last = 0;
-
-
-      for ( n = 0; n < num_groups; n++ )
-      {
-        FT_UInt   hi, lo;
-
-
-        start    = TT_NEXT_ULONG( p );
-        end      = TT_NEXT_ULONG( p );
-        start_id = TT_NEXT_ULONG( p );
-
-        if ( start > end )
-          FT_INVALID_DATA;
-
-        if ( n > 0 && start <= last )
-          FT_INVALID_DATA;
-
-        if ( valid->level >= FT_VALIDATE_TIGHT )
-        {
-          FT_UInt32  d = end - start;
-
-
-          /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */
-          if ( d > TT_VALID_GLYPH_COUNT( valid )             ||
-               start_id >= TT_VALID_GLYPH_COUNT( valid ) - d )
-            FT_INVALID_GLYPH_ID;
-
-          count = (FT_UInt32)( end - start + 1 );
-
-          if ( start & ~0xFFFFU )
-          {
-            /* start_hi != 0; check that is32[i] is 1 for each i in */
-            /* the `hi' and `lo' of the range [start..end]          */
-            for ( ; count > 0; count--, start++ )
-            {
-              hi = (FT_UInt)( start >> 16 );
-              lo = (FT_UInt)( start & 0xFFFFU );
-
-              if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 )
-                FT_INVALID_DATA;
-
-              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 )
-                FT_INVALID_DATA;
-            }
-          }
-          else
-          {
-            /* start_hi == 0; check that is32[i] is 0 for each i in */
-            /* the range [start..end]                               */
-
-            /* end_hi cannot be != 0! */
-            if ( end & ~0xFFFFU )
-              FT_INVALID_DATA;
-
-            for ( ; count > 0; count--, start++ )
-            {
-              lo = (FT_UInt)( start & 0xFFFFU );
-
-              if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 )
-                FT_INVALID_DATA;
-            }
-          }
-        }
-
-        last = end;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap8_char_index( TT_CMap    cmap,
-                       FT_UInt32  char_code )
-  {
-    FT_Byte*   table      = cmap->data;
-    FT_UInt    result     = 0;
-    FT_Byte*   p          = table + 8204;
-    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
-    FT_UInt32  start, end, start_id;
-
-
-    for ( ; num_groups > 0; num_groups-- )
-    {
-      start    = TT_NEXT_ULONG( p );
-      end      = TT_NEXT_ULONG( p );
-      start_id = TT_NEXT_ULONG( p );
-
-      if ( char_code < start )
-        break;
-
-      if ( char_code <= end )
-      {
-        if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) )
-          return 0;
-
-        result = (FT_UInt)( start_id + ( char_code - start ) );
-        break;
-      }
-    }
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  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;
-    FT_UInt    gindex     = 0;
-    FT_Byte*   table      = cmap->data;
-    FT_Byte*   p          = table + 8204;
-    FT_UInt32  num_groups = TT_NEXT_ULONG( p );
-    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-- )
-    {
-      start    = TT_NEXT_ULONG( p );
-      end      = TT_NEXT_ULONG( p );
-      start_id = TT_NEXT_ULONG( p );
-
-      if ( char_code < start )
-        char_code = start;
-
-    Again:
-      if ( char_code <= end )
-      {
-        /* 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 )
-        {
-          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;
-      }
-    }
-
-    *pchar_code = result;
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap8_get_info( TT_CMap       cmap,
-                     TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 8;
-
-
-    cmap_info->format   = 8;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap8_class_rec,
-
-      sizeof ( TT_CMapRec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap8_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_8 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 10                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME      OFFSET  TYPE               DESCRIPTION                    */
-  /*                                                                       */
-  /*   format     0      USHORT             must be 10                     */
-  /*   reserved   2      USHORT             reserved                       */
-  /*   length     4      ULONG              length in bytes                */
-  /*   language   8      ULONG              Mac language code              */
-  /*                                                                       */
-  /*   start     12      ULONG              first char in range            */
-  /*   count     16      ULONG              number of chars in range       */
-  /*   glyphIds  20      USHORT[count]      glyph indices covered          */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_10
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap10_validate( FT_Byte*      table,
-                      FT_Validator  valid )
-  {
-    FT_Byte*  p = table + 4;
-    FT_ULong  length, count;
-
-
-    if ( table + 20 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    length = TT_NEXT_ULONG( p );
-    p      = table + 16;
-    count  = TT_NEXT_ULONG( p );
-
-    if ( length > (FT_ULong)( valid->limit - table ) ||
-         /* length < 20 + count * 2 ? */
-         length < 20                                 ||
-         ( length - 20 ) / 2 < count                 )
-      FT_INVALID_TOO_SHORT;
-
-    /* check glyph indices */
-    if ( valid->level >= FT_VALIDATE_TIGHT )
-    {
-      FT_UInt  gindex;
-
-
-      for ( ; count > 0; count-- )
-      {
-        gindex = TT_NEXT_USHORT( p );
-        if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) )
-          FT_INVALID_GLYPH_ID;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap10_char_index( TT_CMap    cmap,
-                        FT_UInt32  char_code )
-  {
-    FT_Byte*   table  = cmap->data;
-    FT_UInt    result = 0;
-    FT_Byte*   p      = table + 12;
-    FT_UInt32  start  = TT_NEXT_ULONG( p );
-    FT_UInt32  count  = TT_NEXT_ULONG( p );
-    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;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap10_char_next( TT_CMap     cmap,
-                       FT_UInt32  *pchar_code )
-  {
-    FT_Byte*   table     = cmap->data;
-    FT_UInt32  char_code;
-    FT_UInt    gindex    = 0;
-    FT_Byte*   p         = table + 12;
-    FT_UInt32  start     = TT_NEXT_ULONG( p );
-    FT_UInt32  count     = TT_NEXT_ULONG( p );
-    FT_UInt32  idx;
-
-
-    if ( *pchar_code >= 0xFFFFFFFFUL )
-      return 0;
-
-    char_code = *pchar_code + 1;
-
-    if ( char_code < start )
-      char_code = start;
-
-    idx = char_code - start;
-    p  += 2 * idx;
-
-    for ( ; idx < count; idx++ )
-    {
-      gindex = TT_NEXT_USHORT( p );
-      if ( gindex != 0 )
-        break;
-
-      if ( char_code >= 0xFFFFFFFFUL )
-        return 0;
-
-      char_code++;
-    }
-
-    *pchar_code = char_code;
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap10_get_info( TT_CMap       cmap,
-                      TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 8;
-
-
-    cmap_info->format   = 10;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap10_class_rec,
-
-      sizeof ( TT_CMapRec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap10_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_10 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 12                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
-  /*                                                                       */
-  /*   format      0          USHORT     must be 12                        */
-  /*   reserved    2          USHORT     reserved                          */
-  /*   length      4          ULONG      length in bytes                   */
-  /*   language    8          ULONG      Mac language code                 */
-  /*   count       12         ULONG      number of groups                  */
-  /*               16                                                      */
-  /*                                                                       */
-  /* This header is followed by `count' groups of the following format:    */
-  /*                                                                       */
-  /*   start       0          ULONG      first charcode                    */
-  /*   end         4          ULONG      last charcode                     */
-  /*   startId     8          ULONG      start glyph ID for the group      */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_12
-
-  typedef struct  TT_CMap12Rec_
-  {
-    TT_CMapRec  cmap;
-    FT_Bool     valid;
-    FT_ULong    cur_charcode;
-    FT_UInt     cur_gindex;
-    FT_ULong    cur_group;
-    FT_ULong    num_groups;
-
-  } TT_CMap12Rec, *TT_CMap12;
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap12_init( TT_CMap12  cmap,
-                  FT_Byte*   table )
-  {
-    cmap->cmap.data  = table;
-
-    table           += 12;
-    cmap->num_groups = FT_PEEK_ULONG( table );
-
-    cmap->valid      = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap12_validate( FT_Byte*      table,
-                      FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_ULong  length;
-    FT_ULong  num_groups;
-
-
-    if ( table + 16 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 4;
-    length = TT_NEXT_ULONG( p );
-
-    p          = table + 12;
-    num_groups = TT_NEXT_ULONG( p );
-
-    if ( length > (FT_ULong)( valid->limit - table ) ||
-         /* length < 16 + 12 * num_groups ? */
-         length < 16                                 ||
-         ( length - 16 ) / 12 < num_groups           )
-      FT_INVALID_TOO_SHORT;
-
-    /* check groups, they must be in increasing order */
-    {
-      FT_ULong  n, start, end, start_id, last = 0;
-
-
-      for ( n = 0; n < num_groups; n++ )
-      {
-        start    = TT_NEXT_ULONG( p );
-        end      = TT_NEXT_ULONG( p );
-        start_id = TT_NEXT_ULONG( p );
-
-        if ( start > end )
-          FT_INVALID_DATA;
-
-        if ( n > 0 && start <= last )
-          FT_INVALID_DATA;
-
-        if ( valid->level >= FT_VALIDATE_TIGHT )
-        {
-          FT_UInt32  d = end - start;
-
-
-          /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */
-          if ( d > TT_VALID_GLYPH_COUNT( valid )             ||
-               start_id >= TT_VALID_GLYPH_COUNT( valid ) - d )
-            FT_INVALID_GLYPH_ID;
-        }
-
-        last = end;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* search the index of the charcode next to cmap->cur_charcode */
-  /* cmap->cur_group should be set up properly by caller         */
-  /*                                                             */
-  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;
-    FT_UInt   gindex;
-
-
-    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
-      goto Fail;
-
-    char_code = cmap->cur_charcode + 1;
-
-    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
-    {
-      p        = cmap->cmap.data + 16 + 12 * n;
-      start    = TT_NEXT_ULONG( p );
-      end      = TT_NEXT_ULONG( p );
-      start_id = TT_PEEK_ULONG( p );
-
-      if ( char_code < start )
-        char_code = start;
-
-    Again:
-      if ( char_code <= end )
-      {
-        /* 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 )
-        {
-          if ( char_code >= 0xFFFFFFFFUL )
-            goto Fail;
-
-          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;
-      }
-    }
-
-  Fail:
-    cmap->valid = 0;
-  }
-
-
-  static FT_UInt
-  tt_cmap12_char_map_binary( TT_CMap     cmap,
-                             FT_UInt32*  pchar_code,
-                             FT_Bool     next )
-  {
-    FT_UInt    gindex     = 0;
-    FT_Byte*   p          = cmap->data + 12;
-    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
-    FT_UInt32  char_code  = *pchar_code;
-    FT_UInt32  start, end, start_id;
-    FT_UInt32  max, min, mid;
-
-
-    if ( !num_groups )
-      return 0;
-
-    /* make compiler happy */
-    mid = num_groups;
-    end = 0xFFFFFFFFUL;
-
-    if ( next )
-    {
-      if ( char_code >= 0xFFFFFFFFUL )
-        return 0;
-
-      char_code++;
-    }
-
-    min = 0;
-    max = num_groups;
-
-    /* binary search */
-    while ( min < max )
-    {
-      mid = ( min + max ) >> 1;
-      p   = cmap->data + 16 + 12 * mid;
-
-      start = TT_NEXT_ULONG( p );
-      end   = TT_NEXT_ULONG( p );
-
-      if ( char_code < start )
-        max = mid;
-      else if ( char_code > end )
-        min = mid + 1;
-      else
-      {
-        start_id = TT_PEEK_ULONG( p );
-
-        /* 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 )
-      {
-        mid++;
-        if ( mid == num_groups )
-          return 0;
-      }
-
-      cmap12->valid        = 1;
-      cmap12->cur_charcode = char_code;
-      cmap12->cur_group    = mid;
-
-      if ( gindex >= (FT_UInt)face->num_glyphs )
-        gindex = 0;
-
-      if ( !gindex )
-      {
-        tt_cmap12_next( cmap12 );
-
-        if ( cmap12->valid )
-          gindex = cmap12->cur_gindex;
-      }
-      else
-        cmap12->cur_gindex = gindex;
-
-      *pchar_code = cmap12->cur_charcode;
-    }
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap12_char_index( TT_CMap    cmap,
-                        FT_UInt32  char_code )
-  {
-    return tt_cmap12_char_map_binary( cmap, &char_code, 0 );
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap12_char_next( TT_CMap     cmap,
-                       FT_UInt32  *pchar_code )
-  {
-    TT_CMap12  cmap12 = (TT_CMap12)cmap;
-    FT_UInt    gindex;
-
-
-    /* no need to search */
-    if ( cmap12->valid && cmap12->cur_charcode == *pchar_code )
-    {
-      tt_cmap12_next( cmap12 );
-      if ( cmap12->valid )
-      {
-        gindex      = cmap12->cur_gindex;
-        *pchar_code = (FT_UInt32)cmap12->cur_charcode;
-      }
-      else
-        gindex = 0;
-    }
-    else
-      gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 );
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap12_get_info( TT_CMap       cmap,
-                      TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 8;
-
-
-    cmap_info->format   = 12;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap12_class_rec,
-
-      sizeof ( TT_CMap12Rec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap12_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_12 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                          FORMAT 13                            *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME        OFFSET     TYPE       DESCRIPTION                       */
-  /*                                                                       */
-  /*   format      0          USHORT     must be 13                        */
-  /*   reserved    2          USHORT     reserved                          */
-  /*   length      4          ULONG      length in bytes                   */
-  /*   language    8          ULONG      Mac language code                 */
-  /*   count       12         ULONG      number of groups                  */
-  /*               16                                                      */
-  /*                                                                       */
-  /* This header is followed by `count' groups of the following format:    */
-  /*                                                                       */
-  /*   start       0          ULONG      first charcode                    */
-  /*   end         4          ULONG      last charcode                     */
-  /*   glyphId     8          ULONG      glyph ID for the whole group      */
-  /*                                                                       */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_13
-
-  typedef struct  TT_CMap13Rec_
-  {
-    TT_CMapRec  cmap;
-    FT_Bool     valid;
-    FT_ULong    cur_charcode;
-    FT_UInt     cur_gindex;
-    FT_ULong    cur_group;
-    FT_ULong    num_groups;
-
-  } TT_CMap13Rec, *TT_CMap13;
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap13_init( TT_CMap13  cmap,
-                  FT_Byte*   table )
-  {
-    cmap->cmap.data  = table;
-
-    table           += 12;
-    cmap->num_groups = FT_PEEK_ULONG( table );
-
-    cmap->valid      = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap13_validate( FT_Byte*      table,
-                      FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_ULong  length;
-    FT_ULong  num_groups;
-
-
-    if ( table + 16 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p      = table + 4;
-    length = TT_NEXT_ULONG( p );
-
-    p          = table + 12;
-    num_groups = TT_NEXT_ULONG( p );
-
-    if ( length > (FT_ULong)( valid->limit - table ) ||
-         /* length < 16 + 12 * num_groups ? */
-         length < 16                                 ||
-         ( length - 16 ) / 12 < num_groups           )
-      FT_INVALID_TOO_SHORT;
-
-    /* check groups, they must be in increasing order */
-    {
-      FT_ULong  n, start, end, glyph_id, last = 0;
-
-
-      for ( n = 0; n < num_groups; n++ )
-      {
-        start    = TT_NEXT_ULONG( p );
-        end      = TT_NEXT_ULONG( p );
-        glyph_id = TT_NEXT_ULONG( p );
-
-        if ( start > end )
-          FT_INVALID_DATA;
-
-        if ( n > 0 && start <= last )
-          FT_INVALID_DATA;
-
-        if ( valid->level >= FT_VALIDATE_TIGHT )
-        {
-          if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) )
-            FT_INVALID_GLYPH_ID;
-        }
-
-        last = end;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /* search the index of the charcode next to cmap->cur_charcode */
-  /* cmap->cur_group should be set up properly by caller         */
-  /*                                                             */
-  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;
-    FT_UInt   gindex;
-
-
-    if ( cmap->cur_charcode >= 0xFFFFFFFFUL )
-      goto Fail;
-
-    char_code = cmap->cur_charcode + 1;
-
-    for ( n = cmap->cur_group; n < cmap->num_groups; n++ )
-    {
-      p        = cmap->cmap.data + 16 + 12 * n;
-      start    = TT_NEXT_ULONG( p );
-      end      = TT_NEXT_ULONG( p );
-      glyph_id = TT_PEEK_ULONG( p );
-
-      if ( char_code < start )
-        char_code = start;
-
-      if ( char_code <= end )
-      {
-        gindex = (FT_UInt)glyph_id;
-
-        if ( gindex && gindex < (FT_UInt)face->num_glyphs )
-        {
-          cmap->cur_charcode = char_code;
-          cmap->cur_gindex   = gindex;
-          cmap->cur_group    = n;
-
-          return;
-        }
-      }
-    }
-
-  Fail:
-    cmap->valid = 0;
-  }
-
-
-  static FT_UInt
-  tt_cmap13_char_map_binary( TT_CMap     cmap,
-                             FT_UInt32*  pchar_code,
-                             FT_Bool     next )
-  {
-    FT_UInt    gindex     = 0;
-    FT_Byte*   p          = cmap->data + 12;
-    FT_UInt32  num_groups = TT_PEEK_ULONG( p );
-    FT_UInt32  char_code  = *pchar_code;
-    FT_UInt32  start, end;
-    FT_UInt32  max, min, mid;
-
-
-    if ( !num_groups )
-      return 0;
-
-    /* make compiler happy */
-    mid = num_groups;
-    end = 0xFFFFFFFFUL;
-
-    if ( next )
-    {
-      if ( char_code >= 0xFFFFFFFFUL )
-        return 0;
-
-      char_code++;
-    }
-
-    min = 0;
-    max = num_groups;
-
-    /* binary search */
-    while ( min < max )
-    {
-      mid = ( min + max ) >> 1;
-      p   = cmap->data + 16 + 12 * mid;
-
-      start = TT_NEXT_ULONG( p );
-      end   = TT_NEXT_ULONG( p );
-
-      if ( char_code < start )
-        max = mid;
-      else if ( char_code > end )
-        min = mid + 1;
-      else
-      {
-        gindex = (FT_UInt)TT_PEEK_ULONG( p );
-
-        break;
-      }
-    }
-
-    if ( next )
-    {
-      FT_Face    face   = cmap->cmap.charmap.face;
-      TT_CMap13  cmap13 = (TT_CMap13)cmap;
-
-
-      /* if `char_code' is not in any group, then `mid' is */
-      /* the group nearest to `char_code'                  */
-
-      if ( char_code > end )
-      {
-        mid++;
-        if ( mid == num_groups )
-          return 0;
-      }
-
-      cmap13->valid        = 1;
-      cmap13->cur_charcode = char_code;
-      cmap13->cur_group    = mid;
-
-      if ( gindex >= (FT_UInt)face->num_glyphs )
-        gindex = 0;
-
-      if ( !gindex )
-      {
-        tt_cmap13_next( cmap13 );
-
-        if ( cmap13->valid )
-          gindex = cmap13->cur_gindex;
-      }
-      else
-        cmap13->cur_gindex = gindex;
-
-      *pchar_code = cmap13->cur_charcode;
-    }
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap13_char_index( TT_CMap    cmap,
-                        FT_UInt32  char_code )
-  {
-    return tt_cmap13_char_map_binary( cmap, &char_code, 0 );
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap13_char_next( TT_CMap     cmap,
-                       FT_UInt32  *pchar_code )
-  {
-    TT_CMap13  cmap13 = (TT_CMap13)cmap;
-    FT_UInt    gindex;
-
-
-    /* no need to search */
-    if ( cmap13->valid && cmap13->cur_charcode == *pchar_code )
-    {
-      tt_cmap13_next( cmap13 );
-      if ( cmap13->valid )
-      {
-        gindex      = cmap13->cur_gindex;
-        *pchar_code = cmap13->cur_charcode;
-      }
-      else
-        gindex = 0;
-    }
-    else
-      gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 );
-
-    return gindex;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap13_get_info( TT_CMap       cmap,
-                      TT_CMapInfo  *cmap_info )
-  {
-    FT_Byte*  p = cmap->data + 8;
-
-
-    cmap_info->format   = 13;
-    cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap13_class_rec,
-
-      sizeof ( TT_CMap13Rec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap13_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_13 */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                           FORMAT 14                           *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TABLE OVERVIEW                                                        */
-  /* --------------                                                        */
-  /*                                                                       */
-  /*   NAME         OFFSET  TYPE    DESCRIPTION                            */
-  /*                                                                       */
-  /*   format         0     USHORT  must be 14                             */
-  /*   length         2     ULONG   table length in bytes                  */
-  /*   numSelector    6     ULONG   number of variation sel. records       */
-  /*                                                                       */
-  /* Followed by numSelector records, each of which looks like             */
-  /*                                                                       */
-  /*   varSelector    0     UINT24  Unicode codepoint of sel.              */
-  /*   defaultOff     3     ULONG   offset to a default UVS table          */
-  /*                                describing any variants to be found in */
-  /*                                the normal Unicode subtable.           */
-  /*   nonDefOff      7     ULONG   offset to a non-default UVS table      */
-  /*                                describing any variants not in the     */
-  /*                                standard cmap, with GIDs here          */
-  /* (either offset may be 0 NULL)                                         */
-  /*                                                                       */
-  /* Selectors are sorted by code point.                                   */
-  /*                                                                       */
-  /* A default Unicode Variation Selector (UVS) subtable is just a list of */
-  /* ranges of code points which are to be found in the standard cmap.  No */
-  /* glyph IDs (GIDs) here.                                                */
-  /*                                                                       */
-  /*   numRanges      0     ULONG   number of ranges following             */
-  /*                                                                       */
-  /* A range looks like                                                    */
-  /*                                                                       */
-  /*   uniStart       0     UINT24  code point of the first character in   */
-  /*                                this range                             */
-  /*   additionalCnt  3     UBYTE   count of additional characters in this */
-  /*                                range (zero means a range of a single  */
-  /*                                character)                             */
-  /*                                                                       */
-  /* Ranges are sorted by `uniStart'.                                      */
-  /*                                                                       */
-  /* A non-default Unicode Variation Selector (UVS) subtable is a list of  */
-  /* mappings from codepoint to GID.                                       */
-  /*                                                                       */
-  /*   numMappings    0     ULONG   number of mappings                     */
-  /*                                                                       */
-  /* A range looks like                                                    */
-  /*                                                                       */
-  /*   uniStart       0     UINT24  code point of the first character in   */
-  /*                                this range                             */
-  /*   GID            3     USHORT  and its GID                            */
-  /*                                                                       */
-  /* Ranges are sorted by `uniStart'.                                      */
-
-#ifdef TT_CONFIG_CMAP_FORMAT_14
-
-  typedef struct  TT_CMap14Rec_
-  {
-    TT_CMapRec  cmap;
-    FT_ULong    num_selectors;
-
-    /* This array is used to store the results of various
-     * cmap 14 query functions.  The data is overwritten
-     * on each call to these functions.
-     */
-    FT_UInt32   max_results;
-    FT_UInt32*  results;
-    FT_Memory   memory;
-
-  } TT_CMap14Rec, *TT_CMap14;
-
-
-  FT_CALLBACK_DEF( void )
-  tt_cmap14_done( TT_CMap14  cmap )
-  {
-    FT_Memory  memory = cmap->memory;
-
-
-    cmap->max_results = 0;
-    if ( memory && cmap->results )
-      FT_FREE( cmap->results );
-  }
-
-
-  static FT_Error
-  tt_cmap14_ensure( TT_CMap14  cmap,
-                    FT_UInt32  num_results,
-                    FT_Memory  memory )
-  {
-    FT_UInt32  old_max = cmap->max_results;
-    FT_Error   error   = FT_Err_Ok;
-
-
-    if ( num_results > cmap->max_results )
-    {
-       cmap->memory = memory;
-
-       if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) )
-         return error;
-
-       cmap->max_results = num_results;
-    }
-
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap14_init( TT_CMap14  cmap,
-                  FT_Byte*   table )
-  {
-    cmap->cmap.data = table;
-
-    table               += 6;
-    cmap->num_selectors  = FT_PEEK_ULONG( table );
-    cmap->max_results    = 0;
-    cmap->results        = NULL;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap14_validate( FT_Byte*      table,
-                      FT_Validator  valid )
-  {
-    FT_Byte*  p;
-    FT_ULong  length;
-    FT_ULong  num_selectors;
-
-
-    if ( table + 2 + 4 + 4 > valid->limit )
-      FT_INVALID_TOO_SHORT;
-
-    p             = table + 2;
-    length        = TT_NEXT_ULONG( p );
-    num_selectors = TT_NEXT_ULONG( p );
-
-    if ( length > (FT_ULong)( valid->limit - table ) ||
-         /* length < 10 + 11 * num_selectors ? */
-         length < 10                                 ||
-         ( length - 10 ) / 11 < num_selectors        )
-      FT_INVALID_TOO_SHORT;
-
-    /* check selectors, they must be in increasing order */
-    {
-      /* we start lastVarSel at 1 because a variant selector value of 0
-       * isn't valid.
-       */
-      FT_ULong  n, lastVarSel = 1;
-
-
-      for ( n = 0; n < num_selectors; n++ )
-      {
-        FT_ULong  varSel    = TT_NEXT_UINT24( p );
-        FT_ULong  defOff    = TT_NEXT_ULONG( p );
-        FT_ULong  nondefOff = TT_NEXT_ULONG( p );
-
-
-        if ( defOff >= length || nondefOff >= length )
-          FT_INVALID_TOO_SHORT;
-
-        if ( varSel < lastVarSel )
-          FT_INVALID_DATA;
-
-        lastVarSel = varSel + 1;
-
-        /* check the default table (these glyphs should be reached     */
-        /* through the normal Unicode cmap, no GIDs, just check order) */
-        if ( defOff != 0 )
-        {
-          FT_Byte*  defp     = table + defOff;
-          FT_ULong  numRanges;
-          FT_ULong  i;
-          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++ )
-          {
-            FT_ULong  base = TT_NEXT_UINT24( defp );
-            FT_ULong  cnt  = FT_NEXT_BYTE( defp );
-
-
-            if ( base + cnt >= 0x110000UL )              /* end of Unicode */
-              FT_INVALID_DATA;
-
-            if ( base < lastBase )
-              FT_INVALID_DATA;
-
-            lastBase = base + cnt + 1U;
-          }
-        }
-
-        /* and the non-default table (these glyphs are specified here) */
-        if ( nondefOff != 0 )
-        {
-          FT_Byte*  ndp        = table + nondefOff;
-          FT_ULong  numMappings;
-          FT_ULong  i, lastUni = 0;
-
-
-          if ( ndp + 4 > valid->limit )
-            FT_INVALID_TOO_SHORT;
-
-          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 );
-
-
-            if ( uni >= 0x110000UL )                     /* end of Unicode */
-              FT_INVALID_DATA;
-
-            if ( uni < lastUni )
-              FT_INVALID_DATA;
-
-            lastUni = uni + 1U;
-
-            if ( valid->level >= FT_VALIDATE_TIGHT    &&
-                 gid >= TT_VALID_GLYPH_COUNT( valid ) )
-              FT_INVALID_GLYPH_ID;
-          }
-        }
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap14_char_index( TT_CMap    cmap,
-                        FT_UInt32  char_code )
-  {
-    FT_UNUSED( cmap );
-    FT_UNUSED( char_code );
-
-    /* This can't happen */
-    return 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 )
-  tt_cmap14_char_next( TT_CMap     cmap,
-                       FT_UInt32  *pchar_code )
-  {
-    FT_UNUSED( cmap );
-
-    /* This can't happen */
-    *pchar_code = 0;
-    return 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  tt_cmap14_get_info( TT_CMap       cmap,
-                      TT_CMapInfo  *cmap_info )
-  {
-    FT_UNUSED( cmap );
-
-    cmap_info->format   = 14;
-    /* subtable 14 does not define a language field */
-    cmap_info->language = 0xFFFFFFFFUL;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_UInt
-  tt_cmap14_char_map_def_binary( FT_Byte    *base,
-                                 FT_UInt32   char_code )
-  {
-    FT_UInt32  numRanges = TT_PEEK_ULONG( base );
-    FT_UInt32  max, min;
-
-
-    min = 0;
-    max = numRanges;
-
-    base += 4;
-
-    /* binary search */
-    while ( min < max )
-    {
-      FT_UInt32  mid   = ( min + max ) >> 1;
-      FT_Byte*   p     = base + 4 * mid;
-      FT_ULong   start = TT_NEXT_UINT24( p );
-      FT_UInt    cnt   = FT_NEXT_BYTE( p );
-
-
-      if ( char_code < start )
-        max = mid;
-      else if ( char_code > start + cnt )
-        min = mid + 1;
-      else
-        return TRUE;
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_UInt
-  tt_cmap14_char_map_nondef_binary( FT_Byte    *base,
-                                    FT_UInt32   char_code )
-  {
-    FT_UInt32  numMappings = TT_PEEK_ULONG( base );
-    FT_UInt32  max, min;
-
-
-    min = 0;
-    max = numMappings;
-
-    base += 4;
-
-    /* binary search */
-    while ( min < max )
-    {
-      FT_UInt32  mid = ( min + max ) >> 1;
-      FT_Byte*   p   = base + 5 * mid;
-      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
-
-
-      if ( char_code < uni )
-        max = mid;
-      else if ( char_code > uni )
-        min = mid + 1;
-      else
-        return TT_PEEK_USHORT( p );
-    }
-
-    return 0;
-  }
-
-
-  static FT_Byte*
-  tt_cmap14_find_variant( FT_Byte    *base,
-                          FT_UInt32   variantCode )
-  {
-    FT_UInt32  numVar = TT_PEEK_ULONG( base );
-    FT_UInt32  max, min;
-
-
-    min = 0;
-    max = numVar;
-
-    base += 4;
-
-    /* binary search */
-    while ( min < max )
-    {
-      FT_UInt32  mid    = ( min + max ) >> 1;
-      FT_Byte*   p      = base + 11 * mid;
-      FT_ULong   varSel = TT_NEXT_UINT24( p );
-
-
-      if ( variantCode < varSel )
-        max = mid;
-      else if ( variantCode > varSel )
-        min = mid + 1;
-      else
-        return p;
-    }
-
-    return NULL;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt )
-  tt_cmap14_char_var_index( TT_CMap    cmap,
-                            TT_CMap    ucmap,
-                            FT_UInt32  charcode,
-                            FT_UInt32  variantSelector )
-  {
-    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
-    FT_ULong  defOff;
-    FT_ULong  nondefOff;
-
-
-    if ( !p )
-      return 0;
-
-    defOff    = TT_NEXT_ULONG( p );
-    nondefOff = TT_PEEK_ULONG( p );
-
-    if ( defOff != 0                                                    &&
-         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
-    {
-      /* This is the default variant of this charcode.  GID not stored */
-      /* here; stored in the normal Unicode charmap instead.           */
-      return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode );
-    }
-
-    if ( nondefOff != 0 )
-      return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
-                                               charcode );
-
-    return 0;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Int )
-  tt_cmap14_char_var_isdefault( TT_CMap    cmap,
-                                FT_UInt32  charcode,
-                                FT_UInt32  variantSelector )
-  {
-    FT_Byte*  p = tt_cmap14_find_variant( cmap->data + 6, variantSelector );
-    FT_ULong  defOff;
-    FT_ULong  nondefOff;
-
-
-    if ( !p )
-      return -1;
-
-    defOff    = TT_NEXT_ULONG( p );
-    nondefOff = TT_NEXT_ULONG( p );
-
-    if ( defOff != 0                                                    &&
-         tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) )
-      return 1;
-
-    if ( nondefOff != 0                                            &&
-         tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
-                                           charcode ) != 0         )
-      return 0;
-
-    return -1;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32* )
-  tt_cmap14_variants( TT_CMap    cmap,
-                      FT_Memory  memory )
-  {
-    TT_CMap14   cmap14 = (TT_CMap14)cmap;
-    FT_UInt32   count  = cmap14->num_selectors;
-    FT_Byte*    p      = cmap->data + 10;
-    FT_UInt32*  result;
-    FT_UInt32   i;
-
-
-    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
-      return NULL;
-
-    result = cmap14->results;
-    for ( i = 0; i < count; i++ )
-    {
-      result[i] = (FT_UInt32)TT_NEXT_UINT24( p );
-      p        += 8;
-    }
-    result[i] = 0;
-
-    return result;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 * )
-  tt_cmap14_char_variants( TT_CMap    cmap,
-                           FT_Memory  memory,
-                           FT_UInt32  charCode )
-  {
-    TT_CMap14   cmap14 = (TT_CMap14)  cmap;
-    FT_UInt32   count  = cmap14->num_selectors;
-    FT_Byte*    p      = cmap->data + 10;
-    FT_UInt32*  q;
-
-
-    if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) )
-      return NULL;
-
-    for ( q = cmap14->results; count > 0; count-- )
-    {
-      FT_UInt32  varSel    = TT_NEXT_UINT24( p );
-      FT_ULong   defOff    = TT_NEXT_ULONG( p );
-      FT_ULong   nondefOff = TT_NEXT_ULONG( p );
-
-
-      if ( ( defOff != 0                                               &&
-             tt_cmap14_char_map_def_binary( cmap->data + defOff,
-                                            charCode )                 ) ||
-           ( nondefOff != 0                                            &&
-             tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff,
-                                               charCode ) != 0         ) )
-      {
-        q[0] = varSel;
-        q++;
-      }
-    }
-    q[0] = 0;
-
-    return cmap14->results;
-  }
-
-
-  static FT_UInt
-  tt_cmap14_def_char_count( FT_Byte  *p )
-  {
-    FT_UInt32  numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
-    FT_UInt    tot       = 0;
-
-
-    p += 3;  /* point to the first `cnt' field */
-    for ( ; numRanges > 0; numRanges-- )
-    {
-      tot += 1 + p[0];
-      p   += 4;
-    }
-
-    return tot;
-  }
-
-
-  static FT_UInt32*
-  tt_cmap14_get_def_chars( TT_CMap    cmap,
-                           FT_Byte*   p,
-                           FT_Memory  memory )
-  {
-    TT_CMap14   cmap14 = (TT_CMap14) cmap;
-    FT_UInt32   numRanges;
-    FT_UInt     cnt;
-    FT_UInt32*  q;
-
-
-    cnt       = tt_cmap14_def_char_count( p );
-    numRanges = (FT_UInt32)TT_NEXT_ULONG( p );
-
-    if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) )
-      return NULL;
-
-    for ( q = cmap14->results; numRanges > 0; numRanges-- )
-    {
-      FT_UInt32  uni = (FT_UInt32)TT_NEXT_UINT24( p );
-
-
-      cnt = FT_NEXT_BYTE( p ) + 1;
-      do
-      {
-        q[0]  = uni;
-        uni  += 1;
-        q    += 1;
-
-      } while ( --cnt != 0 );
-    }
-    q[0] = 0;
-
-    return cmap14->results;
-  }
-
-
-  static FT_UInt32*
-  tt_cmap14_get_nondef_chars( TT_CMap     cmap,
-                              FT_Byte    *p,
-                              FT_Memory   memory )
-  {
-    TT_CMap14   cmap14 = (TT_CMap14) cmap;
-    FT_UInt32   numMappings;
-    FT_UInt     i;
-    FT_UInt32  *ret;
-
-
-    numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
-
-    if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) )
-      return NULL;
-
-    ret = cmap14->results;
-    for ( i = 0; i < numMappings; i++ )
-    {
-      ret[i] = (FT_UInt32)TT_NEXT_UINT24( p );
-      p += 2;
-    }
-    ret[i] = 0;
-
-    return ret;
-  }
-
-
-  FT_CALLBACK_DEF( FT_UInt32 * )
-  tt_cmap14_variant_chars( TT_CMap    cmap,
-                           FT_Memory  memory,
-                           FT_UInt32  variantSelector )
-  {
-    FT_Byte    *p  = tt_cmap14_find_variant( cmap->data + 6,
-                                             variantSelector );
-    FT_Int      i;
-    FT_ULong    defOff;
-    FT_ULong    nondefOff;
-
-
-    if ( !p )
-      return NULL;
-
-    defOff    = TT_NEXT_ULONG( p );
-    nondefOff = TT_NEXT_ULONG( p );
-
-    if ( defOff == 0 && nondefOff == 0 )
-      return NULL;
-
-    if ( defOff == 0 )
-      return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
-                                         memory );
-    else if ( nondefOff == 0 )
-      return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
-                                      memory );
-    else
-    {
-      /* Both a default and a non-default glyph set?  That's probably not */
-      /* good font design, but the spec allows for it...                  */
-      TT_CMap14  cmap14 = (TT_CMap14) cmap;
-      FT_UInt32  numRanges;
-      FT_UInt32  numMappings;
-      FT_UInt32  duni;
-      FT_UInt32  dcnt;
-      FT_UInt32  nuni;
-      FT_Byte*   dp;
-      FT_UInt    di, ni, k;
-
-      FT_UInt32  *ret;
-
-
-      p  = cmap->data + nondefOff;
-      dp = cmap->data + defOff;
-
-      numMappings = (FT_UInt32)TT_NEXT_ULONG( p );
-      dcnt        = tt_cmap14_def_char_count( dp );
-      numRanges   = (FT_UInt32)TT_NEXT_ULONG( dp );
-
-      if ( numMappings == 0 )
-        return tt_cmap14_get_def_chars( cmap, cmap->data + defOff,
-                                        memory );
-      if ( dcnt == 0 )
-        return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff,
-                                           memory );
-
-      if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) )
-        return NULL;
-
-      ret  = cmap14->results;
-      duni = (FT_UInt32)TT_NEXT_UINT24( dp );
-      dcnt = FT_NEXT_BYTE( dp );
-      di   = 1;
-      nuni = (FT_UInt32)TT_NEXT_UINT24( p );
-      p   += 2;
-      ni   = 1;
-      i    = 0;
-
-      for (;;)
-      {
-        if ( nuni > duni + dcnt )
-        {
-          for ( k = 0; k <= dcnt; k++ )
-            ret[i++] = duni + k;
-
-          di++;
-
-          if ( di > numRanges )
-            break;
-
-          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
-          dcnt = FT_NEXT_BYTE( dp );
-        }
-        else
-        {
-          if ( nuni < duni )
-            ret[i++] = nuni;
-          /* If it is within the default range then ignore it -- */
-          /* that should not have happened                       */
-          ni++;
-          if ( ni > numMappings )
-            break;
-
-          nuni = (FT_UInt32)TT_NEXT_UINT24( p );
-          p += 2;
-        }
-      }
-
-      if ( ni <= numMappings )
-      {
-        /* If we get here then we have run out of all default ranges.   */
-        /* We have read one non-default mapping which we haven't stored */
-        /* and there may be others that need to be read.                */
-        ret[i++] = nuni;
-        while ( ni < numMappings )
-        {
-          ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p );
-          p += 2;
-          ni++;
-        }
-      }
-      else if ( di <= numRanges )
-      {
-        /* 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++ )
-          ret[i++] = duni + k;
-
-        while ( di < numRanges )
-        {
-          duni = (FT_UInt32)TT_NEXT_UINT24( dp );
-          dcnt = FT_NEXT_BYTE( dp );
-
-          for ( k = 0; k <= dcnt; k++ )
-            ret[i++] = duni + k;
-          di++;
-        }
-      }
-
-      ret[i] = 0;
-
-      return ret;
-    }
-  }
-
-
-  FT_DEFINE_TT_CMAP(
-    tt_cmap14_class_rec,
-
-      sizeof ( TT_CMap14Rec ),
-
-      (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,  /* validate      */
-    (TT_CMap_Info_GetFunc)tt_cmap14_get_info   /* get_cmap_info */
-  )
-
-#endif /* TT_CONFIG_CMAP_FORMAT_14 */
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-  static const TT_CMap_Class  tt_cmap_classes[] =
-  {
-#define TTCMAPCITEM( a )  &a,
-#include "ttcmapc.h"
-    NULL,
-  };
-
-#else /*FT_CONFIG_OPTION_PIC*/
-
-  void
-  FT_Destroy_Class_tt_cmap_classes( FT_Library      library,
-                                    TT_CMap_Class*  clazz )
-  {
-    FT_Memory  memory = library->memory;
-
-
-    if ( clazz )
-      FT_FREE( clazz );
-  }
-
-
-  FT_Error
-  FT_Create_Class_tt_cmap_classes( FT_Library       library,
-                                   TT_CMap_Class**  output_class )
-  {
-    TT_CMap_Class*     clazz  = NULL;
-    TT_CMap_ClassRec*  recs;
-    FT_Error           error;
-    FT_Memory          memory = library->memory;
-
-    int  i = 0;
-
-
-#define TTCMAPCITEM( a ) i++;
-#include "ttcmapc.h"
-
-    /* allocate enough space for both the pointers */
-    /* plus terminator and the class instances     */
-    if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) +
-                          sizeof ( TT_CMap_ClassRec ) * i ) )
-      return error;
-
-    /* the location of the class instances follows the array of pointers */
-    recs = (TT_CMap_ClassRec*)( (char*)clazz +
-                                sizeof ( *clazz ) * ( i + 1 ) );
-    i    = 0;
-
-#undef TTCMAPCITEM
-#define  TTCMAPCITEM( a )             \
-    FT_Init_Class_ ## a( &recs[i] );  \
-    clazz[i] = &recs[i];              \
-    i++;
-#include "ttcmapc.h"
-
-    clazz[i] = NULL;
-
-    *output_class = clazz;
-    return FT_Err_Ok;
-  }
-
-#endif /*FT_CONFIG_OPTION_PIC*/
-
-
-  /* parse the `cmap' table and build the corresponding TT_CMap objects */
-  /* in the current face                                                */
-  /*                                                                    */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_build_cmaps( TT_Face  face )
-  {
-    FT_Byte*           table = face->cmap_table;
-    FT_Byte*           limit = table + face->cmap_size;
-    FT_UInt volatile   num_cmaps;
-    FT_Byte* volatile  p     = table;
-    FT_Library         library = FT_FACE_LIBRARY( face );
-
-    FT_UNUSED( library );
-
-
-    if ( !p || p + 4 > limit )
-      return FT_THROW( Invalid_Table );
-
-    /* only recognize format 0 */
-    if ( TT_NEXT_USHORT( p ) != 0 )
-    {
-      FT_ERROR(( "tt_face_build_cmaps:"
-                 " unsupported `cmap' table format = %d\n",
-                 TT_PEEK_USHORT( p - 2 ) ));
-      return FT_THROW( Invalid_Table );
-    }
-
-    num_cmaps = TT_NEXT_USHORT( p );
-
-    for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- )
-    {
-      FT_CharMapRec  charmap;
-      FT_UInt32      offset;
-
-
-      charmap.platform_id = TT_NEXT_USHORT( p );
-      charmap.encoding_id = TT_NEXT_USHORT( p );
-      charmap.face        = FT_FACE( face );
-      charmap.encoding    = FT_ENCODING_NONE;  /* will be filled later */
-      offset              = TT_NEXT_ULONG( p );
-
-      if ( offset && offset <= face->cmap_size - 2 )
-      {
-        FT_Byte* volatile              cmap   = table + offset;
-        volatile FT_UInt               format = TT_PEEK_USHORT( cmap );
-        const TT_CMap_Class* volatile  pclazz = TT_CMAP_CLASSES_GET;
-        TT_CMap_Class volatile         clazz;
-
-
-        for ( ; *pclazz; pclazz++ )
-        {
-          clazz = *pclazz;
-          if ( clazz->format == format )
-          {
-            volatile TT_ValidatorRec  valid;
-            volatile FT_Error         error = FT_Err_Ok;
-
-
-            ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit,
-                               FT_VALIDATE_DEFAULT );
-
-            valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs;
-
-            if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 )
-            {
-              /* validate this cmap sub-table */
-              error = clazz->validate( cmap, FT_VALIDATOR( &valid ) );
-            }
-
-            if ( !valid.validator.error )
-            {
-              FT_CMap  ttcmap;
-
-
-              /* It might make sense to store the single variation         */
-              /* selector cmap somewhere special.  But it would have to be */
-              /* in the public FT_FaceRec, and we can't change that.       */
-
-              if ( !FT_CMap_New( (FT_CMap_Class)clazz,
-                                 cmap, &charmap, &ttcmap ) )
-              {
-                /* it is simpler to directly set `flags' than adding */
-                /* a parameter to FT_CMap_New                        */
-                ((TT_CMap)ttcmap)->flags = (FT_Int)error;
-              }
-            }
-            else
-            {
-              FT_TRACE0(( "tt_face_build_cmaps:"
-                          " broken cmap sub-table ignored\n" ));
-            }
-            break;
-          }
-        }
-
-        if ( !*pclazz )
-        {
-          FT_TRACE0(( "tt_face_build_cmaps:"
-                      " unsupported cmap sub-table ignored\n" ));
-        }
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL( FT_Error )
-  tt_get_cmap_info( FT_CharMap    charmap,
-                    TT_CMapInfo  *cmap_info )
-  {
-    FT_CMap        cmap  = (FT_CMap)charmap;
-    TT_CMap_Class  clazz = (TT_CMap_Class)cmap->clazz;
-
-
-    return clazz->get_cmap_info( charmap, cmap_info );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttcmap.h b/third_party/freetype/src/sfnt/ttcmap.h
deleted file mode 100644
index 83f12df..0000000
--- a/third_party/freetype/src/sfnt/ttcmap.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttcmap.h                                                               */
-/*                                                                         */
-/*    TrueType character mapping table (cmap) support (specification).     */
-/*                                                                         */
-/*  Copyright 2002-2017 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 TTCMAP_H_
-#define TTCMAP_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-#include FT_INTERNAL_VALIDATE_H
-#include FT_SERVICE_TT_CMAP_H
-
-FT_BEGIN_HEADER
-
-
-#define TT_CMAP_FLAG_UNSORTED     1
-#define TT_CMAP_FLAG_OVERLAPPING  2
-
-  typedef struct  TT_CMapRec_
-  {
-    FT_CMapRec  cmap;
-    FT_Byte*    data;           /* pointer to in-memory cmap table */
-    FT_Int      flags;          /* for format 4 only               */
-
-  } TT_CMapRec, *TT_CMap;
-
-  typedef const struct TT_CMap_ClassRec_*  TT_CMap_Class;
-
-
-  typedef FT_Error
-  (*TT_CMap_ValidateFunc)( FT_Byte*      data,
-                           FT_Validator  valid );
-
-  typedef struct  TT_CMap_ClassRec_
-  {
-    FT_CMap_ClassRec      clazz;
-    FT_UInt               format;
-    TT_CMap_ValidateFunc  validate;
-    TT_CMap_Info_GetFunc  get_cmap_info;
-
-  } TT_CMap_ClassRec;
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_TT_CMAP( class_,             \
-                           size_,              \
-                           init_,              \
-                           done_,              \
-                           char_index_,        \
-                           char_next_,         \
-                           char_var_index_,    \
-                           char_var_default_,  \
-                           variant_list_,      \
-                           charvariant_list_,  \
-                           variantchar_list_,  \
-                           format_,            \
-                           validate_,          \
-                           get_cmap_info_ )    \
-  FT_CALLBACK_TABLE_DEF                        \
-  const TT_CMap_ClassRec  class_ =             \
-  {                                            \
-    { size_,                                   \
-      init_,                                   \
-      done_,                                   \
-      char_index_,                             \
-      char_next_,                              \
-      char_var_index_,                         \
-      char_var_default_,                       \
-      variant_list_,                           \
-      charvariant_list_,                       \
-      variantchar_list_                        \
-    },                                         \
-                                               \
-    format_,                                   \
-    validate_,                                 \
-    get_cmap_info_                             \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_TT_CMAP( class_,                      \
-                           size_,                       \
-                           init_,                       \
-                           done_,                       \
-                           char_index_,                 \
-                           char_next_,                  \
-                           char_var_index_,             \
-                           char_var_default_,           \
-                           variant_list_,               \
-                           charvariant_list_,           \
-                           variantchar_list_,           \
-                           format_,                     \
-                           validate_,                   \
-                           get_cmap_info_ )             \
-  void                                                  \
-  FT_Init_Class_ ## class_( TT_CMap_ClassRec*  clazz )  \
-  {                                                     \
-    clazz->clazz.size             = size_;              \
-    clazz->clazz.init             = init_;              \
-    clazz->clazz.done             = done_;              \
-    clazz->clazz.char_index       = char_index_;        \
-    clazz->clazz.char_next        = char_next_;         \
-    clazz->clazz.char_var_index   = char_var_index_;    \
-    clazz->clazz.char_var_default = char_var_default_;  \
-    clazz->clazz.variant_list     = variant_list_;      \
-    clazz->clazz.charvariant_list = charvariant_list_;  \
-    clazz->clazz.variantchar_list = variantchar_list_;  \
-    clazz->format                 = format_;            \
-    clazz->validate               = validate_;          \
-    clazz->get_cmap_info          = get_cmap_info_;     \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-  typedef struct  TT_ValidatorRec_
-  {
-    FT_ValidatorRec  validator;
-    FT_UInt          num_glyphs;
-
-  } TT_ValidatorRec, *TT_Validator;
-
-
-#define TT_VALIDATOR( x )          ( (TT_Validator)( x ) )
-#define TT_VALID_GLYPH_COUNT( x )  TT_VALIDATOR( x )->num_glyphs
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_build_cmaps( TT_Face  face );
-
-  /* used in tt-cmaps service */
-  FT_LOCAL( FT_Error )
-  tt_get_cmap_info( FT_CharMap    charmap,
-                    TT_CMapInfo  *cmap_info );
-
-
-FT_END_HEADER
-
-#endif /* TTCMAP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttcmapc.h b/third_party/freetype/src/sfnt/ttcmapc.h
deleted file mode 100644
index 9a5e708..0000000
--- a/third_party/freetype/src/sfnt/ttcmapc.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttcmapc.h                                                              */
-/*                                                                         */
-/*    TT CMAP classes definitions (specification only).                    */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifdef TT_CONFIG_CMAP_FORMAT_0
-  TTCMAPCITEM( tt_cmap0_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_2
-  TTCMAPCITEM( tt_cmap2_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_4
-  TTCMAPCITEM( tt_cmap4_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_6
-  TTCMAPCITEM( tt_cmap6_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_8
-  TTCMAPCITEM( tt_cmap8_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_10
-  TTCMAPCITEM( tt_cmap10_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_12
-  TTCMAPCITEM( tt_cmap12_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_13
-  TTCMAPCITEM( tt_cmap13_class_rec )
-#endif
-
-#ifdef TT_CONFIG_CMAP_FORMAT_14
-  TTCMAPCITEM( tt_cmap14_class_rec )
-#endif
-
-
-  /* END */
diff --git a/third_party/freetype/src/sfnt/ttkern.c b/third_party/freetype/src/sfnt/ttkern.c
deleted file mode 100644
index 78dc5eb..0000000
--- a/third_party/freetype/src/sfnt/ttkern.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttkern.c                                                               */
-/*                                                                         */
-/*    Load the basic TrueType kerning table.  This doesn't handle          */
-/*    kerning data within the GPOS table at the moment.                    */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include "ttkern.h"
-
-#include "sferrors.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_ttkern
-
-
-#undef  TT_KERN_INDEX
-#define TT_KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_kern( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_ULong   table_size;
-    FT_Byte*   p;
-    FT_Byte*   p_limit;
-    FT_UInt    nn, num_tables;
-    FT_UInt32  avail = 0, ordered = 0;
-
-
-    /* the kern table is optional; exit silently if it is missing */
-    error = face->goto_table( face, TTAG_kern, stream, &table_size );
-    if ( error )
-      goto Exit;
-
-    if ( table_size < 4 )  /* the case of a malformed table */
-    {
-      FT_ERROR(( "tt_face_load_kern:"
-                 " kerning table is too small - ignored\n" ));
-      error = FT_THROW( Table_Missing );
-      goto Exit;
-    }
-
-    if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) )
-    {
-      FT_ERROR(( "tt_face_load_kern:"
-                 " could not extract kerning table\n" ));
-      goto Exit;
-    }
-
-    face->kern_table_size = table_size;
-
-    p       = face->kern_table;
-    p_limit = p + table_size;
-
-    p         += 2; /* skip version */
-    num_tables = FT_NEXT_USHORT( p );
-
-    if ( num_tables > 32 ) /* we only support up to 32 sub-tables */
-      num_tables = 32;
-
-    for ( nn = 0; nn < num_tables; nn++ )
-    {
-      FT_UInt    num_pairs, length, coverage;
-      FT_Byte*   p_next;
-      FT_UInt32  mask = (FT_UInt32)1UL << nn;
-
-
-      if ( p + 6 > p_limit )
-        break;
-
-      p_next = p;
-
-      p += 2; /* skip version */
-      length   = FT_NEXT_USHORT( p );
-      coverage = FT_NEXT_USHORT( p );
-
-      if ( length <= 6 + 8 )
-        break;
-
-      p_next += length;
-
-      if ( p_next > p_limit )  /* handle broken table */
-        p_next = p_limit;
-
-      /* only use horizontal kerning tables */
-      if ( ( coverage & ~8U ) != 0x0001 ||
-           p + 8 > p_limit              )
-        goto NextTable;
-
-      num_pairs = FT_NEXT_USHORT( p );
-      p        += 6;
-
-      if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */
-        num_pairs = (FT_UInt)( ( p_next - p ) / 6 );
-
-      avail |= mask;
-
-      /*
-       *  Now check whether the pairs in this table are ordered.
-       *  We then can use binary search.
-       */
-      if ( num_pairs > 0 )
-      {
-        FT_ULong  count;
-        FT_ULong  old_pair;
-
-
-        old_pair = FT_NEXT_ULONG( p );
-        p       += 2;
-
-        for ( count = num_pairs - 1; count > 0; count-- )
-        {
-          FT_UInt32  cur_pair;
-
-
-          cur_pair = FT_NEXT_ULONG( p );
-          if ( cur_pair <= old_pair )
-            break;
-
-          p += 2;
-          old_pair = cur_pair;
-        }
-
-        if ( count == 0 )
-          ordered |= mask;
-      }
-
-    NextTable:
-      p = p_next;
-    }
-
-    face->num_kern_tables = nn;
-    face->kern_avail_bits = avail;
-    face->kern_order_bits = ordered;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_done_kern( TT_Face  face )
-  {
-    FT_Stream  stream = face->root.stream;
-
-
-    FT_FRAME_RELEASE( face->kern_table );
-    face->kern_table_size = 0;
-    face->num_kern_tables = 0;
-    face->kern_avail_bits = 0;
-    face->kern_order_bits = 0;
-  }
-
-
-  FT_LOCAL_DEF( FT_Int )
-  tt_face_get_kerning( TT_Face  face,
-                       FT_UInt  left_glyph,
-                       FT_UInt  right_glyph )
-  {
-    FT_Int    result = 0;
-    FT_UInt   count, mask;
-    FT_Byte*  p       = face->kern_table;
-    FT_Byte*  p_limit = p + face->kern_table_size;
-
-
-    p   += 4;
-    mask = 0x0001;
-
-    for ( count = face->num_kern_tables;
-          count > 0 && p + 6 <= p_limit;
-          count--, mask <<= 1 )
-    {
-      FT_Byte* base     = p;
-      FT_Byte* next;
-      FT_UInt  version  = FT_NEXT_USHORT( p );
-      FT_UInt  length   = FT_NEXT_USHORT( p );
-      FT_UInt  coverage = FT_NEXT_USHORT( p );
-      FT_UInt  num_pairs;
-      FT_Int   value    = 0;
-
-      FT_UNUSED( version );
-
-
-      next = base + length;
-
-      if ( next > p_limit )  /* handle broken table */
-        next = p_limit;
-
-      if ( ( face->kern_avail_bits & mask ) == 0 )
-        goto NextTable;
-
-      if ( p + 8 > next )
-        goto NextTable;
-
-      num_pairs = FT_NEXT_USHORT( p );
-      p        += 6;
-
-      if ( ( next - p ) < 6 * (int)num_pairs )  /* handle broken count  */
-        num_pairs = (FT_UInt)( ( next - p ) / 6 );
-
-      switch ( coverage >> 8 )
-      {
-      case 0:
-        {
-          FT_ULong  key0 = TT_KERN_INDEX( left_glyph, right_glyph );
-
-
-          if ( face->kern_order_bits & mask )   /* binary search */
-          {
-            FT_UInt   min = 0;
-            FT_UInt   max = num_pairs;
-
-
-            while ( min < max )
-            {
-              FT_UInt   mid = ( min + max ) >> 1;
-              FT_Byte*  q   = p + 6 * mid;
-              FT_ULong  key;
-
-
-              key = FT_NEXT_ULONG( q );
-
-              if ( key == key0 )
-              {
-                value = FT_PEEK_SHORT( q );
-                goto Found;
-              }
-              if ( key < key0 )
-                min = mid + 1;
-              else
-                max = mid;
-            }
-          }
-          else /* linear search */
-          {
-            FT_UInt  count2;
-
-
-            for ( count2 = num_pairs; count2 > 0; count2-- )
-            {
-              FT_ULong  key = FT_NEXT_ULONG( p );
-
-
-              if ( key == key0 )
-              {
-                value = FT_PEEK_SHORT( p );
-                goto Found;
-              }
-              p += 2;
-            }
-          }
-        }
-        break;
-
-       /*
-        *  We don't support format 2 because we haven't seen a single font
-        *  using it in real life...
-        */
-
-      default:
-        ;
-      }
-
-      goto NextTable;
-
-    Found:
-      if ( coverage & 8 ) /* override or add */
-        result = value;
-      else
-        result += value;
-
-    NextTable:
-      p = next;
-    }
-
-    return result;
-  }
-
-#undef TT_KERN_INDEX
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttkern.h b/third_party/freetype/src/sfnt/ttkern.h
deleted file mode 100644
index db1a30b..0000000
--- a/third_party/freetype/src/sfnt/ttkern.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttkern.h                                                               */
-/*                                                                         */
-/*    Load the basic TrueType kerning table.  This doesn't handle          */
-/*    kerning data within the GPOS table at the moment.                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTKERN_H_
-#define TTKERN_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error  )
-  tt_face_load_kern( TT_Face    face,
-                     FT_Stream  stream );
-
-  FT_LOCAL( void )
-  tt_face_done_kern( TT_Face  face );
-
-  FT_LOCAL( FT_Int )
-  tt_face_get_kerning( TT_Face     face,
-                       FT_UInt     left_glyph,
-                       FT_UInt     right_glyph );
-
-#define TT_FACE_HAS_KERNING( face )  ( (face)->kern_avail_bits != 0 )
-
-
-FT_END_HEADER
-
-#endif /* TTKERN_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttload.c b/third_party/freetype/src/sfnt/ttload.c
deleted file mode 100644
index 53837c7..0000000
--- a/third_party/freetype/src/sfnt/ttload.c
+++ /dev/null
@@ -1,1354 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttload.c                                                               */
-/*                                                                         */
-/*    Load the basic TrueType tables, i.e., tables that can be either in   */
-/*    TTF or OTF fonts (body).                                             */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include "ttload.h"
-
-#include "sferrors.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_ttload
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_lookup_table                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Looks for a TrueType table by name.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A face object handle.                                      */
-  /*                                                                       */
-  /*    tag  :: The searched tag.                                          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A pointer to the table directory entry.  0 if not found.           */
-  /*                                                                       */
-  FT_LOCAL_DEF( TT_Table  )
-  tt_face_lookup_table( TT_Face   face,
-                        FT_ULong  tag  )
-  {
-    TT_Table  entry;
-    TT_Table  limit;
-#ifdef FT_DEBUG_LEVEL_TRACE
-    FT_Bool   zero_length = FALSE;
-#endif
-
-
-    FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ",
-                face,
-                (FT_Char)( tag >> 24 ),
-                (FT_Char)( tag >> 16 ),
-                (FT_Char)( tag >> 8  ),
-                (FT_Char)( tag       ) ));
-
-    entry = face->dir_tables;
-    limit = entry + face->num_tables;
-
-    for ( ; entry < limit; entry++ )
-    {
-      /* For compatibility with Windows, we consider    */
-      /* zero-length tables the same as missing tables. */
-      if ( entry->Tag == tag )
-      {
-        if ( entry->Length != 0 )
-        {
-          FT_TRACE4(( "found table.\n" ));
-          return entry;
-        }
-#ifdef FT_DEBUG_LEVEL_TRACE
-        zero_length = TRUE;
-#endif
-      }
-    }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-    if ( zero_length )
-      FT_TRACE4(( "ignoring empty table\n" ));
-    else
-      FT_TRACE4(( "could not find table\n" ));
-#endif
-
-    return NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_goto_table                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Looks for a TrueType table by name, then seek a stream to it.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A face object handle.                                    */
-  /*                                                                       */
-  /*    tag    :: The searched tag.                                        */
-  /*                                                                       */
-  /*    stream :: The stream to seek when the table is found.              */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    length :: The length of the table if found, undefined otherwise.   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_goto_table( TT_Face    face,
-                      FT_ULong   tag,
-                      FT_Stream  stream,
-                      FT_ULong*  length )
-  {
-    TT_Table  table;
-    FT_Error  error;
-
-
-    table = tt_face_lookup_table( face, tag );
-    if ( table )
-    {
-      if ( length )
-        *length = table->Length;
-
-      if ( FT_STREAM_SEEK( table->Offset ) )
-        goto Exit;
-    }
-    else
-      error = FT_THROW( Table_Missing );
-
-  Exit:
-    return error;
-  }
-
-
-  /* Here, we                                                         */
-  /*                                                                  */
-  /* - 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                     */
-  /*                                                                  */
-  /* - errors (except errors returned by stream handling)             */
-  /*                                                                  */
-  /*     SFNT_Err_Unknown_File_Format:                                */
-  /*       no table is defined in directory, it is not sfnt-wrapped   */
-  /*       data                                                       */
-  /*     SFNT_Err_Table_Missing:                                      */
-  /*       table directory is valid, but essential tables             */
-  /*       (head/bhed/SING) are missing                               */
-  /*                                                                  */
-  static FT_Error
-  check_table_dir( SFNT_Header  sfnt,
-                   FT_Stream    stream,
-                   FT_UShort*   valid )
-  {
-    FT_Error   error;
-    FT_UShort  nn, valid_entries = 0;
-    FT_UInt    has_head = 0, has_sing = 0, has_meta = 0;
-    FT_ULong   offset = sfnt->offset + 12;
-
-    static const FT_Frame_Field  table_dir_entry_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_TableRec
-
-      FT_FRAME_START( 16 ),
-        FT_FRAME_ULONG( Tag ),
-        FT_FRAME_ULONG( CheckSum ),
-        FT_FRAME_ULONG( Offset ),
-        FT_FRAME_ULONG( Length ),
-      FT_FRAME_END
-    };
-
-
-    if ( FT_STREAM_SEEK( offset ) )
-      goto Exit;
-
-    for ( nn = 0; nn < sfnt->num_tables; nn++ )
-    {
-      TT_TableRec  table;
-
-
-      if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) )
-      {
-        nn--;
-        FT_TRACE2(( "check_table_dir:"
-                    " can read only %d table%s in font (instead of %d)\n",
-                    nn, nn == 1 ? "" : "s", sfnt->num_tables ));
-        sfnt->num_tables = nn;
-        break;
-      }
-
-      /* 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     */
-        /* contents is harmless.  This also makes FreeType less sensitive */
-        /* to invalid table lengths (which programs like Acroread seem to */
-        /* ignore in general).                                            */
-
-        if ( table.Tag == TTAG_hmtx ||
-             table.Tag == TTAG_vmtx )
-          valid_entries++;
-        else
-        {
-          FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn ));
-          continue;
-        }
-      }
-      else
-        valid_entries++;
-
-      if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed )
-      {
-        FT_UInt32  magic;
-
-
-#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-        if ( table.Tag == TTAG_head )
-#endif
-          has_head = 1;
-
-        /*
-         * The table length should be 0x36, but certain font tools make it
-         * 0x38, so we will just check that it is greater.
-         *
-         * Note that according to the specification, the table must be
-         * padded to 32-bit lengths, but this doesn't apply to the value of
-         * its `Length' field!
-         *
-         */
-        if ( table.Length < 0x36 )
-        {
-          FT_TRACE2(( "check_table_dir:"
-                      " `head' or `bhed' table too small\n" ));
-          error = FT_THROW( Table_Missing );
-          goto Exit;
-        }
-
-        if ( FT_STREAM_SEEK( table.Offset + 12 ) ||
-             FT_READ_ULONG( magic )              )
-          goto Exit;
-
-        if ( magic != 0x5F0F3CF5UL )
-          FT_TRACE2(( "check_table_dir:"
-                      " invalid magic number in `head' or `bhed' table\n"));
-
-        if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) )
-          goto Exit;
-      }
-      else if ( table.Tag == TTAG_SING )
-        has_sing = 1;
-      else if ( table.Tag == TTAG_META )
-        has_meta = 1;
-    }
-
-    *valid = valid_entries;
-
-    if ( !valid_entries )
-    {
-      FT_TRACE2(( "check_table_dir: no valid tables found\n" ));
-      error = FT_THROW( Unknown_File_Format );
-      goto Exit;
-    }
-
-    /* if `sing' and `meta' tables are present, there is no `head' table */
-    if ( has_head || ( has_sing && has_meta ) )
-    {
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-    else
-    {
-      FT_TRACE2(( "check_table_dir:" ));
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-      FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" ));
-#else
-      FT_TRACE2(( " neither `head' nor `sing' table found\n" ));
-#endif
-      error = FT_THROW( Table_Missing );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_font_dir                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the header of a SFNT font file.                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face       :: A handle to the target face object.                  */
-  /*                                                                       */
-  /*    stream     :: The input stream.                                    */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    sfnt       :: The SFNT header.                                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The stream cursor must be at the beginning of the font directory.  */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_font_dir( TT_Face    face,
-                         FT_Stream  stream )
-  {
-    SFNT_HeaderRec  sfnt;
-    FT_Error        error;
-    FT_Memory       memory = stream->memory;
-    FT_UShort       nn, valid_entries;
-
-    static const FT_Frame_Field  offset_table_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  SFNT_HeaderRec
-
-      FT_FRAME_START( 8 ),
-        FT_FRAME_USHORT( num_tables ),
-        FT_FRAME_USHORT( search_range ),
-        FT_FRAME_USHORT( entry_selector ),
-        FT_FRAME_USHORT( range_shift ),
-      FT_FRAME_END
-    };
-
-
-    FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face ));
-
-    /* read the offset table */
-
-    sfnt.offset = FT_STREAM_POS();
-
-    if ( FT_READ_ULONG( sfnt.format_tag )                    ||
-         FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) )
-      goto Exit;
-
-    /* many fonts don't have these fields set correctly */
-#if 0
-    if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 )        ||
-         sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 )
-      return FT_THROW( Unknown_File_Format );
-#endif
-
-    /* load the table directory */
-
-    FT_TRACE2(( "-- Number of tables: %10u\n",    sfnt.num_tables ));
-    FT_TRACE2(( "-- Format version:   0x%08lx\n", sfnt.format_tag ));
-
-    if ( sfnt.format_tag != TTAG_OTTO )
-    {
-      /* check first */
-      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 = 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( sfnt.num_tables * 16L ) )
-      goto Exit;
-
-    FT_TRACE2(( "\n"
-                "  tag    offset    length   checksum\n"
-                "  ----------------------------------\n" ));
-
-    valid_entries = 0;
-    for ( nn = 0; nn < sfnt.num_tables; nn++ )
-    {
-      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 )
-        continue;
-      else if ( entry.Length > stream->size - entry.Offset )
-      {
-        if ( entry.Tag == TTAG_hmtx ||
-             entry.Tag == TTAG_vmtx )
-        {
-#ifdef FT_DEBUG_LEVEL_TRACE
-          FT_ULong  old_length = entry.Length;
-#endif
-
-
-          /* make metrics table length a multiple of 4 */
-          entry.Length = ( stream->size - entry.Offset ) & ~3U;
-
-          FT_TRACE2(( "  %c%c%c%c  %08lx  %08lx  %08lx"
-                      " (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 ));
-        }
-        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(( "\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" ));
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_any                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads any font table into client memory.                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: The face object to look for.                             */
-  /*                                                                       */
-  /*    tag    :: The tag of table to load.  Use the value 0 if you want   */
-  /*              to access the whole font file, else set this parameter   */
-  /*              to a valid TrueType table tag that you can forge with    */
-  /*              the MAKE_TT_TAG macro.                                   */
-  /*                                                                       */
-  /*    offset :: The starting offset in the table (or the file if         */
-  /*              tag == 0).                                               */
-  /*                                                                       */
-  /*    length :: The address of the decision variable:                    */
-  /*                                                                       */
-  /*                If length == NULL:                                     */
-  /*                  Loads the whole table.  Returns an error if          */
-  /*                  `offset' == 0!                                       */
-  /*                                                                       */
-  /*                If *length == 0:                                       */
-  /*                  Exits immediately; returning the length of the given */
-  /*                  table or of the font file, depending on the value of */
-  /*                  `tag'.                                               */
-  /*                                                                       */
-  /*                If *length != 0:                                       */
-  /*                  Loads the next `length' bytes of table or font,      */
-  /*                  starting at offset `offset' (in table or font too).  */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    buffer :: The address of target buffer.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_any( TT_Face    face,
-                    FT_ULong   tag,
-                    FT_Long    offset,
-                    FT_Byte*   buffer,
-                    FT_ULong*  length )
-  {
-    FT_Error   error;
-    FT_Stream  stream;
-    TT_Table   table;
-    FT_ULong   size;
-
-
-    if ( tag != 0 )
-    {
-      /* look for tag in font directory */
-      table = tt_face_lookup_table( face, tag );
-      if ( !table )
-      {
-        error = FT_THROW( Table_Missing );
-        goto Exit;
-      }
-
-      offset += table->Offset;
-      size    = table->Length;
-    }
-    else
-      /* tag == 0 -- the user wants to access the font file directly */
-      size = face->root.stream->size;
-
-    if ( length && *length == 0 )
-    {
-      *length = size;
-
-      return FT_Err_Ok;
-    }
-
-    if ( length )
-      size = *length;
-
-    stream = face->root.stream;
-    /* the `if' is syntactic sugar for picky compilers */
-    if ( FT_STREAM_READ_AT( offset, buffer, size ) )
-      goto Exit;
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_generic_header                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the TrueType table `head' or `bhed'.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  tt_face_load_generic_header( TT_Face    face,
-                               FT_Stream  stream,
-                               FT_ULong   tag )
-  {
-    FT_Error    error;
-    TT_Header*  header;
-
-    static const FT_Frame_Field  header_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_Header
-
-      FT_FRAME_START( 54 ),
-        FT_FRAME_ULONG ( Table_Version ),
-        FT_FRAME_ULONG ( Font_Revision ),
-        FT_FRAME_LONG  ( CheckSum_Adjust ),
-        FT_FRAME_LONG  ( Magic_Number ),
-        FT_FRAME_USHORT( Flags ),
-        FT_FRAME_USHORT( Units_Per_EM ),
-        FT_FRAME_LONG  ( Created[0] ),
-        FT_FRAME_LONG  ( Created[1] ),
-        FT_FRAME_LONG  ( Modified[0] ),
-        FT_FRAME_LONG  ( Modified[1] ),
-        FT_FRAME_SHORT ( xMin ),
-        FT_FRAME_SHORT ( yMin ),
-        FT_FRAME_SHORT ( xMax ),
-        FT_FRAME_SHORT ( yMax ),
-        FT_FRAME_USHORT( Mac_Style ),
-        FT_FRAME_USHORT( Lowest_Rec_PPEM ),
-        FT_FRAME_SHORT ( Font_Direction ),
-        FT_FRAME_SHORT ( Index_To_Loc_Format ),
-        FT_FRAME_SHORT ( Glyph_Data_Format ),
-      FT_FRAME_END
-    };
-
-
-    error = face->goto_table( face, tag, stream, 0 );
-    if ( error )
-      goto Exit;
-
-    header = &face->header;
-
-    if ( FT_STREAM_READ_FIELDS( header_fields, header ) )
-      goto Exit;
-
-    FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM ));
-    FT_TRACE3(( "IndexToLoc:   %4d\n", header->Index_To_Loc_Format ));
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_head( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    return tt_face_load_generic_header( face, stream, TTAG_head );
-  }
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_bhed( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    return tt_face_load_generic_header( face, stream, TTAG_bhed );
-  }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_maxp                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the maximum profile into a face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_maxp( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error        error;
-    TT_MaxProfile*  maxProfile = &face->max_profile;
-
-    static const FT_Frame_Field  maxp_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_MaxProfile
-
-      FT_FRAME_START( 6 ),
-        FT_FRAME_LONG  ( version ),
-        FT_FRAME_USHORT( numGlyphs ),
-      FT_FRAME_END
-    };
-
-    static const FT_Frame_Field  maxp_fields_extra[] =
-    {
-      FT_FRAME_START( 26 ),
-        FT_FRAME_USHORT( maxPoints ),
-        FT_FRAME_USHORT( maxContours ),
-        FT_FRAME_USHORT( maxCompositePoints ),
-        FT_FRAME_USHORT( maxCompositeContours ),
-        FT_FRAME_USHORT( maxZones ),
-        FT_FRAME_USHORT( maxTwilightPoints ),
-        FT_FRAME_USHORT( maxStorage ),
-        FT_FRAME_USHORT( maxFunctionDefs ),
-        FT_FRAME_USHORT( maxInstructionDefs ),
-        FT_FRAME_USHORT( maxStackElements ),
-        FT_FRAME_USHORT( maxSizeOfInstructions ),
-        FT_FRAME_USHORT( maxComponentElements ),
-        FT_FRAME_USHORT( maxComponentDepth ),
-      FT_FRAME_END
-    };
-
-
-    error = face->goto_table( face, TTAG_maxp, stream, 0 );
-    if ( error )
-      goto Exit;
-
-    if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) )
-      goto Exit;
-
-    maxProfile->maxPoints             = 0;
-    maxProfile->maxContours           = 0;
-    maxProfile->maxCompositePoints    = 0;
-    maxProfile->maxCompositeContours  = 0;
-    maxProfile->maxZones              = 0;
-    maxProfile->maxTwilightPoints     = 0;
-    maxProfile->maxStorage            = 0;
-    maxProfile->maxFunctionDefs       = 0;
-    maxProfile->maxInstructionDefs    = 0;
-    maxProfile->maxStackElements      = 0;
-    maxProfile->maxSizeOfInstructions = 0;
-    maxProfile->maxComponentElements  = 0;
-    maxProfile->maxComponentDepth     = 0;
-
-    if ( maxProfile->version >= 0x10000L )
-    {
-      if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) )
-        goto Exit;
-
-      /* XXX: an adjustment that is necessary to load certain */
-      /*      broken fonts like `Keystrokes MT' :-(           */
-      /*                                                      */
-      /*   We allocate 64 function entries by default when    */
-      /*   the maxFunctionDefs value is smaller.              */
-
-      if ( maxProfile->maxFunctionDefs < 64 )
-        maxProfile->maxFunctionDefs = 64;
-
-      /* we add 4 phantom points later */
-      if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) )
-      {
-        FT_TRACE0(( "tt_face_load_maxp:"
-                    " too much twilight points in `maxp' table;\n"
-                    "                  "
-                    " some glyphs might be rendered incorrectly\n" ));
-
-        maxProfile->maxTwilightPoints = 0xFFFFU - 4;
-      }
-    }
-
-    FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs ));
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_name                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the name records.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_name( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error      error;
-    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[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_NameTableRec
-
-      FT_FRAME_START( 6 ),
-        FT_FRAME_USHORT( format ),
-        FT_FRAME_USHORT( numNameRecords ),
-        FT_FRAME_USHORT( storageOffset ),
-      FT_FRAME_END
-    };
-
-    static const FT_Frame_Field  name_record_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_NameEntryRec
-
-      /* no FT_FRAME_START */
-        FT_FRAME_USHORT( platformID ),
-        FT_FRAME_USHORT( encodingID ),
-        FT_FRAME_USHORT( languageID ),
-        FT_FRAME_USHORT( nameID ),
-        FT_FRAME_USHORT( stringLength ),
-        FT_FRAME_USHORT( stringOffset ),
-      FT_FRAME_END
-    };
-
-
-    table         = &face->name_table;
-    table->stream = stream;
-
-    error = face->goto_table( face, TTAG_name, stream, &table_len );
-    if ( error )
-      goto Exit;
-
-    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;
-    storage_limit = table_pos + table_len;
-
-    if ( storage_start > storage_limit )
-    {
-      FT_ERROR(( "tt_face_load_name: invalid `name' table\n" ));
-      error = FT_THROW( Name_Table_Missing );
-      goto Exit;
-    }
-
-    /* Allocate the array of name records. */
-    count                 = table->numNameRecords;
-    table->numNameRecords = 0;
-
-    if ( FT_NEW_ARRAY( table->names, count ) ||
-         FT_FRAME_ENTER( count * 12 )        )
-      goto Exit;
-
-    /* Load the name records and determine how much storage is needed */
-    /* to hold the strings themselves.                                */
-    {
-      TT_NameEntryRec*  entry = table->names;
-
-
-      for ( ; count > 0; count-- )
-      {
-        if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) )
-          continue;
-
-        /* check that the name is not empty */
-        if ( entry->stringLength == 0 )
-          continue;
-
-        /* check that the name 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->stringOffset = 0;
-          entry->stringLength = 0;
-          continue;
-        }
-
-        entry++;
-      }
-
-      table->numNameRecords = (FT_UInt)( entry - table->names );
-    }
-
-    FT_FRAME_EXIT();
-
-    /* everything went well, update face->num_names */
-    face->num_names = (FT_UShort) table->numNameRecords;
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_free_names                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Frees the name records.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the target face object.                        */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_face_free_name( TT_Face  face )
-  {
-    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;
-      }
-
-      /* free strings table */
-      FT_FREE( table->names );
-    }
-
-    table->numNameRecords = 0;
-    table->format         = 0;
-    table->storageOffset  = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_cmap                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the cmap directory in a face object.  The cmaps themselves   */
-  /*    are loaded on demand in the `ttcmap.c' module.                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_cmap( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error  error;
-
-
-    error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size );
-    if ( error )
-      goto Exit;
-
-    if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) )
-      face->cmap_size = 0;
-
-  Exit:
-    return error;
-  }
-
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_os2                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the OS2 table.                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_os2( TT_Face    face,
-                    FT_Stream  stream )
-  {
-    FT_Error  error;
-    TT_OS2*   os2;
-
-    static const FT_Frame_Field  os2_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_OS2
-
-      FT_FRAME_START( 78 ),
-        FT_FRAME_USHORT( version ),
-        FT_FRAME_SHORT ( xAvgCharWidth ),
-        FT_FRAME_USHORT( usWeightClass ),
-        FT_FRAME_USHORT( usWidthClass ),
-        FT_FRAME_SHORT ( fsType ),
-        FT_FRAME_SHORT ( ySubscriptXSize ),
-        FT_FRAME_SHORT ( ySubscriptYSize ),
-        FT_FRAME_SHORT ( ySubscriptXOffset ),
-        FT_FRAME_SHORT ( ySubscriptYOffset ),
-        FT_FRAME_SHORT ( ySuperscriptXSize ),
-        FT_FRAME_SHORT ( ySuperscriptYSize ),
-        FT_FRAME_SHORT ( ySuperscriptXOffset ),
-        FT_FRAME_SHORT ( ySuperscriptYOffset ),
-        FT_FRAME_SHORT ( yStrikeoutSize ),
-        FT_FRAME_SHORT ( yStrikeoutPosition ),
-        FT_FRAME_SHORT ( sFamilyClass ),
-        FT_FRAME_BYTE  ( panose[0] ),
-        FT_FRAME_BYTE  ( panose[1] ),
-        FT_FRAME_BYTE  ( panose[2] ),
-        FT_FRAME_BYTE  ( panose[3] ),
-        FT_FRAME_BYTE  ( panose[4] ),
-        FT_FRAME_BYTE  ( panose[5] ),
-        FT_FRAME_BYTE  ( panose[6] ),
-        FT_FRAME_BYTE  ( panose[7] ),
-        FT_FRAME_BYTE  ( panose[8] ),
-        FT_FRAME_BYTE  ( panose[9] ),
-        FT_FRAME_ULONG ( ulUnicodeRange1 ),
-        FT_FRAME_ULONG ( ulUnicodeRange2 ),
-        FT_FRAME_ULONG ( ulUnicodeRange3 ),
-        FT_FRAME_ULONG ( ulUnicodeRange4 ),
-        FT_FRAME_BYTE  ( achVendID[0] ),
-        FT_FRAME_BYTE  ( achVendID[1] ),
-        FT_FRAME_BYTE  ( achVendID[2] ),
-        FT_FRAME_BYTE  ( achVendID[3] ),
-
-        FT_FRAME_USHORT( fsSelection ),
-        FT_FRAME_USHORT( usFirstCharIndex ),
-        FT_FRAME_USHORT( usLastCharIndex ),
-        FT_FRAME_SHORT ( sTypoAscender ),
-        FT_FRAME_SHORT ( sTypoDescender ),
-        FT_FRAME_SHORT ( sTypoLineGap ),
-        FT_FRAME_USHORT( usWinAscent ),
-        FT_FRAME_USHORT( usWinDescent ),
-      FT_FRAME_END
-    };
-
-    /* `OS/2' version 1 and newer */
-    static const FT_Frame_Field  os2_fields_extra1[] =
-    {
-      FT_FRAME_START( 8 ),
-        FT_FRAME_ULONG( ulCodePageRange1 ),
-        FT_FRAME_ULONG( ulCodePageRange2 ),
-      FT_FRAME_END
-    };
-
-    /* `OS/2' version 2 and newer */
-    static const FT_Frame_Field  os2_fields_extra2[] =
-    {
-      FT_FRAME_START( 10 ),
-        FT_FRAME_SHORT ( sxHeight ),
-        FT_FRAME_SHORT ( sCapHeight ),
-        FT_FRAME_USHORT( usDefaultChar ),
-        FT_FRAME_USHORT( usBreakChar ),
-        FT_FRAME_USHORT( usMaxContext ),
-      FT_FRAME_END
-    };
-
-    /* `OS/2' version 5 and newer */
-    static const FT_Frame_Field  os2_fields_extra5[] =
-    {
-      FT_FRAME_START( 4 ),
-        FT_FRAME_USHORT( usLowerOpticalPointSize ),
-        FT_FRAME_USHORT( usUpperOpticalPointSize ),
-      FT_FRAME_END
-    };
-
-
-    /* We now support old Mac fonts where the OS/2 table doesn't  */
-    /* exist.  Simply put, we set the `version' field to 0xFFFF   */
-    /* and test this value each time we need to access the table. */
-    error = face->goto_table( face, TTAG_OS2, stream, 0 );
-    if ( error )
-      goto Exit;
-
-    os2 = &face->os2;
-
-    if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) )
-      goto Exit;
-
-    os2->ulCodePageRange1        = 0;
-    os2->ulCodePageRange2        = 0;
-    os2->sxHeight                = 0;
-    os2->sCapHeight              = 0;
-    os2->usDefaultChar           = 0;
-    os2->usBreakChar             = 0;
-    os2->usMaxContext            = 0;
-    os2->usLowerOpticalPointSize = 0;
-    os2->usUpperOpticalPointSize = 0xFFFF;
-
-    if ( os2->version >= 0x0001 )
-    {
-      /* only version 1 tables */
-      if ( FT_STREAM_READ_FIELDS( os2_fields_extra1, os2 ) )
-        goto Exit;
-
-      if ( os2->version >= 0x0002 )
-      {
-        /* only version 2 tables */
-        if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) )
-          goto Exit;
-
-        if ( os2->version >= 0x0005 )
-        {
-          /* only version 5 tables */
-          if ( FT_STREAM_READ_FIELDS( os2_fields_extra5, os2 ) )
-            goto Exit;
-        }
-      }
-    }
-
-    FT_TRACE3(( "sTypoAscender:  %4d\n",   os2->sTypoAscender ));
-    FT_TRACE3(( "sTypoDescender: %4d\n",   os2->sTypoDescender ));
-    FT_TRACE3(( "usWinAscent:    %4u\n",   os2->usWinAscent ));
-    FT_TRACE3(( "usWinDescent:   %4u\n",   os2->usWinDescent ));
-    FT_TRACE3(( "fsSelection:    0x%2x\n", os2->fsSelection ));
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_postscript                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the Postscript table.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_post( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error        error;
-    TT_Postscript*  post = &face->postscript;
-
-    static const FT_Frame_Field  post_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_Postscript
-
-      FT_FRAME_START( 32 ),
-        FT_FRAME_LONG ( FormatType ),
-        FT_FRAME_LONG ( italicAngle ),
-        FT_FRAME_SHORT( underlinePosition ),
-        FT_FRAME_SHORT( underlineThickness ),
-        FT_FRAME_ULONG( isFixedPitch ),
-        FT_FRAME_ULONG( minMemType42 ),
-        FT_FRAME_ULONG( maxMemType42 ),
-        FT_FRAME_ULONG( minMemType1 ),
-        FT_FRAME_ULONG( maxMemType1 ),
-      FT_FRAME_END
-    };
-
-
-    error = face->goto_table( face, TTAG_post, stream, 0 );
-    if ( error )
-      return error;
-
-    if ( FT_STREAM_READ_FIELDS( post_fields, post ) )
-      return error;
-
-    /* we don't load the glyph names, we do that in another */
-    /* module (ttpost).                                     */
-
-    FT_TRACE3(( "FormatType:   0x%x\n", post->FormatType ));
-    FT_TRACE3(( "isFixedPitch:   %s\n", post->isFixedPitch
-                                        ? "  yes" : "   no" ));
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_pclt                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the PCL 5 Table.                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_pclt( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    static const FT_Frame_Field  pclt_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_PCLT
-
-      FT_FRAME_START( 54 ),
-        FT_FRAME_ULONG ( Version ),
-        FT_FRAME_ULONG ( FontNumber ),
-        FT_FRAME_USHORT( Pitch ),
-        FT_FRAME_USHORT( xHeight ),
-        FT_FRAME_USHORT( Style ),
-        FT_FRAME_USHORT( TypeFamily ),
-        FT_FRAME_USHORT( CapHeight ),
-        FT_FRAME_USHORT( SymbolSet ),
-        FT_FRAME_BYTES ( TypeFace, 16 ),
-        FT_FRAME_BYTES ( CharacterComplement, 8 ),
-        FT_FRAME_BYTES ( FileName, 6 ),
-        FT_FRAME_CHAR  ( StrokeWeight ),
-        FT_FRAME_CHAR  ( WidthType ),
-        FT_FRAME_BYTE  ( SerifStyle ),
-        FT_FRAME_BYTE  ( Reserved ),
-      FT_FRAME_END
-    };
-
-    FT_Error  error;
-    TT_PCLT*  pclt = &face->pclt;
-
-
-    /* optional table */
-    error = face->goto_table( face, TTAG_PCLT, stream, 0 );
-    if ( error )
-      goto Exit;
-
-    if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) )
-      goto Exit;
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_gasp                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads the `gasp' table into a face object.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_gasp( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-
-    FT_UInt        j,num_ranges;
-    TT_GaspRange   gaspranges = NULL;
-
-
-    /* the gasp table is optional */
-    error = face->goto_table( face, TTAG_gasp, stream, 0 );
-    if ( error )
-      goto Exit;
-
-    if ( FT_FRAME_ENTER( 4L ) )
-      goto Exit;
-
-    face->gasp.version   = FT_GET_USHORT();
-    face->gasp.numRanges = FT_GET_USHORT();
-
-    FT_FRAME_EXIT();
-
-    /* only support versions 0 and 1 of the table */
-    if ( face->gasp.version >= 2 )
-    {
-      face->gasp.numRanges = 0;
-      error = FT_THROW( Invalid_Table );
-      goto Exit;
-    }
-
-    num_ranges = face->gasp.numRanges;
-    FT_TRACE3(( "numRanges: %u\n", num_ranges ));
-
-    if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) ||
-         FT_FRAME_ENTER( num_ranges * 4L )                  )
-      goto Exit;
-
-    gaspranges = face->gasp.gaspRanges;
-
-    for ( j = 0; j < num_ranges; j++ )
-    {
-      gaspranges[j].maxPPEM  = FT_GET_USHORT();
-      gaspranges[j].gaspFlag = FT_GET_USHORT();
-
-      FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n",
-                  j,
-                  gaspranges[j].maxPPEM,
-                  gaspranges[j].gaspFlag ));
-    }
-
-    FT_FRAME_EXIT();
-
-  Exit:
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttload.h b/third_party/freetype/src/sfnt/ttload.h
deleted file mode 100644
index 296da86..0000000
--- a/third_party/freetype/src/sfnt/ttload.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttload.h                                                               */
-/*                                                                         */
-/*    Load the basic TrueType tables, i.e., tables that can be either in   */
-/*    TTF or OTF fonts (specification).                                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTLOAD_H_
-#define TTLOAD_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( TT_Table  )
-  tt_face_lookup_table( TT_Face   face,
-                        FT_ULong  tag );
-
-  FT_LOCAL( FT_Error )
-  tt_face_goto_table( TT_Face    face,
-                      FT_ULong   tag,
-                      FT_Stream  stream,
-                      FT_ULong*  length );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_font_dir( TT_Face    face,
-                         FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_any( TT_Face    face,
-                    FT_ULong   tag,
-                    FT_Long    offset,
-                    FT_Byte*   buffer,
-                    FT_ULong*  length );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_head( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_cmap( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_maxp( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_name( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_os2( TT_Face    face,
-                    FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_post( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_pclt( TT_Face    face,
-                     FT_Stream  stream );
-
-  FT_LOCAL( void )
-  tt_face_free_name( TT_Face  face );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_gasp( TT_Face    face,
-                     FT_Stream  stream );
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_bhed( TT_Face    face,
-                     FT_Stream  stream );
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-
-FT_END_HEADER
-
-#endif /* TTLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttmtx.c b/third_party/freetype/src/sfnt/ttmtx.c
deleted file mode 100644
index f2e5541..0000000
--- a/third_party/freetype/src/sfnt/ttmtx.c
+++ /dev/null
@@ -1,318 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttmtx.c                                                                */
-/*                                                                         */
-/*    Load the metrics tables common to TTF and OTF fonts (body).          */
-/*                                                                         */
-/*  Copyright 2006-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_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"
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_ttmtx
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_hmtx                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the `hmtx' or `vmtx' table into a face object.                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A handle to the target face object.                    */
-  /*                                                                       */
-  /*    stream   :: The input stream.                                      */
-  /*                                                                       */
-  /*    vertical :: A boolean flag.  If set, load `vmtx'.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_hmtx( TT_Face    face,
-                     FT_Stream  stream,
-                     FT_Bool    vertical )
-  {
-    FT_Error   error;
-    FT_ULong   tag, table_size;
-    FT_ULong*  ptable_offset;
-    FT_ULong*  ptable_size;
-
-
-    if ( vertical )
-    {
-      tag           = TTAG_vmtx;
-      ptable_offset = &face->vert_metrics_offset;
-      ptable_size   = &face->vert_metrics_size;
-    }
-    else
-    {
-      tag           = TTAG_hmtx;
-      ptable_offset = &face->horz_metrics_offset;
-      ptable_size   = &face->horz_metrics_size;
-    }
-
-    error = face->goto_table( face, tag, stream, &table_size );
-    if ( error )
-      goto Fail;
-
-    *ptable_size   = table_size;
-    *ptable_offset = FT_STREAM_POS();
-
-  Fail:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_hhea                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the `hhea' or 'vhea' table into a face object.                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A handle to the target face object.                    */
-  /*                                                                       */
-  /*    stream   :: The input stream.                                      */
-  /*                                                                       */
-  /*    vertical :: A boolean flag.  If set, load `vhea'.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_hhea( TT_Face    face,
-                     FT_Stream  stream,
-                     FT_Bool    vertical )
-  {
-    FT_Error        error;
-    TT_HoriHeader*  header;
-
-    static const FT_Frame_Field  metrics_header_fields[] =
-    {
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  TT_HoriHeader
-
-      FT_FRAME_START( 36 ),
-        FT_FRAME_ULONG ( Version ),
-        FT_FRAME_SHORT ( Ascender ),
-        FT_FRAME_SHORT ( Descender ),
-        FT_FRAME_SHORT ( Line_Gap ),
-        FT_FRAME_USHORT( advance_Width_Max ),
-        FT_FRAME_SHORT ( min_Left_Side_Bearing ),
-        FT_FRAME_SHORT ( min_Right_Side_Bearing ),
-        FT_FRAME_SHORT ( xMax_Extent ),
-        FT_FRAME_SHORT ( caret_Slope_Rise ),
-        FT_FRAME_SHORT ( caret_Slope_Run ),
-        FT_FRAME_SHORT ( caret_Offset ),
-        FT_FRAME_SHORT ( Reserved[0] ),
-        FT_FRAME_SHORT ( Reserved[1] ),
-        FT_FRAME_SHORT ( Reserved[2] ),
-        FT_FRAME_SHORT ( Reserved[3] ),
-        FT_FRAME_SHORT ( metric_Data_Format ),
-        FT_FRAME_USHORT( number_Of_HMetrics ),
-      FT_FRAME_END
-    };
-
-
-    if ( vertical )
-    {
-      void  *v = &face->vertical;
-
-
-      error = face->goto_table( face, TTAG_vhea, stream, 0 );
-      if ( error )
-        goto Fail;
-
-      header = (TT_HoriHeader*)v;
-    }
-    else
-    {
-      error = face->goto_table( face, TTAG_hhea, stream, 0 );
-      if ( error )
-        goto Fail;
-
-      header = &face->horizontal;
-    }
-
-    if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) )
-      goto Fail;
-
-    FT_TRACE3(( "Ascender:          %5d\n", header->Ascender ));
-    FT_TRACE3(( "Descender:         %5d\n", header->Descender ));
-    FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics ));
-
-    header->long_metrics  = NULL;
-    header->short_metrics = NULL;
-
-  Fail:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_get_metrics                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return the horizontal or vertical metrics in font units for a      */
-  /*    given glyph.  The values are the left side bearing (top side       */
-  /*    bearing for vertical metrics) and advance width (advance height    */
-  /*    for vertical metrics).                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face     :: A pointer to the TrueType face structure.              */
-  /*                                                                       */
-  /*    vertical :: If set to TRUE, get vertical metrics.                  */
-  /*                                                                       */
-  /*    gindex   :: The glyph index.                                       */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    abearing :: The bearing, either left side or top side.             */
-  /*                                                                       */
-  /*    aadvance :: The advance width or advance height, depending on      */
-  /*                the `vertical' flag.                                   */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_face_get_metrics( TT_Face     face,
-                       FT_Bool     vertical,
-                       FT_UInt     gindex,
-                       FT_Short   *abearing,
-                       FT_UShort  *aadvance )
-  {
-    FT_Error        error;
-    FT_Stream       stream = face->root.stream;
-    TT_HoriHeader*  header;
-    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 )
-    {
-      void*  v = &face->vertical;
-
-
-      header     = (TT_HoriHeader*)v;
-      table_pos  = face->vert_metrics_offset;
-      table_size = face->vert_metrics_size;
-    }
-    else
-    {
-      header     = &face->horizontal;
-      table_pos  = face->horz_metrics_offset;
-      table_size = face->horz_metrics_size;
-    }
-
-    table_end = table_pos + table_size;
-
-    k = header->number_Of_HMetrics;
-
-    if ( k > 0 )
-    {
-      if ( gindex < (FT_UInt)k )
-      {
-        table_pos += 4 * gindex;
-        if ( table_pos + 4 > table_end )
-          goto NoData;
-
-        if ( FT_STREAM_SEEK( table_pos ) ||
-             FT_READ_USHORT( *aadvance ) ||
-             FT_READ_SHORT( *abearing )  )
-          goto NoData;
-      }
-      else
-      {
-        table_pos += 4 * ( k - 1 );
-        if ( table_pos + 4 > table_end )
-          goto NoData;
-
-        if ( FT_STREAM_SEEK( table_pos ) ||
-             FT_READ_USHORT( *aadvance ) )
-          goto NoData;
-
-        table_pos += 4 + 2 * ( gindex - k );
-        if ( table_pos + 2 > table_end )
-          *abearing = 0;
-        else
-        {
-          if ( !FT_STREAM_SEEK( table_pos ) )
-            (void)FT_READ_SHORT( *abearing );
-        }
-      }
-    }
-    else
-    {
-    NoData:
-      *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
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttmtx.h b/third_party/freetype/src/sfnt/ttmtx.h
deleted file mode 100644
index 2b93ab2..0000000
--- a/third_party/freetype/src/sfnt/ttmtx.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttmtx.h                                                                */
-/*                                                                         */
-/*    Load the metrics tables common to TTF and OTF fonts (specification). */
-/*                                                                         */
-/*  Copyright 2006-2017 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 TTMTX_H_
-#define TTMTX_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_hhea( TT_Face    face,
-                     FT_Stream  stream,
-                     FT_Bool    vertical );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_hmtx( TT_Face    face,
-                     FT_Stream  stream,
-                     FT_Bool    vertical );
-
-
-  FT_LOCAL( void )
-  tt_face_get_metrics( TT_Face     face,
-                       FT_Bool     vertical,
-                       FT_UInt     gindex,
-                       FT_Short*   abearing,
-                       FT_UShort*  aadvance );
-
-FT_END_HEADER
-
-#endif /* TTMTX_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttpost.c b/third_party/freetype/src/sfnt/ttpost.c
deleted file mode 100644
index 6548e85..0000000
--- a/third_party/freetype/src/sfnt/ttpost.c
+++ /dev/null
@@ -1,565 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpost.c                                                               */
-/*                                                                         */
-/*    PostScript name table processing for TrueType and OpenType fonts     */
-/*    (body).                                                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The post table is not completely loaded by the core engine.  This     */
-  /* file loads the missing PS glyph names and implements an API to access */
-  /* them.                                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include "ttpost.h"
-
-#include "sferrors.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_ttpost
-
-
-  /* If this configuration macro is defined, we rely on the `PSNames' */
-  /* module to grab the glyph names.                                  */
-
-#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
-
-
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-
-#define MAC_NAME( x )  (FT_String*)psnames->macintosh_name( (FT_UInt)(x) )
-
-
-#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
-
-
-   /* Otherwise, we ignore the `PSNames' module, and provide our own  */
-   /* table of Mac names.  Thus, it is possible to build a version of */
-   /* FreeType without the Type 1 driver & PSNames module.            */
-
-#define MAC_NAME( x )  (FT_String*)tt_post_default_names[x]
-
-  /* the 258 default Mac PS glyph names; see file `tools/glnames.py' */
-
-  static const FT_String* const  tt_post_default_names[258] =
-  {
-    /*   0 */
-    ".notdef", ".null", "nonmarkingreturn", "space", "exclam",
-    "quotedbl", "numbersign", "dollar", "percent", "ampersand",
-    /*  10 */
-    "quotesingle", "parenleft", "parenright", "asterisk", "plus",
-    "comma", "hyphen", "period", "slash", "zero",
-    /*  20 */
-    "one", "two", "three", "four", "five",
-    "six", "seven", "eight", "nine", "colon",
-    /*  30 */
-    "semicolon", "less", "equal", "greater", "question",
-    "at", "A", "B", "C", "D",
-    /*  40 */
-    "E", "F", "G", "H", "I",
-    "J", "K", "L", "M", "N",
-    /*  50 */
-    "O", "P", "Q", "R", "S",
-    "T", "U", "V", "W", "X",
-    /*  60 */
-    "Y", "Z", "bracketleft", "backslash", "bracketright",
-    "asciicircum", "underscore", "grave", "a", "b",
-    /*  70 */
-    "c", "d", "e", "f", "g",
-    "h", "i", "j", "k", "l",
-    /*  80 */
-    "m", "n", "o", "p", "q",
-    "r", "s", "t", "u", "v",
-    /*  90 */
-    "w", "x", "y", "z", "braceleft",
-    "bar", "braceright", "asciitilde", "Adieresis", "Aring",
-    /* 100 */
-    "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
-    "aacute", "agrave", "acircumflex", "adieresis", "atilde",
-    /* 110 */
-    "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
-    "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
-    /* 120 */
-    "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
-    "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
-    /* 130 */
-    "dagger", "degree", "cent", "sterling", "section",
-    "bullet", "paragraph", "germandbls", "registered", "copyright",
-    /* 140 */
-    "trademark", "acute", "dieresis", "notequal", "AE",
-    "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
-    /* 150 */
-    "yen", "mu", "partialdiff", "summation", "product",
-    "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
-    /* 160 */
-    "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
-    "radical", "florin", "approxequal", "Delta", "guillemotleft",
-    /* 170 */
-    "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde",
-    "Otilde", "OE", "oe", "endash", "emdash",
-    /* 180 */
-    "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
-    "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
-    /* 190 */
-    "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
-    "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
-    /* 200 */
-    "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
-    "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
-    /* 210 */
-    "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
-    "dotlessi", "circumflex", "tilde", "macron", "breve",
-    /* 220 */
-    "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
-    "caron", "Lslash", "lslash", "Scaron", "scaron",
-    /* 230 */
-    "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
-    "Yacute", "yacute", "Thorn", "thorn", "minus",
-    /* 240 */
-    "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
-    "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
-    /* 250 */
-    "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute",
-    "Ccaron", "ccaron", "dcroat",
-  };
-
-
-#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */
-
-
-  static FT_Error
-  load_format_20( TT_Face    face,
-                  FT_Stream  stream,
-                  FT_ULong   post_limit )
-  {
-    FT_Memory   memory = stream->memory;
-    FT_Error    error;
-
-    FT_Int      num_glyphs;
-    FT_UShort   num_names;
-
-    FT_UShort*  glyph_indices = NULL;
-    FT_Char**   name_strings  = NULL;
-
-
-    if ( FT_READ_USHORT( num_glyphs ) )
-      goto Exit;
-
-    /* UNDOCUMENTED!  The number of glyphs in this table can be smaller */
-    /* than the value in the maxp table (cf. cyberbit.ttf).             */
-
-    /* There already exist fonts which have more than 32768 glyph names */
-    /* in this table, so the test for this threshold has been dropped.  */
-
-    if ( num_glyphs > face->max_profile.numGlyphs )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    /* load the indices */
-    {
-      FT_Int  n;
-
-
-      if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) ||
-           FT_FRAME_ENTER( num_glyphs * 2L )          )
-        goto Fail;
-
-      for ( n = 0; n < num_glyphs; n++ )
-        glyph_indices[n] = FT_GET_USHORT();
-
-      FT_FRAME_EXIT();
-    }
-
-    /* compute number of names stored in table */
-    {
-      FT_Int  n;
-
-
-      num_names = 0;
-
-      for ( n = 0; n < num_glyphs; n++ )
-      {
-        FT_Int  idx;
-
-
-        idx = glyph_indices[n];
-        if ( idx >= 258 )
-        {
-          idx -= 257;
-          if ( idx > num_names )
-            num_names = (FT_UShort)idx;
-        }
-      }
-    }
-
-    /* now load the name strings */
-    {
-      FT_UShort  n;
-
-
-      if ( FT_NEW_ARRAY( name_strings, num_names ) )
-        goto Fail;
-
-      for ( n = 0; n < num_names; n++ )
-      {
-        FT_UInt  len;
-
-
-        if ( FT_STREAM_POS() >= post_limit )
-          break;
-        else
-        {
-          FT_TRACE6(( "load_format_20: %d byte left in post table\n",
-                      post_limit - FT_STREAM_POS() ));
-
-          if ( FT_READ_BYTE( len ) )
-            goto Fail1;
-        }
-
-        if ( len > post_limit                   ||
-             FT_STREAM_POS() > post_limit - len )
-        {
-          FT_Int  d = (FT_Int)post_limit - (FT_Int)FT_STREAM_POS();
-
-
-          FT_ERROR(( "load_format_20:"
-                     " exceeding string length (%d),"
-                     " truncating at end of post table (%d byte left)\n",
-                     len, d ));
-          len = (FT_UInt)FT_MAX( 0, d );
-        }
-
-        if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) ||
-             FT_STREAM_READ( name_strings[n], len   ) )
-          goto Fail1;
-
-        name_strings[n][len] = '\0';
-      }
-
-      if ( n < num_names )
-      {
-        FT_ERROR(( "load_format_20:"
-                   " all entries in post table are already parsed,"
-                   " using NULL names for gid %d - %d\n",
-                    n, num_names - 1 ));
-        for ( ; n < num_names; n++ )
-          if ( FT_NEW_ARRAY( name_strings[n], 1 ) )
-            goto Fail1;
-          else
-            name_strings[n][0] = '\0';
-      }
-    }
-
-    /* all right, set table fields and exit successfully */
-    {
-      TT_Post_20  table = &face->postscript_names.names.format_20;
-
-
-      table->num_glyphs    = (FT_UShort)num_glyphs;
-      table->num_names     = (FT_UShort)num_names;
-      table->glyph_indices = glyph_indices;
-      table->glyph_names   = name_strings;
-    }
-    return FT_Err_Ok;
-
-  Fail1:
-    {
-      FT_UShort  n;
-
-
-      for ( n = 0; n < num_names; n++ )
-        FT_FREE( name_strings[n] );
-    }
-
-  Fail:
-    FT_FREE( name_strings );
-    FT_FREE( glyph_indices );
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  load_format_25( TT_Face    face,
-                  FT_Stream  stream,
-                  FT_ULong   post_limit )
-  {
-    FT_Memory  memory = stream->memory;
-    FT_Error   error;
-
-    FT_Int     num_glyphs;
-    FT_Char*   offset_table = NULL;
-
-    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                         ||
-         num_glyphs < 1                           )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    if ( FT_NEW_ARRAY( offset_table, num_glyphs )   ||
-         FT_STREAM_READ( offset_table, num_glyphs ) )
-      goto Fail;
-
-    /* now check the offset table */
-    {
-      FT_Int  n;
-
-
-      for ( n = 0; n < num_glyphs; n++ )
-      {
-        FT_Long  idx = (FT_Long)n + offset_table[n];
-
-
-        if ( idx < 0 || idx > num_glyphs )
-        {
-          error = FT_THROW( Invalid_File_Format );
-          goto Fail;
-        }
-      }
-    }
-
-    /* OK, set table fields and exit successfully */
-    {
-      TT_Post_25  table = &face->postscript_names.names.format_25;
-
-
-      table->num_glyphs = (FT_UShort)num_glyphs;
-      table->offsets    = offset_table;
-    }
-
-    return FT_Err_Ok;
-
-  Fail:
-    FT_FREE( offset_table );
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  load_post_names( TT_Face  face )
-  {
-    FT_Stream  stream;
-    FT_Error   error;
-    FT_Fixed   format;
-    FT_ULong   post_len;
-    FT_ULong   post_limit;
-
-
-    /* get a stream for the face's resource */
-    stream = face->root.stream;
-
-    /* seek to the beginning of the PS names table */
-    error = face->goto_table( face, TTAG_post, stream, &post_len );
-    if ( error )
-      goto Exit;
-
-    post_limit = FT_STREAM_POS() + post_len;
-
-    format = face->postscript.FormatType;
-
-    /* go to beginning of subtable */
-    if ( FT_STREAM_SKIP( 32 ) )
-      goto Exit;
-
-    /* now read postscript table */
-    if ( format == 0x00020000L )
-      error = load_format_20( face, stream, post_limit );
-    else if ( format == 0x00028000L )
-      error = load_format_25( face, stream, post_limit );
-    else
-      error = FT_THROW( Invalid_File_Format );
-
-    face->postscript_names.loaded = 1;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_free_ps_names( TT_Face  face )
-  {
-    FT_Memory      memory = face->root.memory;
-    TT_Post_Names  names  = &face->postscript_names;
-    FT_Fixed       format;
-
-
-    if ( names->loaded )
-    {
-      format = face->postscript.FormatType;
-
-      if ( format == 0x00020000L )
-      {
-        TT_Post_20  table = &names->names.format_20;
-        FT_UShort   n;
-
-
-        FT_FREE( table->glyph_indices );
-        table->num_glyphs = 0;
-
-        for ( n = 0; n < table->num_names; n++ )
-          FT_FREE( table->glyph_names[n] );
-
-        FT_FREE( table->glyph_names );
-        table->num_names = 0;
-      }
-      else if ( format == 0x00028000L )
-      {
-        TT_Post_25  table = &names->names.format_25;
-
-
-        FT_FREE( table->offsets );
-        table->num_glyphs = 0;
-      }
-    }
-    names->loaded = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_get_ps_name                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Get the PostScript glyph name of a glyph.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the parent face.                             */
-  /*                                                                       */
-  /*    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.   */
-  /*                                                                       */
-  /*              You must not modify the returned string!                 */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_get_ps_name( TT_Face      face,
-                       FT_UInt      idx,
-                       FT_String**  PSname )
-  {
-    FT_Error       error;
-    TT_Post_Names  names;
-    FT_Fixed       format;
-
-#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
-    FT_Service_PsCMaps  psnames;
-#endif
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( idx >= (FT_UInt)face->max_profile.numGlyphs )
-      return FT_THROW( Invalid_Glyph_Index );
-
-#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES
-    psnames = (FT_Service_PsCMaps)face->psnames;
-    if ( !psnames )
-      return FT_THROW( Unimplemented_Feature );
-#endif
-
-    names = &face->postscript_names;
-
-    /* `.notdef' by default */
-    *PSname = MAC_NAME( 0 );
-
-    format = face->postscript.FormatType;
-
-    if ( format == 0x00010000L )
-    {
-      if ( idx < 258 )                    /* paranoid checking */
-        *PSname = MAC_NAME( idx );
-    }
-    else if ( format == 0x00020000L )
-    {
-      TT_Post_20  table = &names->names.format_20;
-
-
-      if ( !names->loaded )
-      {
-        error = load_post_names( face );
-        if ( error )
-          goto End;
-      }
-
-      if ( idx < (FT_UInt)table->num_glyphs )
-      {
-        FT_UShort  name_index = table->glyph_indices[idx];
-
-
-        if ( name_index < 258 )
-          *PSname = MAC_NAME( name_index );
-        else
-          *PSname = (FT_String*)table->glyph_names[name_index - 258];
-      }
-    }
-    else if ( format == 0x00028000L )
-    {
-      TT_Post_25  table = &names->names.format_25;
-
-
-      if ( !names->loaded )
-      {
-        error = load_post_names( face );
-        if ( error )
-          goto End;
-      }
-
-      if ( idx < (FT_UInt)table->num_glyphs )    /* paranoid checking */
-        *PSname = MAC_NAME( (FT_Int)idx + table->offsets[idx] );
-    }
-
-    /* nothing to do for format == 0x00030000L */
-
-  End:
-    return FT_Err_Ok;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttpost.h b/third_party/freetype/src/sfnt/ttpost.h
deleted file mode 100644
index 722485e..0000000
--- a/third_party/freetype/src/sfnt/ttpost.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpost.h                                                               */
-/*                                                                         */
-/*    PostScript name table processing for TrueType and OpenType fonts     */
-/*    (specification).                                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTPOST_H_
-#define TTPOST_H_
-
-
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_get_ps_name( TT_Face      face,
-                       FT_UInt      idx,
-                       FT_String**  PSname );
-
-  FT_LOCAL( void )
-  tt_face_free_ps_names( TT_Face  face );
-
-
-FT_END_HEADER
-
-#endif /* TTPOST_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftgrays.c b/third_party/freetype/src/smooth/ftgrays.c
deleted file mode 100644
index 9982f72..0000000
--- a/third_party/freetype/src/smooth/ftgrays.c
+++ /dev/null
@@ -1,2057 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgrays.c                                                              */
-/*                                                                         */
-/*    A new `perfect' anti-aliasing renderer (body).                       */
-/*                                                                         */
-/*  Copyright 2000-2017 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 can be compiled without the rest of the FreeType engine, by */
-  /* 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/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */
-  /*   same directory                                                      */
-  /*                                                                       */
-  /* - compile `ftgrays' with the STANDALONE_ macro defined, as in         */
-  /*                                                                       */
-  /*     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  */
-  /* with a call to `ft_gray_raster.raster_render'.                        */
-  /*                                                                       */
-  /* See the comments and documentation in the file `ftimage.h' for more   */
-  /* details on how the raster works.                                      */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This is a new anti-aliasing scan-converter for FreeType 2.  The       */
-  /* algorithm used here is _very_ different from the one in the standard  */
-  /* `ftraster' module.  Actually, `ftgrays' computes the _exact_          */
-  /* coverage of the outline on each pixel cell.                           */
-  /*                                                                       */
-  /* It is based on ideas that I initially found in Raph Levien's          */
-  /* excellent LibArt graphics library (see http://www.levien.com/libart   */
-  /* for more information, though the web pages do not tell anything       */
-  /* about the renderer; you'll have to dive into the source code to       */
-  /* understand how it works).                                             */
-  /*                                                                       */
-  /* Note, however, that this is a _very_ different implementation         */
-  /* compared to Raph's.  Coverage information is stored in a very         */
-  /* different way, and I don't use sorted vector paths.  Also, it doesn't */
-  /* use floating point values.                                            */
-  /*                                                                       */
-  /* This renderer has the following advantages:                           */
-  /*                                                                       */
-  /* - It doesn't need an intermediate bitmap.  Instead, one can supply a  */
-  /*   callback function that will be called by the renderer to draw gray  */
-  /*   spans on any target surface.  You can thus do direct composition on */
-  /*   any kind of bitmap, provided that you give the renderer the right   */
-  /*   callback.                                                           */
-  /*                                                                       */
-  /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on   */
-  /*   each pixel cell.                                                    */
-  /*                                                                       */
-  /* - It performs a single pass on the outline (the `standard' FT2        */
-  /*   renderer makes two passes).                                         */
-  /*                                                                       */
-  /* - It can easily be modified to render to _any_ number of gray levels  */
-  /*   cheaply.                                                            */
-  /*                                                                       */
-  /* - For small (< 20) pixel sizes, it is faster than the standard        */
-  /*   renderer.                                                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_smooth
-
-
-#ifdef STANDALONE_
-
-
-  /* The size in bytes of the render pool used by the scan-line converter  */
-  /* to do all of its work.                                                */
-#define FT_RENDER_POOL_SIZE  16384L
-
-
-  /* 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_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) )
-
-
-  /*
-   *  Approximate sqrt(x*x+y*y) using the `alpha max plus beta min'
-   *  algorithm.  We use alpha = 1, beta = 3/8, giving us results with a
-   *  largest error less than 7% compared to the exact value.
-   */
-#define FT_HYPOT( x, y )                 \
-          ( x = FT_ABS( x ),             \
-            y = FT_ABS( y ),             \
-            x > y ? x + ( 3 * y >> 3 )   \
-                  : y + ( 3 * x >> 3 ) )
-
-
-  /* define this to dump debugging information */
-/* #define FT_DEBUG_LEVEL_TRACE */
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-#include <stdio.h>
-#include <stdarg.h>
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include <setjmp.h>
-#include <limits.h>
-#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 ft_memset   memset
-
-#define ft_setjmp   setjmp
-#define ft_longjmp  longjmp
-#define ft_jmp_buf  jmp_buf
-
-typedef ptrdiff_t  FT_PtrDist;
-
-
-#define ErrRaster_Invalid_Mode      -2
-#define ErrRaster_Invalid_Outline   -1
-#define ErrRaster_Invalid_Argument  -3
-#define ErrRaster_Memory_Overflow   -4
-
-#define FT_BEGIN_HEADER
-#define FT_END_HEADER
-
-#include "ftimage.h"
-#include "ftgrays.h"
-
-
-  /* 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 */
-  /* ANSI compilers (e.g. LCC).                                          */
-#define FT_UNUSED( x )  (x) = (x)
-
-
-  /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-  void
-  FT_Message( const char*  fmt,
-              ... )
-  {
-    va_list  ap;
-
-
-    va_start( ap, fmt );
-    vfprintf( stderr, fmt, ap );
-    va_end( ap );
-  }
-
-
-  /* empty function useful for setting a breakpoint to catch errors */
-  int
-  FT_Throw( int          error,
-            int          line,
-            const char*  file )
-  {
-    FT_UNUSED( error );
-    FT_UNUSED( line );
-    FT_UNUSED( file );
-
-    return 0;
-  }
-
-
-  /* we don't handle tracing levels in stand-alone mode; */
-#ifndef FT_TRACE5
-#define FT_TRACE5( varformat )  FT_Message varformat
-#endif
-#ifndef FT_TRACE7
-#define FT_TRACE7( varformat )  FT_Message varformat
-#endif
-#ifndef FT_ERROR
-#define FT_ERROR( varformat )   FT_Message varformat
-#endif
-
-#define FT_THROW( e )                               \
-          ( FT_Throw( FT_ERR_CAT( ErrRaster, e ),   \
-                      __LINE__,                     \
-                      __FILE__ )                  | \
-            FT_ERR_CAT( ErrRaster, e )            )
-
-#else /* !FT_DEBUG_LEVEL_TRACE */
-
-#define FT_TRACE5( x )  do { } while ( 0 )     /* nothing */
-#define FT_TRACE7( x )  do { } while ( 0 )     /* nothing */
-#define FT_ERROR( x )   do { } while ( 0 )     /* nothing */
-#define FT_THROW( e )   FT_ERR_CAT( ErrRaster_, e )
-
-
-#endif /* !FT_DEBUG_LEVEL_TRACE */
-
-
-#define FT_DEFINE_OUTLINE_FUNCS( class_,               \
-                                 move_to_, line_to_,   \
-                                 conic_to_, cubic_to_, \
-                                 shift_, delta_ )      \
-          static const FT_Outline_Funcs class_ =       \
-          {                                            \
-            move_to_,                                  \
-            line_to_,                                  \
-            conic_to_,                                 \
-            cubic_to_,                                 \
-            shift_,                                    \
-            delta_                                     \
-         };
-
-#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_,            \
-                                raster_new_, raster_reset_,       \
-                                raster_set_mode_, raster_render_, \
-                                raster_done_ )                    \
-          const FT_Raster_Funcs class_ =                          \
-          {                                                       \
-            glyph_format_,                                        \
-            raster_new_,                                          \
-            raster_reset_,                                        \
-            raster_set_mode_,                                     \
-            raster_render_,                                       \
-            raster_done_                                          \
-         };
-
-
-#else /* !STANDALONE_ */
-
-
-#include <ft2build.h>
-#include "ftgrays.h"
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_OUTLINE_H
-
-#include "ftsmerrs.h"
-
-#include "ftspic.h"
-
-#define Smooth_Err_Invalid_Mode     Smooth_Err_Cannot_Render_Glyph
-#define Smooth_Err_Memory_Overflow  Smooth_Err_Out_Of_Memory
-#define ErrRaster_Memory_Overflow   Smooth_Err_Out_Of_Memory
-
-
-#endif /* !STANDALONE_ */
-
-
-#ifndef FT_MEM_SET
-#define FT_MEM_SET( d, s, c )  ft_memset( d, s, c )
-#endif
-
-#ifndef FT_MEM_ZERO
-#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
-#undef RAS_ARG_
-#undef RAS_VAR
-#undef RAS_VAR_
-
-#ifndef FT_STATIC_RASTER
-
-#define RAS_ARG   gray_PWorker  worker
-#define RAS_ARG_  gray_PWorker  worker,
-
-#define RAS_VAR   worker
-#define RAS_VAR_  worker,
-
-#else /* FT_STATIC_RASTER */
-
-#define RAS_ARG   void
-#define RAS_ARG_  /* empty */
-#define RAS_VAR   /* empty */
-#define RAS_VAR_  /* empty */
-
-#endif /* FT_STATIC_RASTER */
-
-
-  /* must be at least 6 bits! */
-#define PIXEL_BITS  8
-
-#undef FLOOR
-#undef CEILING
-#undef TRUNC
-#undef SCALED
-
-#define ONE_PIXEL       ( 1 << PIXEL_BITS )
-#define TRUNC( x )      ( (TCoord)( (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) * ( ONE_PIXEL >> 6 ) )
-#define DOWNSCALE( x )  ( (x) >> ( PIXEL_BITS - 6 ) )
-#else
-#define UPSCALE( 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.                                 */
-#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
-  FT_BEGIN_STMNT                                                   \
-    (quotient)  = (type)( (dividend) / (divisor) );                \
-    (remainder) = (type)( (dividend) % (divisor) );                \
-    if ( (remainder) < 0 )                                         \
-    {                                                              \
-      (quotient)--;                                                \
-      (remainder) += (type)(divisor);                              \
-    }                                                              \
-  FT_END_STMNT
-
-#ifdef  __arm__
-  /* Work around a bug specific to GCC which make the compiler fail to */
-  /* 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                */
-#undef FT_DIV_MOD
-#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \
-  FT_BEGIN_STMNT                                                   \
-    (quotient)  = (type)( (dividend) / (divisor) );                \
-    (remainder) = (type)( (dividend) - (quotient) * (divisor) );   \
-    if ( (remainder) < 0 )                                         \
-    {                                                              \
-      (quotient)--;                                                \
-      (remainder) += (type)(divisor);                              \
-    }                                                              \
-  FT_END_STMNT
-#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                                                    */
-  /*                                                                       */
-
-  /* don't change the following types to FT_Int or FT_Pos, since we might */
-  /* need to define them to "float" or "double" when experimenting with   */
-  /* new algorithms                                                       */
-
-  typedef long  TPos;     /* sub-pixel coordinate              */
-  typedef int   TCoord;   /* integer scanline/pixel coordinate */
-  typedef int   TArea;    /* cell areas, coordinate products   */
-
-
-  typedef struct TCell_*  PCell;
-
-  typedef struct  TCell_
-  {
-    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   */
-  /* __declspec(align())' in order to compile cleanly with */
-  /* the maximum level of warnings.                        */
-#pragma warning( push )
-#pragma warning( disable : 4324 )
-#endif /* _MSC_VER */
-
-  typedef struct  gray_TWorker_
-  {
-    ft_jmp_buf  jump_buffer;
-
-    TCoord  ex, 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;
-
-    TPos    x,  y;
-
-    FT_Outline  outline;
-    TPixmap     target;
-
-    FT_Raster_Span_Func  render_span;
-    void*                render_span_data;
-
-  } gray_TWorker, *gray_PWorker;
-
-#if defined( _MSC_VER )
-#pragma warning( pop )
-#endif
-
-
-#ifndef FT_STATIC_RASTER
-#define ras  (*worker)
-#else
-  static gray_TWorker  ras;
-#endif
-
-
-  typedef struct gray_TRaster_
-  {
-    void*         memory;
-
-  } gray_TRaster, *gray_PRaster;
-
-
-#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 )
-  {
-    int  y;
-
-
-    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" );
-    }
-  }
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Record the current cell in the table.                                 */
-  /*                                                                       */
-  static void
-  gray_record_cell( RAS_ARG )
-  {
-    PCell  *pcell, cell;
-    TCoord  x = ras.ex;
-
-
-    pcell = &ras.ycells[ras.ey - ras.min_ey];
-    for (;;)
-    {
-      cell = *pcell;
-      if ( !cell || cell->x > x )
-        break;
-
-      if ( cell->x == x )
-        goto Found;
-
-      pcell = &cell->next;
-    }
-
-    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  = ras.area;
-    cell->cover = ras.cover;
-
-    cell->next  = *pcell;
-    *pcell      = cell;
-
-    return;
-
-  Found:
-    /* update old cell */
-    cell->area  += ras.area;
-    cell->cover += ras.cover;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Set the current cell to a new position.                               */
-  /*                                                                       */
-  static void
-  gray_set_cell( RAS_ARG_ TCoord  ex,
-                          TCoord  ey )
-  {
-    /* Move the cell pointer to a new position.  We set the `invalid'      */
-    /* flag to indicate that the cell isn't part of those we're interested */
-    /* in during the render phase.  This means that:                       */
-    /*                                                                     */
-    /* . the new vertical position must be within min_ey..max_ey-1.        */
-    /* . the new horizontal position must be strictly less than max_ex     */
-    /*                                                                     */
-    /* 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.                                 */
-
-    if ( ex < ras.min_ex )
-      ex = ras.min_ex - 1;
-
-    /* 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 = ( ey >= ras.max_ey || ey < ras.min_ey ||
-                    ex >= ras.max_ex );
-  }
-
-
-#ifndef FT_LONG64
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Render a scanline as one or more cells.                               */
-  /*                                                                       */
-  static void
-  gray_render_scanline( RAS_ARG_ TCoord  ey,
-                                 TPos    x1,
-                                 TCoord  y1,
-                                 TPos    x2,
-                                 TCoord  y2 )
-  {
-    TCoord  ex1, ex2, fx1, fx2, first, delta, mod;
-    TPos    p, dx;
-    int     incr;
-
-
-    ex1 = TRUNC( x1 );
-    ex2 = TRUNC( x2 );
-
-    /* trivial case.  Happens often */
-    if ( y1 == y2 )
-    {
-      gray_set_cell( RAS_VAR_ ex2, ey );
-      return;
-    }
-
-    fx1   = (TCoord)( x1 - SUBPIXELS( ex1 ) );
-    fx2   = (TCoord)( x2 - SUBPIXELS( ex2 ) );
-    delta = y2 - y1;
-
-    /* everything is located in a single cell.  That is easy! */
-    /*                                                        */
-    if ( ex1 == ex2 )
-    {
-      ras.area  += (TArea)(( fx1 + fx2 ) * delta);
-      ras.cover += delta;
-      return;
-    }
-
-    /* ok, we'll have to render a run of adjacent cells on the same */
-    /* scanline...                                                  */
-    /*                                                              */
-    dx = x2 - x1;
-
-    if ( dx > 0 )
-    {
-      p     = ( ONE_PIXEL - fx1 ) * delta;
-      first = ONE_PIXEL;
-      incr  = 1;
-    }
-    else
-    {
-      p     = fx1 * delta;
-      first = 0;
-      incr  = -1;
-      dx    = -dx;
-    }
-
-    FT_DIV_MOD( TCoord, p, dx, delta, mod );
-
-    ras.area  += (TArea)(( fx1 + first ) * delta);
-    ras.cover += delta;
-
-    ex1 += incr;
-    gray_set_cell( RAS_VAR_ ex1, ey );
-    y1  += delta;
-
-    if ( ex1 != ex2 )
-    {
-      TCoord  lift, rem;
-
-
-      p = ONE_PIXEL * ( y2 - y1 + delta );
-      FT_DIV_MOD( TCoord, p, dx, lift, rem );
-
-      mod -= (int)dx;
-
-      do
-      {
-        delta = lift;
-        mod  += rem;
-        if ( mod >= 0 )
-        {
-          mod -= (TCoord)dx;
-          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;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Render a given line as a series of scanlines.                         */
-  /*                                                                       */
-  static void
-  gray_render_line( RAS_ARG_ TPos  to_x,
-                             TPos  to_y )
-  {
-    TCoord  ey1, ey2, fy1, fy2, first, delta, mod;
-    TPos    p, dx, dy, x, x2;
-    int     incr;
-
-
-    ey1 = TRUNC( ras.y );
-    ey2 = TRUNC( to_y );     /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */
-
-    /* perform vertical clipping */
-    if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) ||
-         ( ey1 <  ras.min_ey && ey2 <  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 )
-    {
-      gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 );
-      goto End;
-    }
-
-    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 );
-      TCoord  two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 );
-      TArea   area;
-
-
-      if ( dy > 0)
-      {
-        first = ONE_PIXEL;
-        incr  = 1;
-      }
-      else
-      {
-        first = 0;
-        incr  = -1;
-      }
-
-      delta      = first - fy1;
-      ras.area  += (TArea)two_fx * delta;
-      ras.cover += delta;
-      ey1       += incr;
-
-      gray_set_cell( RAS_VAR_ ex, ey1 );
-
-      delta = first + first - ONE_PIXEL;
-      area  = (TArea)two_fx * delta;
-      while ( ey1 != ey2 )
-      {
-        ras.area  += area;
-        ras.cover += delta;
-        ey1       += incr;
-
-        gray_set_cell( RAS_VAR_ ex, ey1 );
-      }
-
-      delta      = fy2 - ONE_PIXEL + first;
-      ras.area  += (TArea)two_fx * delta;
-      ras.cover += delta;
-
-      goto End;
-    }
-
-    /* ok, we have to render several scanlines */
-    if ( dy > 0)
-    {
-      p     = ( ONE_PIXEL - fy1 ) * dx;
-      first = ONE_PIXEL;
-      incr  = 1;
-    }
-    else
-    {
-      p     = fy1 * dx;
-      first = 0;
-      incr  = -1;
-      dy    = -dy;
-    }
-
-    FT_DIV_MOD( TCoord, p, dy, delta, mod );
-
-    x = ras.x + delta;
-    gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first );
-
-    ey1 += incr;
-    gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 );
-
-    if ( ey1 != ey2 )
-    {
-      TCoord  lift, rem;
-
-
-      p    = ONE_PIXEL * dx;
-      FT_DIV_MOD( TCoord, p, dy, lift, rem );
-      mod -= (TCoord)dy;
-
-      do
-      {
-        delta = lift;
-        mod  += rem;
-        if ( mod >= 0 )
-        {
-          mod -= (TCoord)dy;
-          delta++;
-        }
-
-        x2 = x + delta;
-        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, ONE_PIXEL - first,
-                                   to_x, fy2 );
-
-  End:
-    ras.x       = to_x;
-    ras.y       = to_y;
-  }
-
-#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 )
-  {
-    TPos  a, b;
-
-
-    base[4].x = base[2].x;
-    b = base[1].x;
-    a = base[3].x = ( base[2].x + b ) / 2;
-    b = base[1].x = ( base[0].x + b ) / 2;
-    base[2].x = ( a + b ) / 2;
-
-    base[4].y = base[2].y;
-    b = base[1].y;
-    a = base[3].y = ( base[2].y + b ) / 2;
-    b = base[1].y = ( base[0].y + b ) / 2;
-    base[2].y = ( a + b ) / 2;
-  }
-
-
-  static void
-  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;
-    int         draw, split;
-
-
-    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;
-
-    /* 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;
-
-    /* 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;
-    }
-
-    /* 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
-    {
-      split = 1;
-      while ( ( draw & split ) == 0 )
-      {
-        gray_split_conic( arc );
-        arc += 2;
-        split <<= 1;
-      }
-
-      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
-      arc -= 2;
-
-    } while ( --draw );
-  }
-
-
-  static void
-  gray_split_cubic( FT_Vector*  base )
-  {
-    TPos  a, b, c, d;
-
-
-    base[6].x = base[3].x;
-    c = base[1].x;
-    d = base[2].x;
-    base[1].x = a = ( base[0].x + c ) / 2;
-    base[5].x = b = ( base[3].x + d ) / 2;
-    c = ( c + d ) / 2;
-    base[2].x = a = ( a + c ) / 2;
-    base[4].x = b = ( b + c ) / 2;
-    base[3].x = ( a + b ) / 2;
-
-    base[6].y = base[3].y;
-    c = base[1].y;
-    d = base[2].y;
-    base[1].y = a = ( base[0].y + c ) / 2;
-    base[5].y = b = ( base[3].y + d ) / 2;
-    c = ( c + d ) / 2;
-    base[2].y = a = ( a + c ) / 2;
-    base[4].y = b = ( b + c ) / 2;
-    base[3].y = ( a + b ) / 2;
-  }
-
-
-  static void
-  gray_render_cubic( RAS_ARG_ const FT_Vector*  control1,
-                              const FT_Vector*  control2,
-                              const FT_Vector*  to )
-  {
-    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[0].x = UPSCALE( to->x );
-    arc[0].y = UPSCALE( to->y );
-    arc[1].x = UPSCALE( control2->x );
-    arc[1].y = UPSCALE( control2->y );
-    arc[2].x = UPSCALE( control1->x );
-    arc[2].y = UPSCALE( control1->y );
-    arc[3].x = ras.x;
-    arc[3].y = ras.y;
-
-    /* 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 (;;)
-    {
-      /* Decide whether to split or draw. See `Rapid Termination          */
-      /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */
-      /* F. Hain, at                                                      */
-      /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */
-
-      /* 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_ );
-
-      /* Avoid possible arithmetic overflow below by splitting. */
-      if ( L > 32767 )
-        goto Split;
-
-      /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */
-      s_limit = L * (TPos)( ONE_PIXEL / 6 );
-
-      /* 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 );
-
-      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 );
-
-      if ( s > s_limit )
-        goto Split;
-
-      /* 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;
-
-      gray_render_line( RAS_VAR_ arc[0].x, arc[0].y );
-
-      if ( arc == bez_stack )
-        return;
-
-      arc -= 3;
-      continue;
-
-    Split:
-      gray_split_cubic( arc );
-      arc += 3;
-    }
-  }
-
-
-  static int
-  gray_move_to( const FT_Vector*  to,
-                gray_PWorker      worker )
-  {
-    TPos  x, y;
-
-
-    /* start to a new position */
-    x = UPSCALE( to->x );
-    y = UPSCALE( to->y );
-
-    gray_set_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) );
-
-    ras.x = x;
-    ras.y = y;
-    return 0;
-  }
-
-
-  static int
-  gray_line_to( const FT_Vector*  to,
-                gray_PWorker      worker )
-  {
-    gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) );
-    return 0;
-  }
-
-
-  static int
-  gray_conic_to( const FT_Vector*  control,
-                 const FT_Vector*  to,
-                 gray_PWorker      worker )
-  {
-    gray_render_conic( RAS_VAR_ control, to );
-    return 0;
-  }
-
-
-  static int
-  gray_cubic_to( const FT_Vector*  control1,
-                 const FT_Vector*  control2,
-                 const FT_Vector*  to,
-                 gray_PWorker      worker )
-  {
-    gray_render_cubic( RAS_VAR_ control1, control2, to );
-    return 0;
-  }
-
-
-  static void
-  gray_hline( RAS_ARG_ TCoord  x,
-                       TCoord  y,
-                       TArea   area,
-                       TCoord  acount )
-  {
-    int      coverage;
-    FT_Span  span;
-
-
-    /* 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 */
-    if ( coverage < 0 )
-      coverage = -coverage;
-
-    if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL )
-    {
-      coverage &= 511;
-
-      if ( coverage > 256 )
-        coverage = 512 - coverage;
-      else if ( coverage == 256 )
-        coverage = 255;
-    }
-    else
-    {
-      /* normal non-zero winding rule */
-      if ( coverage >= 256 )
-        coverage = 255;
-    }
-
-    if ( ras.render_span )  /* for FT_RASTER_FLAG_DIRECT only */
-    {
-      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 )
-      {
-      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 );
-      }
-    }
-  }
-
-
-  static void
-  gray_sweep( RAS_ARG )
-  {
-    int  y;
-
-
-    FT_TRACE7(( "gray_sweep: start\n" ));
-
-    for ( y = ras.min_ey; y < ras.max_ey; y++ )
-    {
-      PCell   cell  = ras.ycells[y - ras.min_ey];
-      TCoord  cover = 0;
-      TCoord  x     = ras.min_ex;
-
-
-      for ( ; cell != NULL; cell = cell->next )
-      {
-        TArea  area;
-
-
-        if ( cover != 0 && cell->x > x )
-          gray_hline( RAS_VAR_ x, y, (TArea)cover * ( ONE_PIXEL * 2 ),
-                      cell->x - x );
-
-        cover += cell->cover;
-        area   = (TArea)cover * ( ONE_PIXEL * 2 ) - cell->area;
-
-        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, y, (TArea)cover * ( ONE_PIXEL * 2 ),
-                    ras.max_ex - x );
-    }
-
-    FT_TRACE7(( "gray_sweep: end\n" ));
-  }
-
-
-#ifdef STANDALONE_
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  The following functions should only compile in stand-alone mode,     */
-  /*  i.e., when building this component without the rest of FreeType.     */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Decompose                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Walk over an outline's structure to decompose it into individual   */
-  /*    segments and Bézier arcs.  This function is also able to emit      */
-  /*    `move to' and `close to' operations to indicate the start and end  */
-  /*    of new contours in the outline.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    outline        :: A pointer to the source target.                  */
-  /*                                                                       */
-  /*    func_interface :: A table of `emitters', i.e., function pointers   */
-  /*                      called during decomposition to indicate path     */
-  /*                      operations.                                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user           :: A typeless pointer which is passed to each       */
-  /*                      emitter during the decomposition.  It can be     */
-  /*                      used to store the state during the               */
-  /*                      decomposition.                                   */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Error code.  0 means success.                                      */
-  /*                                                                       */
-  static int
-  FT_Outline_Decompose( const FT_Outline*        outline,
-                        const FT_Outline_Funcs*  func_interface,
-                        void*                    user )
-  {
-#undef SCALED
-#define SCALED( x )  ( ( (x) << shift ) - delta )
-
-    FT_Vector   v_last;
-    FT_Vector   v_control;
-    FT_Vector   v_start;
-
-    FT_Vector*  point;
-    FT_Vector*  limit;
-    char*       tags;
-
-    int         error;
-
-    int   n;         /* index of contour in outline     */
-    int   first;     /* index of first point in contour */
-    char  tag;       /* current point's state           */
-
-    int   shift;
-    TPos  delta;
-
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    if ( !func_interface )
-      return FT_THROW( Invalid_Argument );
-
-    shift = func_interface->shift;
-    delta = func_interface->delta;
-    first = 0;
-
-    for ( n = 0; n < outline->n_contours; n++ )
-    {
-      int  last;  /* index of last point in contour */
-
-
-      FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n ));
-
-      last  = outline->contours[n];
-      if ( last < 0 )
-        goto Invalid_Outline;
-      limit = outline->points + last;
-
-      v_start   = outline->points[first];
-      v_start.x = SCALED( v_start.x );
-      v_start.y = SCALED( v_start.y );
-
-      v_last   = outline->points[last];
-      v_last.x = SCALED( v_last.x );
-      v_last.y = SCALED( v_last.y );
-
-      v_control = v_start;
-
-      point = outline->points + first;
-      tags  = outline->tags   + first;
-      tag   = FT_CURVE_TAG( tags[0] );
-
-      /* A contour cannot start with a cubic control point! */
-      if ( tag == FT_CURVE_TAG_CUBIC )
-        goto Invalid_Outline;
-
-      /* check first point to determine origin */
-      if ( tag == FT_CURVE_TAG_CONIC )
-      {
-        /* first point is conic control.  Yes, this happens. */
-        if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON )
-        {
-          /* start at last point if it is on the curve */
-          v_start = v_last;
-          limit--;
-        }
-        else
-        {
-          /* if both first and last points are conic,         */
-          /* start at their middle and record its position    */
-          /* for closure                                      */
-          v_start.x = ( v_start.x + v_last.x ) / 2;
-          v_start.y = ( v_start.y + v_last.y ) / 2;
-
-          v_last = v_start;
-        }
-        point--;
-        tags--;
-      }
-
-      FT_TRACE5(( "  move to (%.2f, %.2f)\n",
-                  v_start.x / 64.0, v_start.y / 64.0 ));
-      error = func_interface->move_to( &v_start, user );
-      if ( error )
-        goto Exit;
-
-      while ( point < limit )
-      {
-        point++;
-        tags++;
-
-        tag = FT_CURVE_TAG( tags[0] );
-        switch ( tag )
-        {
-        case FT_CURVE_TAG_ON:  /* emit a single line_to */
-          {
-            FT_Vector  vec;
-
-
-            vec.x = SCALED( point->x );
-            vec.y = SCALED( point->y );
-
-            FT_TRACE5(( "  line to (%.2f, %.2f)\n",
-                        vec.x / 64.0, vec.y / 64.0 ));
-            error = func_interface->line_to( &vec, user );
-            if ( error )
-              goto Exit;
-            continue;
-          }
-
-        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
-          v_control.x = SCALED( point->x );
-          v_control.y = SCALED( point->y );
-
-        Do_Conic:
-          if ( point < limit )
-          {
-            FT_Vector  vec;
-            FT_Vector  v_middle;
-
-
-            point++;
-            tags++;
-            tag = FT_CURVE_TAG( tags[0] );
-
-            vec.x = SCALED( point->x );
-            vec.y = SCALED( point->y );
-
-            if ( tag == FT_CURVE_TAG_ON )
-            {
-              FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                          " with control (%.2f, %.2f)\n",
-                          vec.x / 64.0, vec.y / 64.0,
-                          v_control.x / 64.0, v_control.y / 64.0 ));
-              error = func_interface->conic_to( &v_control, &vec, user );
-              if ( error )
-                goto Exit;
-              continue;
-            }
-
-            if ( tag != FT_CURVE_TAG_CONIC )
-              goto Invalid_Outline;
-
-            v_middle.x = ( v_control.x + vec.x ) / 2;
-            v_middle.y = ( v_control.y + vec.y ) / 2;
-
-            FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                        " with control (%.2f, %.2f)\n",
-                        v_middle.x / 64.0, v_middle.y / 64.0,
-                        v_control.x / 64.0, v_control.y / 64.0 ));
-            error = func_interface->conic_to( &v_control, &v_middle, user );
-            if ( error )
-              goto Exit;
-
-            v_control = vec;
-            goto Do_Conic;
-          }
-
-          FT_TRACE5(( "  conic to (%.2f, %.2f)"
-                      " with control (%.2f, %.2f)\n",
-                      v_start.x / 64.0, v_start.y / 64.0,
-                      v_control.x / 64.0, v_control.y / 64.0 ));
-          error = func_interface->conic_to( &v_control, &v_start, user );
-          goto Close;
-
-        default:  /* FT_CURVE_TAG_CUBIC */
-          {
-            FT_Vector  vec1, vec2;
-
-
-            if ( point + 1 > limit                             ||
-                 FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC )
-              goto Invalid_Outline;
-
-            point += 2;
-            tags  += 2;
-
-            vec1.x = SCALED( point[-2].x );
-            vec1.y = SCALED( point[-2].y );
-
-            vec2.x = SCALED( point[-1].x );
-            vec2.y = SCALED( point[-1].y );
-
-            if ( point <= limit )
-            {
-              FT_Vector  vec;
-
-
-              vec.x = SCALED( point->x );
-              vec.y = SCALED( point->y );
-
-              FT_TRACE5(( "  cubic to (%.2f, %.2f)"
-                          " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
-                          vec.x / 64.0, vec.y / 64.0,
-                          vec1.x / 64.0, vec1.y / 64.0,
-                          vec2.x / 64.0, vec2.y / 64.0 ));
-              error = func_interface->cubic_to( &vec1, &vec2, &vec, user );
-              if ( error )
-                goto Exit;
-              continue;
-            }
-
-            FT_TRACE5(( "  cubic to (%.2f, %.2f)"
-                        " with controls (%.2f, %.2f) and (%.2f, %.2f)\n",
-                        v_start.x / 64.0, v_start.y / 64.0,
-                        vec1.x / 64.0, vec1.y / 64.0,
-                        vec2.x / 64.0, vec2.y / 64.0 ));
-            error = func_interface->cubic_to( &vec1, &vec2, &v_start, user );
-            goto Close;
-          }
-        }
-      }
-
-      /* close the contour with a line segment */
-      FT_TRACE5(( "  line to (%.2f, %.2f)\n",
-                  v_start.x / 64.0, v_start.y / 64.0 ));
-      error = func_interface->line_to( &v_start, user );
-
-   Close:
-      if ( error )
-        goto Exit;
-
-      first = last + 1;
-    }
-
-    FT_TRACE5(( "FT_Outline_Decompose: Done\n", n ));
-    return 0;
-
-  Exit:
-    FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error ));
-    return error;
-
-  Invalid_Outline:
-    return FT_THROW( Invalid_Outline );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <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.           */
-  /*                                                                       */
-
-  static void
-  FT_Outline_Get_CBox( const FT_Outline*  outline,
-                       FT_BBox           *acbox )
-  {
-    TPos  xMin, yMin, xMax, yMax;
-
-
-    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,   /* 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
-  gray_convert_glyph_inner( RAS_ARG )
-  {
-
-    volatile int  error = 0;
-
-#ifdef FT_CONFIG_OPTION_PIC
-      FT_Outline_Funcs func_interface;
-      Init_Class_func_interface(&func_interface);
-#endif
-
-    if ( ft_setjmp( ras.jump_buffer ) == 0 )
-    {
-      error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras );
-      if ( !ras.invalid )
-        gray_record_cell( RAS_VAR );
-
-      FT_TRACE7(( "band [%d..%d]: %d cells\n",
-                  ras.min_ey, ras.max_ey, ras.num_cells ));
-    }
-    else
-    {
-      error = FT_THROW( Memory_Overflow );
-
-      FT_TRACE7(( "band [%d..%d]: to be bisected\n",
-                  ras.min_ey, ras.max_ey ));
-    }
-
-    return error;
-  }
-
-
-  static int
-  gray_convert_glyph( RAS_ARG )
-  {
-    TCell    buffer[FT_MAX_GRAY_POOL];
-    TCoord   band_size = FT_MAX_GRAY_POOL / 8;
-    TCoord   count = ras.max_ey - ras.min_ey;
-    int      num_bands;
-    TCoord   min, max, max_y;
-    TCoord   bands[32];  /* enough to accommodate bisections */
-    TCoord*  band;
-
-
-    /* set up vertical bands */
-    if ( count > band_size )
-    {
-      /* two divisions rounded up */
-      num_bands = (int)( ( count + band_size - 1) / band_size );
-      band_size = ( count + num_bands - 1 ) / num_bands;
-    }
-
-    min   = ras.min_ey;
-    max_y = ras.max_ey;
-
-    for ( ; min < max_y; min = max )
-    {
-      max = min + band_size;
-      if ( max > max_y )
-        max = max_y;
-
-      band    = bands;
-      band[1] = min;
-      band[0] = max;
-
-      do
-      {
-        TCoord  width = band[0] - band[1];
-        int     error;
-
-
-        /* memory management */
-        {
-          size_t  ycount = (size_t)width;
-          size_t  cell_start;
-
-
-          cell_start = ( ycount * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) /
-                       sizeof ( TCell );
-
-          ras.cells     = buffer + cell_start;
-          ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - cell_start );
-          ras.num_cells = 0;
-
-          ras.ycells = (PCell*)buffer;
-          while ( ycount )
-            ras.ycells[--ycount] = NULL;
-        }
-
-        ras.invalid   = 1;
-        ras.min_ey    = band[1];
-        ras.max_ey    = band[0];
-
-        error = gray_convert_glyph_inner( RAS_VAR );
-
-        if ( !error )
-        {
-          gray_sweep( RAS_VAR );
-          band--;
-          continue;
-        }
-        else if ( error != ErrRaster_Memory_Overflow )
-          return 1;
-
-        /* render pool overflow; we will reduce the render band by half */
-        width >>= 1;
-
-        /* This is too complex for a single scanline; there must */
-        /* be some problems.                                     */
-        if ( width == 0 )
-        {
-          FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" ));
-          return 1;
-        }
-
-        band++;
-        band[1]  = band[0];
-        band[0] += width;
-      } while ( band >= bands );
-    }
-
-    return 0;
-  }
-
-
-  static int
-  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;
-    FT_BBox            cbox, clip;
-
-#ifndef FT_STATIC_RASTER
-    gray_TWorker  worker[1];
-#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 );
-
-    /* return immediately if the outline is empty */
-    if ( outline->n_points == 0 || outline->n_contours <= 0 )
-      return 0;
-
-    if ( !outline->contours || !outline->points )
-      return FT_THROW( Invalid_Outline );
-
-    if ( outline->n_points !=
-           outline->contours[outline->n_contours - 1] + 1 )
-      return FT_THROW( Invalid_Outline );
-
-    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 );
-
-      /* nothing to do */
-      if ( !target_map->width || !target_map->rows )
-        return 0;
-
-      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;
-    }
-
-    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 */
-      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 )
-      clip = params->clip_box;
-    else
-    {
-      clip.xMin = -32768L;
-      clip.yMin = -32768L;
-      clip.xMax =  32767L;
-      clip.yMax =  32767L;
-    }
-
-    /* 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 );
-
-    if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey )
-      return 0;
-
-    return gray_convert_glyph( RAS_VAR );
-  }
-
-
-  /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/
-  /****                         a static object.                   *****/
-
-#ifdef STANDALONE_
-
-  static int
-  gray_raster_new( void*       memory,
-                   FT_Raster*  araster )
-  {
-    static gray_TRaster  the_raster;
-
-    FT_UNUSED( memory );
-
-
-    *araster = (FT_Raster)&the_raster;
-    FT_ZERO( &the_raster );
-
-    return 0;
-  }
-
-
-  static void
-  gray_raster_done( FT_Raster  raster )
-  {
-    /* nothing */
-    FT_UNUSED( raster );
-  }
-
-#else /* !STANDALONE_ */
-
-  static int
-  gray_raster_new( FT_Memory   memory,
-                   FT_Raster*  araster )
-  {
-    FT_Error      error;
-    gray_PRaster  raster = NULL;
-
-
-    *araster = 0;
-    if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) )
-    {
-      raster->memory = memory;
-      *araster       = (FT_Raster)raster;
-    }
-
-    return error;
-  }
-
-
-  static void
-  gray_raster_done( FT_Raster  raster )
-  {
-    FT_Memory  memory = (FT_Memory)((gray_PRaster)raster)->memory;
-
-
-    FT_FREE( raster );
-  }
-
-#endif /* !STANDALONE_ */
-
-
-  static void
-  gray_raster_reset( FT_Raster       raster,
-                     unsigned char*  pool_base,
-                     unsigned long   pool_size )
-  {
-    FT_UNUSED( raster );
-    FT_UNUSED( pool_base );
-    FT_UNUSED( pool_size );
-  }
-
-
-  static int
-  gray_raster_set_mode( FT_Raster      raster,
-                        unsigned long  mode,
-                        void*          args )
-  {
-    FT_UNUSED( raster );
-    FT_UNUSED( mode );
-    FT_UNUSED( args );
-
-
-    return 0; /* nothing to do */
-  }
-
-
-  FT_DEFINE_RASTER_FUNCS(
-    ft_grays_raster,
-
-    FT_GLYPH_FORMAT_OUTLINE,
-
-    (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 */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/src/smooth/ftgrays.h b/third_party/freetype/src/smooth/ftgrays.h
deleted file mode 100644
index a5447da..0000000
--- a/third_party/freetype/src/smooth/ftgrays.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgrays.h                                                              */
-/*                                                                         */
-/*    FreeType smooth renderer declaration                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTGRAYS_H_
-#define FTGRAYS_H_
-
-#ifdef __cplusplus
-  extern "C" {
-#endif
-
-
-#ifdef STANDALONE_
-#include "ftimage.h"
-#else
-#include <ft2build.h>
-#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */
-#include FT_IMAGE_H
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* To make ftgrays.h independent from configuration files we check       */
-  /* whether FT_EXPORT_VAR has been defined already.                       */
-  /*                                                                       */
-  /* On some systems and compilers (Win32 mostly), an extra keyword is     */
-  /* necessary to compile the library as a DLL.                            */
-  /*                                                                       */
-#ifndef FT_EXPORT_VAR
-#define FT_EXPORT_VAR( x )  extern  x
-#endif
-
-  FT_EXPORT_VAR( const FT_Raster_Funcs )  ft_grays_raster;
-
-
-#ifdef __cplusplus
-  }
-#endif
-
-#endif /* FTGRAYS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftsmerrs.h b/third_party/freetype/src/smooth/ftsmerrs.h
deleted file mode 100644
index a528c61..0000000
--- a/third_party/freetype/src/smooth/ftsmerrs.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsmerrs.h                                                             */
-/*                                                                         */
-/*    smooth renderer error codes (specification only).                    */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the smooth renderer error enumeration     */
-  /* constants.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef FTSMERRS_H_
-#define FTSMERRS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  Smooth_Err_
-#define FT_ERR_BASE    FT_Mod_Err_Smooth
-
-#include FT_ERRORS_H
-
-#endif /* FTSMERRS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftsmooth.c b/third_party/freetype/src/smooth/ftsmooth.c
deleted file mode 100644
index c9292df..0000000
--- a/third_party/freetype/src/smooth/ftsmooth.c
+++ /dev/null
@@ -1,512 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsmooth.c                                                             */
-/*                                                                         */
-/*    Anti-aliasing renderer interface (body).                             */
-/*                                                                         */
-/*  Copyright 2000-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_OUTLINE_H
-#include "ftsmooth.h"
-#include "ftgrays.h"
-#include "ftspic.h"
-
-#include "ftsmerrs.h"
-
-
-  /* initialize renderer -- init its raster */
-  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 );
-
-    return 0;
-  }
-
-
-  /* sets render-specific mode */
-  static FT_Error
-  ft_smooth_set_mode( FT_Renderer  render,
-                      FT_ULong     mode_tag,
-                      FT_Pointer   data )
-  {
-    /* we simply pass it to the raster */
-    return render->clazz->raster_class->raster_set_mode( render->raster,
-                                                         mode_tag,
-                                                         data );
-  }
-
-  /* transform a given glyph image */
-  static FT_Error
-  ft_smooth_transform( FT_Renderer       render,
-                       FT_GlyphSlot      slot,
-                       const FT_Matrix*  matrix,
-                       const FT_Vector*  delta )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( slot->format != render->glyph_format )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( matrix )
-      FT_Outline_Transform( &slot->outline, matrix );
-
-    if ( delta )
-      FT_Outline_Translate( &slot->outline, delta->x, delta->y );
-
-  Exit:
-    return error;
-  }
-
-
-  /* return the glyph's control box */
-  static void
-  ft_smooth_get_cbox( FT_Renderer   render,
-                      FT_GlyphSlot  slot,
-                      FT_BBox*      cbox )
-  {
-    FT_ZERO( cbox );
-
-    if ( slot->format == render->glyph_format )
-      FT_Outline_Get_CBox( &slot->outline, cbox );
-  }
-
-
-  /* convert a slot's glyph image into a bitmap */
-  static FT_Error
-  ft_smooth_render_generic( FT_Renderer       render,
-                            FT_GlyphSlot      slot,
-                            FT_Render_Mode    mode,
-                            const FT_Vector*  origin,
-                            FT_Render_Mode    required_mode )
-  {
-    FT_Error     error;
-    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_Raster_Params  params;
-
-    FT_Bool  have_outline_shifted = FALSE;
-    FT_Bool  have_buffer          = FALSE;
-
-
-    /* check glyph image format */
-    if ( slot->format != render->glyph_format )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* check mode */
-    if ( mode != required_mode )
-    {
-      error = FT_THROW( Cannot_Render_Glyph );
-      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 )
-    {
-      FT_FREE( bitmap->buffer );
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-
-    /* allocate new one */
-    if ( FT_ALLOC( bitmap->buffer, (FT_ULong)( pitch * height ) ) )
-      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;
-
-    bitmap->pixel_mode = FT_PIXEL_MODE_GRAY;
-    bitmap->num_grays  = 256;
-    bitmap->width      = (unsigned int)width;
-    bitmap->rows       = (unsigned int)height;
-    bitmap->pitch      = pitch;
-
-    /* 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;
-    params.source = outline;
-    params.flags  = FT_RASTER_FLAG_AA;
-
-#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING
-
-    /* implode outline if needed */
-    {
-      FT_Vector*  points     = outline->points;
-      FT_Vector*  points_end = points + outline->n_points;
-      FT_Vector*  vec;
-
-
-      if ( hmul )
-        for ( vec = points; vec < points_end; vec++ )
-          vec->x *= 3;
-
-      if ( vmul )
-        for ( vec = points; vec < points_end; vec++ )
-          vec->y *= 3;
-    }
-
-    /* render outline into the bitmap */
-    error = render->raster_render( render->raster, &params );
-
-    /* deflate outline if needed */
-    {
-      FT_Vector*  points     = outline->points;
-      FT_Vector*  points_end = points + outline->n_points;
-      FT_Vector*  vec;
-
-
-      if ( hmul )
-        for ( vec = points; vec < points_end; vec++ )
-          vec->x /= 3;
-
-      if ( vmul )
-        for ( vec = points; vec < points_end; vec++ )
-          vec->y /= 3;
-    }
-
-    if ( error )
-      goto Exit;
-
-    if ( slot->library->lcd_filter_func )
-      slot->library->lcd_filter_func( bitmap, mode, slot->library );
-
-#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 )
-    {
-      FT_Byte*  line = bitmap->buffer;
-      FT_UInt   hh;
-
-
-      for ( hh = height_org; hh > 0; hh--, line += pitch )
-      {
-        FT_UInt   xx;
-        FT_Byte*  end = line + width;
-
-
-        for ( xx = width_org; xx > 0; xx-- )
-        {
-          FT_UInt  pixel = line[xx-1];
-
-
-          end[-3] = (FT_Byte)pixel;
-          end[-2] = (FT_Byte)pixel;
-          end[-1] = (FT_Byte)pixel;
-          end    -= 3;
-        }
-      }
-    }
-
-    /* expand it vertically */
-    if ( vmul )
-    {
-      FT_Byte*  read  = bitmap->buffer + ( height - height_org ) * pitch;
-      FT_Byte*  write = bitmap->buffer;
-      FT_UInt   hh;
-
-
-      for ( hh = height_org; hh > 0; hh-- )
-      {
-        ft_memcpy( write, read, pitch );
-        write += pitch;
-
-        ft_memcpy( write, read, pitch );
-        write += pitch;
-
-        ft_memcpy( write, read, pitch );
-        write += pitch;
-        read  += pitch;
-      }
-    }
-
-#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 )
-    {
-      FT_FREE( bitmap->buffer );
-      slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP;
-    }
-
-    return error;
-  }
-
-
-  /* convert a slot's glyph image into a bitmap */
-  static FT_Error
-  ft_smooth_render( FT_Renderer       render,
-                    FT_GlyphSlot      slot,
-                    FT_Render_Mode    mode,
-                    const FT_Vector*  origin )
-  {
-    if ( mode == FT_RENDER_MODE_LIGHT )
-      mode = FT_RENDER_MODE_NORMAL;
-
-    return ft_smooth_render_generic( render, slot, mode, origin,
-                                     FT_RENDER_MODE_NORMAL );
-  }
-
-
-  /* convert a slot's glyph image into a horizontal LCD bitmap */
-  static FT_Error
-  ft_smooth_render_lcd( FT_Renderer       render,
-                        FT_GlyphSlot      slot,
-                        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;
-  }
-
-
-  /* convert a slot's glyph image into a vertical LCD bitmap */
-  static FT_Error
-  ft_smooth_render_lcd_v( FT_Renderer       render,
-                          FT_GlyphSlot      slot,
-                          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;
-  }
-
-
-  FT_DEFINE_RENDERER(
-    ft_smooth_renderer_class,
-
-      FT_MODULE_RENDERER,
-      sizeof ( FT_RendererRec ),
-
-      "smooth",
-      0x10000L,
-      0x20000L,
-
-      NULL,    /* module specific interface */
-
-      (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,     /* 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           /* raster_class    */
-  )
-
-
-  FT_DEFINE_RENDERER(
-    ft_smooth_lcd_renderer_class,
-
-      FT_MODULE_RENDERER,
-      sizeof ( FT_RendererRec ),
-
-      "smooth-lcd",
-      0x10000L,
-      0x20000L,
-
-      NULL,    /* module specific interface */
-
-      (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,  /* 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            /* raster_class    */
-  )
-
-
-  FT_DEFINE_RENDERER(
-    ft_smooth_lcdv_renderer_class,
-
-      FT_MODULE_RENDERER,
-      sizeof ( FT_RendererRec ),
-
-      "smooth-lcdv",
-      0x10000L,
-      0x20000L,
-
-      NULL,    /* module specific interface */
-
-      (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,  /* 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              /* raster_class    */
-  )
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftsmooth.h b/third_party/freetype/src/smooth/ftsmooth.h
deleted file mode 100644
index 929e260..0000000
--- a/third_party/freetype/src/smooth/ftsmooth.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsmooth.h                                                             */
-/*                                                                         */
-/*    Anti-aliasing renderer interface (specification).                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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 FTSMOOTH_H_
-#define FTSMOOTH_H_
-
-
-#include <ft2build.h>
-#include FT_RENDER_H
-
-
-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_END_HEADER
-
-#endif /* FTSMOOTH_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftspic.c b/third_party/freetype/src/smooth/ftspic.c
deleted file mode 100644
index fb89be3..0000000
--- a/third_party/freetype/src/smooth/ftspic.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftspic.c                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for smooth module.   */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "ftspic.h"
-#include "ftsmerrs.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from ftgrays.c */
-  void
-  FT_Init_Class_ft_grays_raster( FT_Raster_Funcs*  funcs );
-
-
-  void
-  ft_smooth_renderer_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->smooth )
-    {
-      SmoothPIC*  container = (SmoothPIC*)pic_container->smooth;
-
-
-      if ( --container->ref_count )
-        return;
-
-      FT_FREE( container );
-      pic_container->smooth = NULL;
-    }
-  }
-
-
-  FT_Error
-  ft_smooth_renderer_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    SmoothPIC*         container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* since this function also serve smooth_lcd and smooth_lcdv renderers,
-       it implements reference counting */
-    if ( pic_container->smooth )
-    {
-      ((SmoothPIC*)pic_container->smooth)->ref_count++;
-      return error;
-    }
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->smooth = container;
-
-    container->ref_count = 1;
-
-    /* initialize pointer table -                       */
-    /* this is how the module usually expects this data */
-    FT_Init_Class_ft_grays_raster( &container->ft_grays_raster );
-
-    return error;
-  }
-
-
-  /* re-route these init and free functions to the above functions */
-  FT_Error
-  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library )
-  {
-    return ft_smooth_renderer_class_pic_init( library );
-  }
-
-
-  void
-  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library )
-  {
-    ft_smooth_renderer_class_pic_free( library );
-  }
-
-
-  FT_Error
-  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library )
-  {
-    return ft_smooth_renderer_class_pic_init( library );
-  }
-
-
-  void
-  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library )
-  {
-    ft_smooth_renderer_class_pic_free( library );
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/ftspic.h b/third_party/freetype/src/smooth/ftspic.h
deleted file mode 100644
index 9ddd1c7..0000000
--- a/third_party/freetype/src/smooth/ftspic.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftspic.h                                                               */
-/*                                                                         */
-/*    The FreeType position independent code services for smooth module.   */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 FTSPIC_H_
-#define FTSPIC_H_
-
-
-#include FT_INTERNAL_PIC_H
-
-
-FT_BEGIN_HEADER
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_GRAYS_RASTER_GET  ft_grays_raster
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-  typedef struct  SmoothPIC_
-  {
-    int              ref_count;
-    FT_Raster_Funcs  ft_grays_raster;
-
-  } SmoothPIC;
-
-
-#define GET_PIC( lib ) \
-          ( (SmoothPIC*)( (lib)->pic_container.smooth ) )
-#define FT_GRAYS_RASTER_GET  ( GET_PIC( library )->ft_grays_raster )
-
-
-  /* see ftspic.c for the implementation */
-  void
-  ft_smooth_renderer_class_pic_free( FT_Library  library );
-
-  void
-  ft_smooth_lcd_renderer_class_pic_free( FT_Library  library );
-
-  void
-  ft_smooth_lcdv_renderer_class_pic_free( FT_Library  library );
-
-  FT_Error
-  ft_smooth_renderer_class_pic_init( FT_Library  library );
-
-  FT_Error
-  ft_smooth_lcd_renderer_class_pic_init( FT_Library  library );
-
-  FT_Error
-  ft_smooth_lcdv_renderer_class_pic_init( FT_Library  library );
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-FT_END_HEADER
-
-#endif /* FTSPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/smooth.c b/third_party/freetype/src/smooth/smooth.c
deleted file mode 100644
index 200f5dc..0000000
--- a/third_party/freetype/src/smooth/smooth.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  smooth.c                                                               */
-/*                                                                         */
-/*    FreeType anti-aliasing rasterer module component (body only).        */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "ftspic.c"
-#include "ftgrays.c"
-#include "ftsmooth.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/truetype.c b/third_party/freetype/src/truetype/truetype.c
deleted file mode 100644
index 4866103..0000000
--- a/third_party/freetype/src/truetype/truetype.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  truetype.c                                                             */
-/*                                                                         */
-/*    FreeType TrueType driver component (body only).                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#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
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttdriver.c b/third_party/freetype/src/truetype/ttdriver.c
deleted file mode 100644
index 19f7858..0000000
--- a/third_party/freetype/src/truetype/ttdriver.c
+++ /dev/null
@@ -1,657 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttdriver.c                                                             */
-/*                                                                         */
-/*    TrueType font driver implementation (body).                          */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H
-#include FT_SERVICE_FONT_FORMAT_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_SERVICE_TRUETYPE_ENGINE_H
-#include FT_SERVICE_TRUETYPE_GLYF_H
-#include FT_SERVICE_PROPERTIES_H
-#include FT_TRUETYPE_DRIVER_H
-
-#include "ttdriver.h"
-#include "ttgload.h"
-#include "ttpload.h"
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include "ttgxvar.h"
-#endif
-
-#include "tterrors.h"
-
-#include "ttpic.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_ttdriver
-
-
-  /*
-   *  PROPERTY SERVICE
-   *
-   */
-  static FT_Error
-  tt_property_set( FT_Module    module,         /* TT_Driver */
-                   const char*  property_name,
-                   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;
-
-
-#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
-      {
-        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;
-    }
-
-    FT_TRACE0(( "tt_property_set: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
-  static FT_Error
-  tt_property_get( FT_Module    module,         /* TT_Driver */
-                   const char*  property_name,
-                   const void*  value )
-  {
-    FT_Error   error  = FT_Err_Ok;
-    TT_Driver  driver = (TT_Driver)module;
-
-    FT_UInt  interpreter_version = driver->interpreter_version;
-
-
-    if ( !ft_strcmp( property_name, "interpreter-version" ) )
-    {
-      FT_UInt*  val = (FT_UInt*)value;
-
-
-      *val = interpreter_version;
-
-      return error;
-    }
-
-    FT_TRACE0(( "tt_property_get: missing property `%s'\n",
-                property_name ));
-    return FT_THROW( Missing_Property );
-  }
-
-
-  FT_DEFINE_SERVICE_PROPERTIESREC(
-    tt_service_properties,
-
-    (FT_Properties_SetFunc)tt_property_set,     /* set_property */
-    (FT_Properties_GetFunc)tt_property_get      /* get_property */
-  )
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                          F A C E S                              ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_get_kerning                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to return the kerning vector between two      */
-  /*    glyphs of the same face.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to the source face object.                 */
-  /*                                                                       */
-  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
-  /*                                                                       */
-  /*    right_glyph :: The index of the right glyph in the kern pair.      */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    kerning     :: The kerning vector.  This is in font units for      */
-  /*                   scalable formats, and in pixels for fixed-sizes     */
-  /*                   formats.                                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
-  /*    supported by this function.  Other layouts, or more sophisticated  */
-  /*    kernings, are out of scope of this method (the basic driver        */
-  /*    interface is meant to be simple).                                  */
-  /*                                                                       */
-  /*    They can be implemented by format-specific interfaces.             */
-  /*                                                                       */
-  static FT_Error
-  tt_get_kerning( FT_Face     ttface,          /* TT_Face */
-                  FT_UInt     left_glyph,
-                  FT_UInt     right_glyph,
-                  FT_Vector*  kerning )
-  {
-    TT_Face       face = (TT_Face)ttface;
-    SFNT_Service  sfnt = (SFNT_Service)face->sfnt;
-
-
-    kerning->x = 0;
-    kerning->y = 0;
-
-    if ( sfnt )
-      kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph );
-
-    return 0;
-  }
-
-
-  static FT_Error
-  tt_get_advances( FT_Face    ttface,
-                   FT_UInt    start,
-                   FT_UInt    count,
-                   FT_Int32   flags,
-                   FT_Fixed  *advances )
-  {
-    FT_UInt  nn;
-    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 ( !face->is_default_instance                               &&
-           !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
-        return FT_THROW( Unimplemented_Feature );
-#endif
-
-      for ( nn = 0; nn < count; nn++ )
-      {
-        FT_Short   tsb;
-        FT_UShort  ah;
-
-
-        /* since we don't need `tsb', we use zero for `yMax' parameter */
-        TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah );
-        advances[nn] = ah;
-      }
-    }
-    else
-    {
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-      /* no fast retrieval for blended MM fonts without HVAR table */
-      if ( !face->is_default_instance                               &&
-           !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
-        return FT_THROW( Unimplemented_Feature );
-#endif
-
-      for ( nn = 0; nn < count; nn++ )
-      {
-        FT_Short   lsb;
-        FT_UShort  aw;
-
-
-        TT_Get_HMetrics( face, start + nn, &lsb, &aw );
-        advances[nn] = aw;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                           S I Z E S                             ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  static FT_Error
-  tt_size_select( FT_Size   size,
-                  FT_ULong  strike_index )
-  {
-    TT_Face   ttface = (TT_Face)size->face;
-    TT_Size   ttsize = (TT_Size)size;
-    FT_Error  error  = FT_Err_Ok;
-
-
-    ttsize->strike_index = strike_index;
-
-    if ( FT_IS_SCALABLE( size->face ) )
-    {
-      /* use the scaled metrics, even when tt_size_reset fails */
-      FT_Select_Metrics( size->face, strike_index );
-
-      tt_size_reset( ttsize, 0 ); /* ignore return value */
-    }
-    else
-    {
-      SFNT_Service      sfnt    = (SFNT_Service)ttface->sfnt;
-      FT_Size_Metrics*  metrics = &size->metrics;
-
-
-      error = sfnt->load_strike_metrics( ttface, strike_index, metrics );
-      if ( error )
-        ttsize->strike_index = 0xFFFFFFFFUL;
-    }
-
-    return error;
-  }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-
-  static FT_Error
-  tt_size_request( FT_Size          size,
-                   FT_Size_Request  req )
-  {
-    TT_Size   ttsize = (TT_Size)size;
-    FT_Error  error  = FT_Err_Ok;
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-    if ( FT_HAS_FIXED_SIZES( size->face ) )
-    {
-      TT_Face       ttface = (TT_Face)size->face;
-      SFNT_Service  sfnt   = (SFNT_Service)ttface->sfnt;
-      FT_ULong      strike_index;
-
-
-      error = sfnt->set_sbit_strike( ttface, req, &strike_index );
-
-      if ( error )
-        ttsize->strike_index = 0xFFFFFFFFUL;
-      else
-        return tt_size_select( size, strike_index );
-    }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-    FT_Request_Metrics( size->face, req );
-
-    if ( FT_IS_SCALABLE( size->face ) )
-    {
-      error                = tt_size_reset( ttsize, 0 );
-      ttsize->root.metrics = ttsize->metrics;
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-      /* for the `MPS' bytecode instruction we need the point size */
-      {
-        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;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_glyph_load                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to load a glyph within a given glyph slot.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    slot        :: A handle to the target slot object where the glyph  */
-  /*                   will be loaded.                                     */
-  /*                                                                       */
-  /*    size        :: A handle to the source face size at which the glyph */
-  /*                   must be scaled, loaded, etc.                        */
-  /*                                                                       */
-  /*    glyph_index :: The index of the glyph in the font file.            */
-  /*                                                                       */
-  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
-  /*                   FT_LOAD_XXX constants can be used to control the    */
-  /*                   glyph loading process (e.g., whether the outline    */
-  /*                   should be scaled, whether to load bitmaps or not,   */
-  /*                   whether to hint the outline, etc).                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  tt_glyph_load( FT_GlyphSlot  ttslot,      /* TT_GlyphSlot */
-                 FT_Size       ttsize,      /* TT_Size      */
-                 FT_UInt       glyph_index,
-                 FT_Int32      load_flags )
-  {
-    TT_GlyphSlot  slot = (TT_GlyphSlot)ttslot;
-    TT_Size       size = (TT_Size)ttsize;
-    FT_Face       face = ttslot->face;
-    FT_Error      error;
-
-
-    if ( !slot )
-      return FT_THROW( Invalid_Slot_Handle );
-
-    if ( !size )
-      return FT_THROW( Invalid_Size_Handle );
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    if ( glyph_index >= (FT_UInt)face->num_glyphs &&
-         !face->internal->incremental_interface   )
-#else
-    if ( glyph_index >= (FT_UInt)face->num_glyphs )
-#endif
-      return FT_THROW( Invalid_Argument );
-
-    if ( load_flags & FT_LOAD_NO_HINTING )
-    {
-      /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT   */
-      /* are necessary to disable hinting for tricky fonts */
-
-      if ( FT_IS_TRICKY( face ) )
-        load_flags &= ~FT_LOAD_NO_HINTING;
-
-      if ( load_flags & FT_LOAD_NO_AUTOHINT )
-        load_flags |= FT_LOAD_NO_HINTING;
-    }
-
-    if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) )
-    {
-      load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE;
-
-      if ( !FT_IS_TRICKY( face ) )
-        load_flags |= FT_LOAD_NO_HINTING;
-    }
-
-    /* now load the glyph outline if necessary */
-    error = TT_Load_Glyph( size, slot, glyph_index, load_flags );
-
-    /* force drop-out mode to 2 - irrelevant now */
-    /* slot->outline.dropout_mode = 2; */
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                D R I V E R  I N T E R F A C E                   ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-  FT_DEFINE_SERVICE_MULTIMASTERSREC(
-    tt_service_gx_multi_masters,
-
-    (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_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)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) 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
-
-    FT_TRUETYPE_ENGINE_TYPE_PATENTED
-
-#else /* !TT_USE_BYTECODE_INTERPRETER */
-
-    FT_TRUETYPE_ENGINE_TYPE_NONE
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-  };
-
-
-  FT_DEFINE_SERVICE_TTGLYFREC(
-    tt_service_truetype_glyf,
-
-    (TT_Glyf_GetLocationFunc)tt_face_get_location      /* get_location */
-  )
-
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-  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_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,
-    FT_SERVICE_ID_PROPERTIES,      &TT_SERVICE_PROPERTIES_GET )
-#endif
-
-
-  FT_CALLBACK_DEF( FT_Module_Interface )
-  tt_get_interface( FT_Module    driver,    /* TT_Driver */
-                    const char*  tt_interface )
-  {
-    FT_Library           library;
-    FT_Module_Interface  result;
-    FT_Module            sfntd;
-    SFNT_Service         sfnt;
-
-
-    /* TT_SERVICES_GET dereferences `library' in PIC mode */
-#ifdef FT_CONFIG_OPTION_PIC
-    if ( !driver )
-      return NULL;
-    library = driver->library;
-    if ( !library )
-      return NULL;
-#endif
-
-    result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface );
-    if ( result )
-      return result;
-
-#ifndef FT_CONFIG_OPTION_PIC
-    if ( !driver )
-      return NULL;
-    library = driver->library;
-    if ( !library )
-      return NULL;
-#endif
-
-    /* only return the default interface from the SFNT module */
-    sfntd = FT_Get_Module( library, "sfnt" );
-    if ( sfntd )
-    {
-      sfnt = (SFNT_Service)( sfntd->clazz->module_interface );
-      if ( sfnt )
-        return sfnt->get_interface( driver, tt_interface );
-    }
-
-    return 0;
-  }
-
-
-  /* The FT_DriverInterface structure is defined in ftdriver.h. */
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-#define TT_HINTER_FLAG  FT_MODULE_DRIVER_HAS_HINTER
-#else
-#define TT_HINTER_FLAG  0
-#endif
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-#define TT_SIZE_SELECT  tt_size_select
-#else
-#define TT_SIZE_SELECT  0
-#endif
-
-  FT_DEFINE_DRIVER(
-    tt_driver_class,
-
-      FT_MODULE_FONT_DRIVER     |
-      FT_MODULE_DRIVER_SCALABLE |
-      TT_HINTER_FLAG,
-
-      sizeof ( TT_DriverRec ),
-
-      "truetype",      /* driver name                           */
-      0x10000L,        /* driver version == 1.0                 */
-      0x20000L,        /* driver requires FreeType 2.0 or above */
-
-      NULL,    /* module-specific 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,               /* 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,              /* FT_Slot_LoadFunc  load_glyph */
-
-    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,            /* FT_Size_RequestFunc  request_size */
-    TT_SIZE_SELECT              /* FT_Size_SelectFunc   select_size  */
-  )
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttdriver.h b/third_party/freetype/src/truetype/ttdriver.h
deleted file mode 100644
index 3bcba7f..0000000
--- a/third_party/freetype/src/truetype/ttdriver.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttdriver.h                                                             */
-/*                                                                         */
-/*    High-level TrueType driver interface (specification).                */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTDRIVER_H_
-#define TTDRIVER_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_DECLARE_DRIVER( tt_driver_class )
-
-
-FT_END_HEADER
-
-#endif /* TTDRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/tterrors.h b/third_party/freetype/src/truetype/tterrors.h
deleted file mode 100644
index a49f205..0000000
--- a/third_party/freetype/src/truetype/tterrors.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  tterrors.h                                                             */
-/*                                                                         */
-/*    TrueType error codes (specification only).                           */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the TrueType error enumeration            */
-  /* constants.                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef TTERRORS_H_
-#define TTERRORS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  TT_Err_
-#define FT_ERR_BASE    FT_Mod_Err_TrueType
-
-#include FT_ERRORS_H
-
-#endif /* TTERRORS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttgload.c b/third_party/freetype/src/truetype/ttgload.c
deleted file mode 100644
index 64dc05c..0000000
--- a/third_party/freetype/src/truetype/ttgload.c
+++ /dev/null
@@ -1,2751 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttgload.c                                                              */
-/*                                                                         */
-/*    TrueType Glyph Loader (body).                                        */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_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_LIST_H
-
-#include "ttgload.h"
-#include "ttpload.h"
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include "ttgxvar.h"
-#endif
-
-#include "tterrors.h"
-#include "ttsubpix.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_ttgload
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Composite glyph flags.                                                */
-  /*                                                                       */
-#define ARGS_ARE_WORDS             0x0001
-#define ARGS_ARE_XY_VALUES         0x0002
-#define ROUND_XY_TO_GRID           0x0004
-#define WE_HAVE_A_SCALE            0x0008
-/* reserved                        0x0010 */
-#define MORE_COMPONENTS            0x0020
-#define WE_HAVE_AN_XY_SCALE        0x0040
-#define WE_HAVE_A_2X2              0x0080
-#define WE_HAVE_INSTR              0x0100
-#define USE_MY_METRICS             0x0200
-#define OVERLAP_COMPOUND           0x0400
-#define SCALED_COMPONENT_OFFSET    0x0800
-#define UNSCALED_COMPONENT_OFFSET  0x1000
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Return the horizontal metrics in font units for a given glyph.        */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Get_HMetrics( TT_Face     face,
-                   FT_UInt     idx,
-                   FT_Short*   lsb,
-                   FT_UShort*  aw )
-  {
-    ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw );
-
-    FT_TRACE5(( "  advance width (font units): %d\n", *aw ));
-    FT_TRACE5(( "  left side bearing (font units): %d\n", *lsb ));
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Return the vertical metrics in font units for a given glyph.          */
-  /* See macro `TT_LOADER_SET_PP' below for explanations.                  */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Get_VMetrics( TT_Face     face,
-                   FT_UInt     idx,
-                   FT_Pos      yMax,
-                   FT_Short*   tsb,
-                   FT_UShort*  ah )
-  {
-    if ( face->vertical_info )
-      ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah );
-
-    else if ( face->os2.version != 0xFFFFU )
-    {
-      *tsb = (FT_Short)( face->os2.sTypoAscender - yMax );
-      *ah  = (FT_UShort)FT_ABS( face->os2.sTypoAscender -
-                                face->os2.sTypoDescender );
-    }
-
-    else
-    {
-      *tsb = (FT_Short)( face->horizontal.Ascender - yMax );
-      *ah  = (FT_UShort)FT_ABS( face->horizontal.Ascender -
-                                face->horizontal.Descender );
-    }
-
-    FT_TRACE5(( "  advance height (font units): %d\n", *ah ));
-    FT_TRACE5(( "  top side bearing (font units): %d\n", *tsb ));
-  }
-
-
-  static FT_Error
-  tt_get_metrics( TT_Loader  loader,
-                  FT_UInt    glyph_index )
-  {
-    TT_Face    face   = loader->face;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( face );
-#endif
-
-    FT_Error   error;
-    FT_Stream  stream = loader->stream;
-
-    FT_Short   left_bearing = 0, top_bearing = 0;
-    FT_UShort  advance_width = 0, advance_height = 0;
-
-    /* we must preserve the stream position          */
-    /* (which gets altered by the metrics functions) */
-    FT_ULong  pos = FT_STREAM_POS();
-
-
-    TT_Get_HMetrics( face, glyph_index,
-                     &left_bearing,
-                     &advance_width );
-    TT_Get_VMetrics( face, glyph_index,
-                     loader->bbox.yMax,
-                     &top_bearing,
-                     &advance_height );
-
-    if ( FT_STREAM_SEEK( pos ) )
-      return error;
-
-    loader->left_bearing = left_bearing;
-    loader->advance      = advance_width;
-    loader->top_bearing  = top_bearing;
-    loader->vadvance     = advance_height;
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
-         loader->exec                                             )
-    {
-      loader->exec->sph_tweak_flags = 0;
-
-      /* 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.                   */
-      sph_set_tweaks( loader, glyph_index );
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    if ( !loader->linear_def )
-    {
-      loader->linear_def = 1;
-      loader->linear     = advance_width;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-  static void
-  tt_get_metrics_incr_overrides( TT_Loader  loader,
-                                 FT_UInt    glyph_index )
-  {
-    TT_Face  face = loader->face;
-
-    FT_Short   left_bearing = 0, top_bearing = 0;
-    FT_UShort  advance_width = 0, advance_height = 0;
-
-
-    /* If this is an incrementally loaded font check whether there are */
-    /* overriding metrics for this glyph.                              */
-    if ( face->root.internal->incremental_interface                           &&
-         face->root.internal->incremental_interface->funcs->get_glyph_metrics )
-    {
-      FT_Incremental_MetricsRec  metrics;
-      FT_Error                   error;
-
-
-      metrics.bearing_x = loader->left_bearing;
-      metrics.bearing_y = 0;
-      metrics.advance   = loader->advance;
-      metrics.advance_v = 0;
-
-      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
-                face->root.internal->incremental_interface->object,
-                glyph_index, FALSE, &metrics );
-      if ( error )
-        goto Exit;
-
-      left_bearing  = (FT_Short)metrics.bearing_x;
-      advance_width = (FT_UShort)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;
-
-      error = face->root.internal->incremental_interface->funcs->get_glyph_metrics(
-                face->root.internal->incremental_interface->object,
-                glyph_index, TRUE, &metrics );
-      if ( error )
-        goto Exit;
-
-      top_bearing    = (FT_Short)metrics.bearing_y;
-      advance_height = (FT_UShort)metrics.advance;
-
-#endif /* 0 */
-
-      loader->left_bearing = left_bearing;
-      loader->advance      = advance_width;
-      loader->top_bearing  = top_bearing;
-      loader->vadvance     = advance_height;
-
-      if ( !loader->linear_def )
-      {
-        loader->linear_def = 1;
-        loader->linear     = advance_width;
-      }
-    }
-
-  Exit:
-    return;
-  }
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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.           */
-  /*                                                                       */
-  /*************************************************************************/
-
-  FT_CALLBACK_DEF( FT_Error )
-  TT_Access_Glyph_Frame( TT_Loader  loader,
-                         FT_UInt    glyph_index,
-                         FT_ULong   offset,
-                         FT_UInt    byte_count )
-  {
-    FT_Error   error;
-    FT_Stream  stream = loader->stream;
-
-    /* for non-debug mode */
-    FT_UNUSED( glyph_index );
-
-
-    FT_TRACE4(( "Glyph %ld\n", glyph_index ));
-
-    /* the following line sets the `error' variable through macros! */
-    if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) )
-      return error;
-
-    loader->cursor = stream->cursor;
-    loader->limit  = stream->limit;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  TT_Forget_Glyph_Frame( TT_Loader  loader )
-  {
-    FT_Stream  stream = loader->stream;
-
-
-    FT_FRAME_EXIT();
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  TT_Load_Glyph_Header( TT_Loader  loader )
-  {
-    FT_Byte*  p     = loader->cursor;
-    FT_Byte*  limit = loader->limit;
-
-
-    if ( p + 10 > limit )
-      return FT_THROW( Invalid_Outline );
-
-    loader->n_contours = FT_NEXT_SHORT( p );
-
-    loader->bbox.xMin = FT_NEXT_SHORT( p );
-    loader->bbox.yMin = FT_NEXT_SHORT( p );
-    loader->bbox.xMax = FT_NEXT_SHORT( p );
-    loader->bbox.yMax = FT_NEXT_SHORT( p );
-
-    FT_TRACE5(( "  # of contours: %d\n", loader->n_contours ));
-    FT_TRACE5(( "  xMin: %4d  xMax: %4d\n", loader->bbox.xMin,
-                                            loader->bbox.xMax ));
-    FT_TRACE5(( "  yMin: %4d  yMax: %4d\n", loader->bbox.yMin,
-                                            loader->bbox.yMax ));
-    loader->cursor = p;
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  TT_Load_Simple_Glyph( TT_Loader  load )
-  {
-    FT_Error        error;
-    FT_Byte*        p          = load->cursor;
-    FT_Byte*        limit      = load->limit;
-    FT_GlyphLoader  gloader    = load->gloader;
-    FT_Int          n_contours = load->n_contours;
-    FT_Outline*     outline;
-    FT_UShort       n_ins;
-    FT_Int          n_points;
-    FT_ULong        tmp;
-
-    FT_Byte         *flag, *flag_limit;
-    FT_Byte         c, count;
-    FT_Vector       *vec, *vec_limit;
-    FT_Pos          x;
-    FT_Short        *cont, *cont_limit, prev_cont;
-    FT_Int          xy_size = 0;
-
-
-    /* check that we can add the contours to the glyph */
-    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours );
-    if ( error )
-      goto Fail;
-
-    /* reading the contours' endpoints & number of points */
-    cont       = gloader->current.outline.contours;
-    cont_limit = cont + n_contours;
-
-    /* check space for contours array + instructions count */
-    if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit )
-      goto Invalid_Outline;
-
-    prev_cont = FT_NEXT_SHORT( p );
-
-    if ( n_contours > 0 )
-      cont[0] = prev_cont;
-
-    if ( prev_cont < 0 )
-      goto Invalid_Outline;
-
-    for ( cont++; cont < cont_limit; cont++ )
-    {
-      cont[0] = FT_NEXT_SHORT( p );
-      if ( cont[0] <= prev_cont )
-      {
-        /* unordered contours: this is invalid */
-        goto Invalid_Outline;
-      }
-      prev_cont = cont[0];
-    }
-
-    n_points = 0;
-    if ( n_contours > 0 )
-    {
-      n_points = cont[-1] + 1;
-      if ( n_points < 0 )
-        goto Invalid_Outline;
-    }
-
-    /* note that we will add four phantom points later */
-    error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 );
-    if ( error )
-      goto Fail;
-
-    /* reading the bytecode instructions */
-    load->glyph->control_len  = 0;
-    load->glyph->control_data = NULL;
-
-    if ( p + 2 > limit )
-      goto Invalid_Outline;
-
-    n_ins = FT_NEXT_USHORT( p );
-
-    FT_TRACE5(( "  Instructions size: %u\n", n_ins ));
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    if ( IS_HINTED( load->load_flags ) )
-    {
-      /* 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       */
-
-      tmp   = load->exec->glyphSize;
-      error = Update_Max( load->exec->memory,
-                          &tmp,
-                          sizeof ( FT_Byte ),
-                          (void*)&load->exec->glyphIns,
-                          n_ins );
-
-      load->exec->glyphSize = (FT_UShort)tmp;
-      if ( error )
-        return error;
-
-      load->glyph->control_len  = n_ins;
-      load->glyph->control_data = load->exec->glyphIns;
-
-      if ( n_ins )
-        FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins );
-    }
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-    p += n_ins;
-
-    outline = &gloader->current.outline;
-
-    /* reading the point tags */
-    flag       = (FT_Byte*)outline->tags;
-    flag_limit = flag + n_points;
-
-    FT_ASSERT( flag );
-
-    while ( flag < flag_limit )
-    {
-      if ( p + 1 > limit )
-        goto Invalid_Outline;
-
-      *flag++ = c = FT_NEXT_BYTE( p );
-      if ( c & 8 )
-      {
-        if ( p + 1 > limit )
-          goto Invalid_Outline;
-
-        count = FT_NEXT_BYTE( p );
-        if ( flag + (FT_Int)count > flag_limit )
-          goto Invalid_Outline;
-
-        for ( ; count > 0; count-- )
-          *flag++ = c;
-      }
-    }
-
-    /* reading the X coordinates */
-
-    vec       = outline->points;
-    vec_limit = vec + n_points;
-    flag      = (FT_Byte*)outline->tags;
-    x         = 0;
-
-    if ( p + xy_size > limit )
-      goto Invalid_Outline;
-
-    for ( ; vec < vec_limit; vec++, flag++ )
-    {
-      FT_Pos   y = 0;
-      FT_Byte  f = *flag;
-
-
-      if ( f & 2 )
-      {
-        if ( p + 1 > limit )
-          goto Invalid_Outline;
-
-        y = (FT_Pos)FT_NEXT_BYTE( p );
-        if ( ( f & 16 ) == 0 )
-          y = -y;
-      }
-      else if ( ( f & 16 ) == 0 )
-      {
-        if ( p + 2 > limit )
-          goto Invalid_Outline;
-
-        y = (FT_Pos)FT_NEXT_SHORT( p );
-      }
-
-      x     += y;
-      vec->x = x;
-      /* the cast is for stupid compilers */
-      *flag  = (FT_Byte)( f & ~( 2 | 16 ) );
-    }
-
-    /* reading the Y coordinates */
-
-    vec       = gloader->current.outline.points;
-    vec_limit = vec + n_points;
-    flag      = (FT_Byte*)outline->tags;
-    x         = 0;
-
-    for ( ; vec < vec_limit; vec++, flag++ )
-    {
-      FT_Pos   y = 0;
-      FT_Byte  f = *flag;
-
-
-      if ( f & 4 )
-      {
-        if ( p + 1 > limit )
-          goto Invalid_Outline;
-
-        y = (FT_Pos)FT_NEXT_BYTE( p );
-        if ( ( f & 32 ) == 0 )
-          y = -y;
-      }
-      else if ( ( f & 32 ) == 0 )
-      {
-        if ( p + 2 > limit )
-          goto Invalid_Outline;
-
-        y = (FT_Pos)FT_NEXT_SHORT( p );
-      }
-
-      x     += y;
-      vec->y = x;
-      /* the cast is for stupid compilers */
-      *flag  = (FT_Byte)( f & FT_CURVE_TAG_ON );
-    }
-
-    outline->n_points   = (FT_Short)n_points;
-    outline->n_contours = (FT_Short)n_contours;
-
-    load->cursor = p;
-
-  Fail:
-    return error;
-
-  Invalid_Outline:
-    error = FT_THROW( Invalid_Outline );
-    goto Fail;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  TT_Load_Composite_Glyph( TT_Loader  loader )
-  {
-    FT_Error        error;
-    FT_Byte*        p       = loader->cursor;
-    FT_Byte*        limit   = loader->limit;
-    FT_GlyphLoader  gloader = loader->gloader;
-    FT_SubGlyph     subglyph;
-    FT_UInt         num_subglyphs;
-
-
-    num_subglyphs = 0;
-
-    do
-    {
-      FT_Fixed  xx, xy, yy, yx;
-      FT_UInt   count;
-
-
-      /* check that we can load a new subglyph */
-      error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 );
-      if ( error )
-        goto Fail;
-
-      /* check space */
-      if ( p + 4 > limit )
-        goto Invalid_Composite;
-
-      subglyph = gloader->current.subglyphs + num_subglyphs;
-
-      subglyph->arg1 = subglyph->arg2 = 0;
-
-      subglyph->flags = FT_NEXT_USHORT( p );
-      subglyph->index = FT_NEXT_USHORT( p );
-
-      /* check space */
-      count = 2;
-      if ( subglyph->flags & ARGS_ARE_WORDS )
-        count += 2;
-      if ( subglyph->flags & WE_HAVE_A_SCALE )
-        count += 2;
-      else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE )
-        count += 4;
-      else if ( subglyph->flags & WE_HAVE_A_2X2 )
-        count += 8;
-
-      if ( p + count > limit )
-        goto Invalid_Composite;
-
-      /* read arguments */
-      if ( subglyph->flags & ARGS_ARE_XY_VALUES )
-      {
-        if ( subglyph->flags & ARGS_ARE_WORDS )
-        {
-          subglyph->arg1 = FT_NEXT_SHORT( p );
-          subglyph->arg2 = FT_NEXT_SHORT( p );
-        }
-        else
-        {
-          subglyph->arg1 = FT_NEXT_CHAR( p );
-          subglyph->arg2 = FT_NEXT_CHAR( p );
-        }
-      }
-      else
-      {
-        if ( subglyph->flags & ARGS_ARE_WORDS )
-        {
-          subglyph->arg1 = (FT_Int)FT_NEXT_USHORT( p );
-          subglyph->arg2 = (FT_Int)FT_NEXT_USHORT( p );
-        }
-        else
-        {
-          subglyph->arg1 = (FT_Int)FT_NEXT_BYTE( p );
-          subglyph->arg2 = (FT_Int)FT_NEXT_BYTE( p );
-        }
-      }
-
-      /* read transform */
-      xx = yy = 0x10000L;
-      xy = yx = 0;
-
-      if ( subglyph->flags & WE_HAVE_A_SCALE )
-      {
-        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 ) * 4;
-        yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4;
-      }
-      else if ( subglyph->flags & WE_HAVE_A_2X2 )
-      {
-        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;
-      subglyph->transform.xy = xy;
-      subglyph->transform.yx = yx;
-      subglyph->transform.yy = yy;
-
-      num_subglyphs++;
-
-    } while ( subglyph->flags & MORE_COMPONENTS );
-
-    gloader->current.num_subglyphs = num_subglyphs;
-    FT_TRACE5(( "  %d components\n", num_subglyphs ));
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    {
-      FT_Stream  stream = loader->stream;
-
-
-      /* we must undo the FT_FRAME_ENTER in order to point */
-      /* to the composite instructions, if we find some.   */
-      /* We will process them later.                       */
-      /*                                                   */
-      loader->ins_pos = (FT_ULong)( FT_STREAM_POS() +
-                                    p - limit );
-    }
-
-#endif
-
-    loader->cursor = p;
-
-  Fail:
-    return error;
-
-  Invalid_Composite:
-    error = FT_THROW( Invalid_Composite );
-    goto Fail;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  TT_Init_Glyph_Loading( TT_Face  face )
-  {
-    face->access_glyph_frame   = TT_Access_Glyph_Frame;
-    face->read_glyph_header    = TT_Load_Glyph_Header;
-    face->read_simple_glyph    = TT_Load_Simple_Glyph;
-    face->read_composite_glyph = TT_Load_Composite_Glyph;
-    face->forget_glyph_frame   = TT_Forget_Glyph_Frame;
-  }
-
-
-  static void
-  tt_prepare_zone( TT_GlyphZone  zone,
-                   FT_GlyphLoad  load,
-                   FT_UInt       start_point,
-                   FT_UInt       start_contour )
-  {
-    zone->n_points    = (FT_UShort)load->outline.n_points -
-                          (FT_UShort)start_point;
-    zone->n_contours  = load->outline.n_contours -
-                          (FT_Short)start_contour;
-    zone->org         = load->extra_points + start_point;
-    zone->cur         = load->outline.points + start_point;
-    zone->orus        = load->extra_points2 + start_point;
-    zone->tags        = (FT_Byte*)load->outline.tags + start_point;
-    zone->contours    = (FT_UShort*)load->outline.contours + start_contour;
-    zone->first_point = (FT_UShort)start_point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Hint_Glyph                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Hint the glyph using the zone prepared by the caller.  Note that   */
-  /*    the zone is supposed to include four phantom points.               */
-  /*                                                                       */
-  static FT_Error
-  TT_Hint_Glyph( TT_Loader  loader,
-                 FT_Bool    is_composite )
-  {
-#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
-
-    TT_GlyphZone  zone = &loader->zone;
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    FT_Long       n_ins;
-#else
-    FT_UNUSED( is_composite );
-#endif
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    if ( loader->glyph->control_len > 0xFFFFL )
-    {
-      FT_TRACE1(( "TT_Hint_Glyph: too long instructions" ));
-      FT_TRACE1(( " (0x%lx byte) is truncated\n",
-                 loader->glyph->control_len ));
-    }
-    n_ins = loader->glyph->control_len;
-
-    /* save original point position in org */
-    if ( n_ins > 0 )
-      FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points );
-
-    /* Reset graphics state. */
-    loader->exec->GS = loader->size->GS;
-
-    /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */
-    /*      completely refer to the (already) hinted subglyphs.     */
-    if ( is_composite )
-    {
-      loader->exec->metrics.x_scale = 1 << 16;
-      loader->exec->metrics.y_scale = 1 << 16;
-
-      FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points );
-    }
-    else
-    {
-      loader->exec->metrics.x_scale = loader->size->metrics.x_scale;
-      loader->exec->metrics.y_scale = loader->size->metrics.y_scale;
-    }
-#endif
-
-    /* round phantom points */
-    zone->cur[zone->n_points - 4].x =
-      FT_PIX_ROUND( zone->cur[zone->n_points - 4].x );
-    zone->cur[zone->n_points - 3].x =
-      FT_PIX_ROUND( zone->cur[zone->n_points - 3].x );
-    zone->cur[zone->n_points - 2].y =
-      FT_PIX_ROUND( zone->cur[zone->n_points - 2].y );
-    zone->cur[zone->n_points - 1].y =
-      FT_PIX_ROUND( zone->cur[zone->n_points - 1].y );
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    if ( n_ins > 0 )
-    {
-      FT_Error  error;
-
-      FT_GlyphLoader  gloader         = loader->gloader;
-      FT_Outline      current_outline = gloader->current.outline;
-
-
-      TT_Set_CodeRange( loader->exec, tt_coderange_glyph,
-                        loader->exec->glyphIns, n_ins );
-
-      loader->exec->is_composite = is_composite;
-      loader->exec->pts          = *zone;
-
-      error = TT_Run_Context( loader->exec );
-      if ( error && loader->exec->pedantic_hinting )
-        return error;
-
-      /* store drop-out mode in bits 5-7; set bit 2 also as a marker */
-      current_outline.tags[0] |=
-        ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE;
-    }
-
-#endif
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* Save possibly modified glyph phantom points unless in v40 backwards */
-    /* 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->backwards_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_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-    {
-      if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN )
-        FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 );
-
-      else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN )
-        FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 );
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Process_Simple_Glyph                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Once a simple glyph has been loaded, it needs to be processed.     */
-  /*    Usually, this means scaling and hinting through bytecode           */
-  /*    interpretation.                                                    */
-  /*                                                                       */
-  static FT_Error
-  TT_Process_Simple_Glyph( TT_Loader  loader )
-  {
-    FT_GlyphLoader  gloader = loader->gloader;
-    FT_Error        error   = FT_Err_Ok;
-    FT_Outline*     outline;
-    FT_Int          n_points;
-
-
-    outline  = &gloader->current.outline;
-    n_points = outline->n_points;
-
-    /* set phantom points */
-
-    outline->points[n_points    ] = loader->pp1;
-    outline->points[n_points + 1] = loader->pp2;
-    outline->points[n_points + 2] = loader->pp3;
-    outline->points[n_points + 3] = loader->pp4;
-
-    outline->tags[n_points    ] = 0;
-    outline->tags[n_points + 1] = 0;
-    outline->tags[n_points + 2] = 0;
-    outline->tags[n_points + 3] = 0;
-
-    n_points += 4;
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-    if ( loader->face->doblend && !loader->face->is_default_instance )
-    {
-      /* Deltas apply to the unscaled data. */
-      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;
-    }
-
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
-
-      FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
-                     loader->zone.n_points + 4 );
-    }
-
-    {
-#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_String*  style          = face->root.style_name;
-      FT_UInt     x_scale_factor = 1000;
-#endif
-
-      FT_Vector*  vec   = outline->points;
-      FT_Vector*  limit = outline->points + n_points;
-
-      FT_Fixed  x_scale = 0; /* pacify compiler */
-      FT_Fixed  y_scale = 0;
-
-      FT_Bool  do_scale = FALSE;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        /* scale, but only if enabled and only if TT hinting is being used */
-        if ( IS_HINTED( loader->load_flags ) )
-          x_scale_factor = sph_test_tweak_x_scaling( face,
-                                                     family,
-                                                     ppem,
-                                                     style,
-                                                     loader->glyph_index );
-        /* scale the glyph */
-        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ||
-             x_scale_factor != 1000                         )
-        {
-          x_scale = FT_MulDiv( loader->size->metrics.x_scale,
-                               (FT_Long)x_scale_factor, 1000 );
-          y_scale = loader->size->metrics.y_scale;
-
-          /* compensate for any scaling by de/emboldening; */
-          /* the amount was determined via experimentation */
-          if ( x_scale_factor != 1000 && ppem > 11 )
-            FT_Outline_EmboldenXY( outline,
-                                   FT_MulFix( 1280 * ppem,
-                                              1000 - x_scale_factor ),
-                                   0 );
-          do_scale = TRUE;
-        }
-      }
-      else
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      {
-        /* scale the glyph */
-        if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-        {
-          x_scale = loader->size->metrics.x_scale;
-          y_scale = loader->size->metrics.y_scale;
-
-          do_scale = TRUE;
-        }
-      }
-
-      if ( do_scale )
-      {
-        for ( ; vec < limit; vec++ )
-        {
-          vec->x = FT_MulFix( vec->x, x_scale );
-          vec->y = FT_MulFix( vec->y, y_scale );
-        }
-
-        loader->pp1 = outline->points[n_points - 4];
-        loader->pp2 = outline->points[n_points - 3];
-        loader->pp3 = outline->points[n_points - 2];
-        loader->pp4 = outline->points[n_points - 1];
-      }
-    }
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      loader->zone.n_points += 4;
-
-      error = TT_Hint_Glyph( loader, 0 );
-    }
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Process_Composite_Component                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Once a composite component has been loaded, it needs to be         */
-  /*    processed.  Usually, this means transforming and translating.      */
-  /*                                                                       */
-  static FT_Error
-  TT_Process_Composite_Component( TT_Loader    loader,
-                                  FT_SubGlyph  subglyph,
-                                  FT_UInt      start_point,
-                                  FT_UInt      num_base_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_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;
-      FT_Vector*  p2;
-
-
-      /* match l-th point of the newly loaded component to the k-th point */
-      /* of the previously loaded components.                             */
-
-      /* change to the point numbers used by our outline */
-      k += start_point;
-      l += num_base_points;
-      if ( k >= num_base_points ||
-           l >= num_points      )
-        return FT_THROW( Invalid_Composite );
-
-      p1 = gloader->base.outline.points + k;
-      p2 = gloader->base.outline.points + l;
-
-      x = p1->x - p2->x;
-      y = p1->y - p2->y;
-    }
-    else
-    {
-      x = subglyph->arg1;
-      y = subglyph->arg2;
-
-      if ( !x && !y )
-        return FT_Err_Ok;
-
-      /* Use a default value dependent on                                  */
-      /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED.  This is useful for old */
-      /* TT fonts which don't set the xxx_COMPONENT_OFFSET bit.            */
-
-      if ( have_scale &&
-#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED
-           !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) )
-#else
-            ( subglyph->flags & SCALED_COMPONENT_OFFSET ) )
-#endif
-      {
-
-#if 0
-
-        /*******************************************************************/
-        /*                                                                 */
-        /* This algorithm is what Apple documents.  But it doesn't work.   */
-        /*                                                                 */
-        int  a = subglyph->transform.xx > 0 ?  subglyph->transform.xx
-                                            : -subglyph->transform.xx;
-        int  b = subglyph->transform.yx > 0 ?  subglyph->transform.yx
-                                            : -subglyph->transform.yx;
-        int  c = subglyph->transform.xy > 0 ?  subglyph->transform.xy
-                                            : -subglyph->transform.xy;
-        int  d = subglyph->transform.yy > 0 ?  subglyph->transform.yy
-                                            : -subglyph->transform.yy;
-        int  m = a > b ? a : b;
-        int  n = c > d ? c : d;
-
-
-        if ( a - b <= 33 && a - b >= -33 )
-          m *= 2;
-        if ( c - d <= 33 && c - d >= -33 )
-          n *= 2;
-        x = FT_MulFix( x, m );
-        y = FT_MulFix( y, n );
-
-#else /* 1 */
-
-        /*******************************************************************/
-        /*                                                                 */
-        /* This algorithm is a guess and works much better than the above. */
-        /*                                                                 */
-        FT_Fixed  mac_xscale = FT_Hypot( subglyph->transform.xx,
-                                         subglyph->transform.xy );
-        FT_Fixed  mac_yscale = FT_Hypot( subglyph->transform.yy,
-                                         subglyph->transform.yx );
-
-
-        x = FT_MulFix( x, mac_xscale );
-        y = FT_MulFix( y, mac_yscale );
-
-#endif /* 1 */
-
-      }
-
-      if ( !( loader->load_flags & FT_LOAD_NO_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 );
-        y = FT_MulFix( y, y_scale );
-
-        if ( subglyph->flags & ROUND_XY_TO_GRID )
-        {
-          x = FT_PIX_ROUND( x );
-          y = FT_PIX_ROUND( y );
-        }
-      }
-    }
-
-    if ( x || y )
-      FT_Outline_Translate( &current, x, y );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Process_Composite_Glyph                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This is slightly different from TT_Process_Simple_Glyph, in that   */
-  /*    its sole purpose is to hint the glyph.  Thus this function is      */
-  /*    only available when bytecode interpreter is enabled.               */
-  /*                                                                       */
-  static FT_Error
-  TT_Process_Composite_Glyph( TT_Loader  loader,
-                              FT_UInt    start_point,
-                              FT_UInt    start_contour )
-  {
-    FT_Error     error;
-    FT_Outline*  outline;
-    FT_UInt      i;
-
-
-    outline = &loader->gloader->base.outline;
-
-    /* make room for phantom points */
-    error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader,
-                                         outline->n_points + 4,
-                                         0 );
-    if ( error )
-      return error;
-
-    outline->points[outline->n_points    ] = loader->pp1;
-    outline->points[outline->n_points + 1] = loader->pp2;
-    outline->points[outline->n_points + 2] = loader->pp3;
-    outline->points[outline->n_points + 3] = loader->pp4;
-
-    outline->tags[outline->n_points    ] = 0;
-    outline->tags[outline->n_points + 1] = 0;
-    outline->tags[outline->n_points + 2] = 0;
-    outline->tags[outline->n_points + 3] = 0;
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    {
-      FT_Stream  stream = loader->stream;
-      FT_UShort  n_ins, max_ins;
-      FT_ULong   tmp;
-
-
-      /* TT_Load_Composite_Glyph only gives us the offset of instructions */
-      /* so we read them here                                             */
-      if ( FT_STREAM_SEEK( loader->ins_pos ) ||
-           FT_READ_USHORT( n_ins )           )
-        return error;
-
-      FT_TRACE5(( "  Instructions size = %d\n", n_ins ));
-
-      /* check it */
-      max_ins = loader->face->max_profile.maxSizeOfInstructions;
-      if ( n_ins > max_ins )
-      {
-        /* don't trust `maxSizeOfInstructions'; */
-        /* only do a rough safety check         */
-        if ( (FT_Int)n_ins > loader->byte_len )
-        {
-          FT_TRACE1(( "TT_Process_Composite_Glyph:"
-                      " too many instructions (%d) for glyph with length %d\n",
-                      n_ins, loader->byte_len ));
-          return FT_THROW( Too_Many_Hints );
-        }
-
-        tmp   = loader->exec->glyphSize;
-        error = Update_Max( loader->exec->memory,
-                            &tmp,
-                            sizeof ( FT_Byte ),
-                            (void*)&loader->exec->glyphIns,
-                            n_ins );
-
-        loader->exec->glyphSize = (FT_UShort)tmp;
-        if ( error )
-          return error;
-      }
-      else if ( n_ins == 0 )
-        return FT_Err_Ok;
-
-      if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) )
-        return error;
-
-      loader->glyph->control_data = loader->exec->glyphIns;
-      loader->glyph->control_len  = n_ins;
-    }
-
-#endif
-
-    tt_prepare_zone( &loader->zone, &loader->gloader->base,
-                     start_point, start_contour );
-
-    /* Some points are likely touched during execution of  */
-    /* instructions on components.  So let's untouch them. */
-    for ( i = 0; i < loader->zone.n_points; i++ )
-      loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
-
-    loader->zone.n_points += 4;
-
-    return TT_Hint_Glyph( loader, 1 );
-  }
-
-
-  /*
-   * Calculate the phantom points
-   *
-   * Defining the right side bearing (rsb) as
-   *
-   *   rsb = aw - (lsb + xmax - xmin)
-   *
-   * (with `aw' the advance width, `lsb' the left side bearing, and `xmin'
-   * and `xmax' the glyph's minimum and maximum x value), the OpenType
-   * specification defines the initial position of horizontal phantom points
-   * as
-   *
-   *   pp1 = (round(xmin - lsb), 0)      ,
-   *   pp2 = (round(pp1 + aw), 0)        .
-   *
-   * Note that the rounding to the grid (in the device space) is not
-   * documented currently in the specification.
-   *
-   * However, the specification lacks the precise definition of vertical
-   * phantom points.  Greg Hitchcock provided the following explanation.
-   *
-   * - a `vmtx' table is present
-   *
-   *   For any glyph, the minimum and maximum y values (`ymin' and `ymax')
-   *   are given in the `glyf' table, the top side bearing (tsb) and advance
-   *   height (ah) are given in the `vmtx' table.  The bottom side bearing
-   *   (bsb) is then calculated as
-   *
-   *     bsb = ah - (tsb + ymax - ymin)       ,
-   *
-   *   and the initial position of vertical phantom points is
-   *
-   *     pp3 = (x, round(ymax + tsb))       ,
-   *     pp4 = (x, round(pp3 - ah))         .
-   *
-   *   See below for value `x'.
-   *
-   * - no `vmtx' table in the font
-   *
-   *   If there is an `OS/2' table, we set
-   *
-   *     DefaultAscender = sTypoAscender       ,
-   *     DefaultDescender = sTypoDescender     ,
-   *
-   *   otherwise we use data from the `hhea' table:
-   *
-   *     DefaultAscender = Ascender         ,
-   *     DefaultDescender = Descender       .
-   *
-   *   With these two variables we can now set
-   *
-   *     ah = DefaultAscender - sDefaultDescender    ,
-   *     tsb = DefaultAscender - yMax                ,
-   *
-   *   and proceed as if a `vmtx' table was present.
-   *
-   * Usually we have
-   *
-   *   x = aw / 2      ,                                                (1)
-   *
-   * but there is one compatibility case where it can be set to
-   *
-   *   x = -DefaultDescender -
-   *         ((DefaultAscender - DefaultDescender - aw) / 2)     .      (2)
-   *
-   * and another one with
-   *
-   *   x = 0     .                                                      (3)
-   *
-   * In Windows, the history of those values is quite complicated,
-   * depending on the hinting engine (that is, the graphics framework).
-   *
-   *   framework        from                 to       formula
-   *  ----------------------------------------------------------
-   *    GDI       Windows 98               current      (1)
-   *              (Windows 2000 for NT)
-   *    GDI+      Windows XP               Windows 7    (2)
-   *    GDI+      Windows 8                current      (3)
-   *    DWrite    Windows 7                current      (3)
-   *
-   * For simplicity, FreeType uses (1) for grayscale subpixel hinting and
-   * (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
-
-#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
-
-    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;
-  }
-
-
-  /* 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  index )
-  {
-    FT_ListNode  cur;
-
-
-    if ( !list )
-      return NULL;
-
-    for ( cur = list->head; cur; cur = cur->next )
-    {
-      if ( !index )
-        return cur;
-
-      index--;
-    }
-
-    return NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    load_truetype_glyph                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Loads a given truetype glyph.  Handles composites and uses a       */
-  /*    TT_Loader object.                                                  */
-  /*                                                                       */
-  static FT_Error
-  load_truetype_glyph( TT_Loader  loader,
-                       FT_UInt    glyph_index,
-                       FT_UInt    recurse_count,
-                       FT_Bool    header_only )
-  {
-    FT_Error        error        = FT_Err_Ok;
-    FT_Fixed        x_scale, y_scale;
-    FT_ULong        offset;
-    TT_Face         face         = loader->face;
-    FT_GlyphLoader  gloader      = loader->gloader;
-    FT_Bool         opened_frame = 0;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_StreamRec    inc_stream;
-    FT_Data         glyph_data;
-    FT_Bool         glyph_data_loaded = 0;
-#endif
-
-
-#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 )
-    {
-      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
-    /* check glyph index */
-    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
-    {
-      error = FT_THROW( Invalid_Glyph_Index );
-      goto Exit;
-    }
-#endif
-
-    loader->glyph_index = glyph_index;
-
-    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-    {
-      x_scale = loader->size->metrics.x_scale;
-      y_scale = loader->size->metrics.y_scale;
-    }
-    else
-    {
-      x_scale = 0x10000L;
-      y_scale = 0x10000L;
-    }
-
-    /* Set `offset' to the start of the glyph relative to the start of */
-    /* the `glyf' table, and `byte_len' to the length of the glyph in  */
-    /* bytes.                                                          */
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* If we are loading glyph data via the incremental interface, set */
-    /* the loader stream to a memory stream reading the data returned  */
-    /* by the interface.                                               */
-    if ( face->root.internal->incremental_interface )
-    {
-      error = face->root.internal->incremental_interface->funcs->get_glyph_data(
-                face->root.internal->incremental_interface->object,
-                glyph_index, &glyph_data );
-      if ( error )
-        goto Exit;
-
-      glyph_data_loaded = 1;
-      offset            = 0;
-      loader->byte_len  = glyph_data.length;
-
-      FT_ZERO( &inc_stream );
-      FT_Stream_OpenMemory( &inc_stream,
-                            glyph_data.pointer,
-                            (FT_ULong)glyph_data.length );
-
-      loader->stream = &inc_stream;
-    }
-    else
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-      offset = tt_face_get_location( face, glyph_index,
-                                     (FT_UInt*)&loader->byte_len );
-
-    if ( loader->byte_len > 0 )
-    {
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-      /* for the incremental interface, `glyf_offset' is always zero */
-      if ( !face->glyf_offset                          &&
-           !face->root.internal->incremental_interface )
-#else
-      if ( !face->glyf_offset )
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-      {
-        FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" ));
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
-      }
-
-      error = face->access_glyph_frame( loader, glyph_index,
-                                        face->glyf_offset + offset,
-                                        (FT_UInt)loader->byte_len );
-      if ( error )
-        goto Exit;
-
-      opened_frame = 1;
-
-      /* read glyph header first */
-      error = face->read_glyph_header( loader );
-      if ( error )
-        goto Exit;
-
-      /* the metrics must be computed after loading the glyph header */
-      /* since we need the glyph's `yMax' value in case the vertical */
-      /* metrics must be emulated                                    */
-      error = tt_get_metrics( loader, glyph_index );
-      if ( error )
-        goto Exit;
-
-      if ( header_only )
-        goto Exit;
-    }
-
-    if ( loader->byte_len == 0 || loader->n_contours == 0 )
-    {
-      loader->bbox.xMin = 0;
-      loader->bbox.xMax = 0;
-      loader->bbox.yMin = 0;
-      loader->bbox.yMax = 0;
-
-      error = tt_get_metrics( loader, glyph_index );
-      if ( error )
-        goto Exit;
-
-      if ( header_only )
-        goto Exit;
-
-      /* must initialize points before (possibly) overriding */
-      /* glyph metrics from the incremental interface        */
-      tt_loader_set_pp( loader );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-      tt_get_metrics_incr_overrides( loader, glyph_index );
-#endif
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-      if ( loader->face->doblend && !loader->face->is_default_instance )
-      {
-        /* a small outline structure with four elements for */
-        /* communication with `TT_Vary_Apply_Glyph_Deltas'  */
-        FT_Vector   points[4];
-        char        tags[4]     = { 1, 1, 1, 1 };
-        short       contours[4] = { 0, 1, 2, 3 };
-        FT_Outline  outline;
-
-
-        points[0].x = loader->pp1.x;
-        points[0].y = loader->pp1.y;
-        points[1].x = loader->pp2.x;
-        points[1].y = loader->pp2.y;
-
-        points[2].x = loader->pp3.x;
-        points[2].y = loader->pp3.y;
-        points[3].x = loader->pp4.x;
-        points[3].y = loader->pp4.y;
-
-        outline.n_points   = 4;
-        outline.n_contours = 4;
-        outline.points     = points;
-        outline.tags       = tags;
-        outline.contours   = contours;
-
-        /* this must be done before scaling */
-        error = TT_Vary_Apply_Glyph_Deltas( loader->face,
-                                            glyph_index,
-                                            &outline,
-                                            (FT_UInt)outline.n_points );
-        if ( error )
-          goto Exit;
-
-        loader->pp1.x = points[0].x;
-        loader->pp1.y = points[0].y;
-        loader->pp2.x = points[1].x;
-        loader->pp2.y = points[1].y;
-
-        loader->pp3.x = points[2].x;
-        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 */
-
-      /* scale phantom points, if necessary; */
-      /* they get rounded in `TT_Hint_Glyph' */
-      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-      {
-        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
-        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
-        /* pp1.y and pp2.y are always zero */
-
-        loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale );
-        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
-        loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale );
-        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
-      }
-
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-
-    /* must initialize phantom points before (possibly) overriding */
-    /* glyph metrics from the incremental interface                */
-    tt_loader_set_pp( loader );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    tt_get_metrics_incr_overrides( loader, glyph_index );
-#endif
-
-    /***********************************************************************/
-    /***********************************************************************/
-    /***********************************************************************/
-
-    /* if it is a simple glyph, load it */
-
-    if ( loader->n_contours > 0 )
-    {
-      error = face->read_simple_glyph( loader );
-      if ( error )
-        goto Exit;
-
-      /* all data have been read */
-      face->forget_glyph_frame( loader );
-      opened_frame = 0;
-
-      error = TT_Process_Simple_Glyph( loader );
-      if ( error )
-        goto Exit;
-
-      FT_GlyphLoader_Add( gloader );
-    }
-
-    /***********************************************************************/
-    /***********************************************************************/
-    /***********************************************************************/
-
-    /* otherwise, load a composite! */
-    else if ( loader->n_contours == -1 )
-    {
-      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;
-
-
-      /*
-       * 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*)ULONG_MAX;
-
-      /* check whether we already have a composite glyph with this index */
-      if ( FT_List_Find( &loader->composites,
-                         (void*)(unsigned long)glyph_index ) )
-      {
-        FT_TRACE1(( "TT_Load_Composite_Glyph:"
-                    " infinite recursion detected\n" ));
-        error = FT_THROW( Invalid_Composite );
-        goto Exit;
-      }
-
-      else if ( node )
-        node->data = (void*)(unsigned long)glyph_index;
-
-      else
-      {
-        if ( FT_NEW( node ) )
-          goto Exit;
-        node->data = (void*)(unsigned long)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;
-
-      /* for each subglyph, read composite header */
-      error = face->read_composite_glyph( loader );
-      if ( error )
-        goto Exit;
-
-      /* store the offset of instructions */
-      ins_pos = loader->ins_pos;
-
-      /* all data we need are read */
-      face->forget_glyph_frame( loader );
-      opened_frame = 0;
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-      if ( face->doblend && !face->is_default_instance )
-      {
-        short        i, limit;
-        FT_SubGlyph  subglyph;
-
-        FT_Outline  outline;
-        FT_Vector*  points   = NULL;
-        char*       tags     = NULL;
-        short*      contours = NULL;
-
-
-        limit = (short)gloader->current.num_subglyphs;
-
-        /* construct an outline structure for              */
-        /* communication with `TT_Vary_Apply_Glyph_Deltas' */
-        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;
-
-        for ( i = 0; i < limit; i++, subglyph++ )
-        {
-          /* applying deltas for anchor points doesn't make sense, */
-          /* but we don't have to specially check this since       */
-          /* unused delta values are zero anyways                  */
-          points[i].x = subglyph->arg1;
-          points[i].y = subglyph->arg2;
-          tags[i]     = 1;
-          contours[i] = i;
-        }
-
-        points[i].x = loader->pp1.x;
-        points[i].y = loader->pp1.y;
-        tags[i]     = 1;
-        contours[i] = i;
-
-        i++;
-        points[i].x = loader->pp2.x;
-        points[i].y = loader->pp2.y;
-        tags[i]     = 1;
-        contours[i] = i;
-
-        i++;
-        points[i].x = loader->pp3.x;
-        points[i].y = loader->pp3.y;
-        tags[i]     = 1;
-        contours[i] = i;
-
-        i++;
-        points[i].x = loader->pp4.x;
-        points[i].y = loader->pp4.y;
-        tags[i]     = 1;
-        contours[i] = i;
-
-        outline.points   = points;
-        outline.tags     = tags;
-        outline.contours = contours;
-
-        /* this call provides additional offsets */
-        /* for each component's translation      */
-        if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas(
-                             face,
-                             glyph_index,
-                             &outline,
-                             (FT_UInt)outline.n_points ) ) )
-          goto Exit1;
-
-        subglyph = gloader->current.subglyphs;
-
-        for ( i = 0; i < limit; i++, subglyph++ )
-        {
-          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;
-        loader->pp1.y = points[i + 0].y;
-        loader->pp2.x = points[i + 1].x;
-        loader->pp2.y = points[i + 1].y;
-
-        loader->pp3.x = points[i + 2].x;
-        loader->pp3.y = points[i + 2].y;
-        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 );
-        FT_FREE( outline.contours );
-
-        if ( error )
-          goto Exit;
-      }
-
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
-
-      /* scale phantom points, if necessary; */
-      /* they get rounded in `TT_Hint_Glyph' */
-      if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-      {
-        loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale );
-        loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale );
-        /* pp1.y and pp2.y are always zero */
-
-        loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale );
-        loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale );
-        loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale );
-        loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale );
-      }
-
-      /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */
-      /* `as is' in the glyph slot (the client application will be     */
-      /* responsible for interpreting these data)...                   */
-      if ( loader->load_flags & FT_LOAD_NO_RECURSE )
-      {
-        FT_GlyphLoader_Add( gloader );
-        loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE;
-
-        goto Exit;
-      }
-
-      /*********************************************************************/
-      /*********************************************************************/
-      /*********************************************************************/
-
-      {
-        FT_UInt      n, num_base_points;
-        FT_SubGlyph  subglyph       = NULL;
-
-        FT_UInt      num_points     = start_point;
-        FT_UInt      num_subglyphs  = gloader->current.num_subglyphs;
-        FT_UInt      num_base_subgs = gloader->base.num_subglyphs;
-
-        FT_Stream    old_stream     = loader->stream;
-        FT_Int       old_byte_len   = loader->byte_len;
-
-
-        FT_GlyphLoader_Add( gloader );
-
-        /* read each subglyph independently */
-        for ( n = 0; n < num_subglyphs; n++ )
-        {
-          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 */
-          /* reallocations.  We thus need to recompute the subglyph    */
-          /* pointer on each iteration.                                */
-          subglyph = gloader->base.subglyphs + num_base_subgs + n;
-
-          pp[0] = loader->pp1;
-          pp[1] = loader->pp2;
-          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,
-                                       (FT_UInt)subglyph->index,
-                                       recurse_count + 1,
-                                       FALSE );
-          if ( error )
-            goto Exit;
-
-          /* restore subglyph pointer */
-          subglyph = gloader->base.subglyphs + num_base_subgs + n;
-
-          /* restore phantom points if necessary */
-          if ( !( subglyph->flags & USE_MY_METRICS ) )
-          {
-            loader->pp1 = pp[0];
-            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;
-
-          if ( num_points == num_base_points )
-            continue;
-
-          /* gloader->base.outline consists of three parts:               */
-          /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */
-          /*                                                              */
-          /* (1): exists from the beginning                               */
-          /* (2): components that have been loaded so far                 */
-          /* (3): the newly loaded component                              */
-          error = TT_Process_Composite_Component( loader,
-                                                  subglyph,
-                                                  start_point,
-                                                  num_base_points );
-          if ( error )
-            goto Exit;
-        }
-
-        loader->stream   = old_stream;
-        loader->byte_len = old_byte_len;
-
-        /* process the glyph */
-        loader->ins_pos = ins_pos;
-        if ( IS_HINTED( loader->load_flags ) &&
-#ifdef TT_USE_BYTECODE_INTERPRETER
-             subglyph->flags & WE_HAVE_INSTR &&
-#endif
-             num_points > start_point )
-        {
-          error = TT_Process_Composite_Glyph( loader,
-                                              start_point,
-                                              start_contour );
-          if ( error )
-            goto Exit;
-        }
-      }
-    }
-    else
-    {
-      /* invalid composite count (negative but not -1) */
-      error = FT_THROW( Invalid_Outline );
-      goto Exit;
-    }
-
-    /***********************************************************************/
-    /***********************************************************************/
-    /***********************************************************************/
-
-  Exit:
-
-    if ( opened_frame )
-      face->forget_glyph_frame( loader );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    if ( glyph_data_loaded )
-      face->root.internal->incremental_interface->funcs->free_glyph_data(
-        face->root.internal->incremental_interface->object,
-        &glyph_data );
-
-#endif
-
-    return error;
-  }
-
-
-  static FT_Error
-  compute_glyph_metrics( TT_Loader  loader,
-                         FT_UInt    glyph_index )
-  {
-    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  = loader->size;
-
-
-    y_scale = 0x10000L;
-    if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 )
-      y_scale = size->root.metrics.y_scale;
-
-    if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE )
-      FT_Outline_Get_CBox( &glyph->outline, &bbox );
-    else
-      bbox = loader->bbox;
-
-    /* get the device-independent horizontal advance; it is scaled later */
-    /* by the base layer.                                                */
-    glyph->linearHoriAdvance = loader->linear;
-
-    glyph->metrics.horiBearingX = bbox.xMin;
-    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    */
-    /* unless FT_LOAD_COMPUTE_METRICS is set or backwards compatibility */
-    /* mode of the v40 interpreter is active.  See `ttinterp.h' for     */
-    /* details on backwards compatibility mode.                         */
-    if (
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-         !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 &&
-            ( loader->exec && loader->exec->backwards_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,
-                                           glyph_index );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        FT_Bool  ignore_x_mode;
-
-
-        ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) !=
-                                 FT_RENDER_MODE_MONO );
-
-        if ( widthp                                                   &&
-             ( ( ignore_x_mode && loader->exec->compatible_widths ) ||
-                !ignore_x_mode                                      ||
-                SPH_OPTION_BITMAP_WIDTHS                            ) )
-          glyph->metrics.horiAdvance = *widthp * 64;
-      }
-      else
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      {
-        if ( widthp )
-          glyph->metrics.horiAdvance = *widthp * 64;
-      }
-    }
-
-    /* set glyph dimensions */
-    glyph->metrics.width  = bbox.xMax - bbox.xMin;
-    glyph->metrics.height = bbox.yMax - bbox.yMin;
-
-    /* Now take care of vertical metrics.  In the case where there is */
-    /* no vertical information within the font (relatively common),   */
-    /* create some metrics manually                                   */
-    {
-      FT_Pos  top;      /* scaled vertical top side bearing  */
-      FT_Pos  advance;  /* scaled vertical advance height    */
-
-
-      /* Get the unscaled top bearing and advance height. */
-      if ( face->vertical_info                   &&
-           face->vertical.number_Of_VMetrics > 0 )
-      {
-        top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
-                                   y_scale );
-
-        if ( loader->pp3.y <= loader->pp4.y )
-          advance = 0;
-        else
-          advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
-                                          y_scale );
-      }
-      else
-      {
-        FT_Pos  height;
-
-
-        /* XXX Compute top side bearing and advance height in  */
-        /*     Get_VMetrics instead of here.                   */
-
-        /* NOTE: The OS/2 values are the only `portable' ones, */
-        /*       which is why we use them, if there is an OS/2 */
-        /*       table in the font.  Otherwise, we use the     */
-        /*       values defined in the horizontal header.      */
-
-        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin,
-                                      y_scale );
-        if ( face->os2.version != 0xFFFFU )
-          advance = (FT_Pos)( face->os2.sTypoAscender -
-                              face->os2.sTypoDescender );
-        else
-          advance = (FT_Pos)( face->horizontal.Ascender -
-                              face->horizontal.Descender );
-
-        top = ( advance - height ) / 2;
-      }
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-      {
-        FT_Incremental_InterfaceRec*  incr;
-        FT_Incremental_MetricsRec     metrics;
-        FT_Error                      error;
-
-
-        incr = face->root.internal->incremental_interface;
-
-        /* If this is an incrementally loaded font see if there are */
-        /* overriding metrics for this glyph.                       */
-        if ( incr && incr->funcs->get_glyph_metrics )
-        {
-          metrics.bearing_x = 0;
-          metrics.bearing_y = top;
-          metrics.advance   = advance;
-
-          error = incr->funcs->get_glyph_metrics( incr->object,
-                                                  glyph_index,
-                                                  TRUE,
-                                                  &metrics );
-          if ( error )
-            return error;
-
-          top     = metrics.bearing_y;
-          advance = metrics.advance;
-        }
-      }
-
-      /* GWW: Do vertical metrics get loaded incrementally too? */
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-      glyph->linearVertAdvance = advance;
-
-      /* scale the metrics */
-      if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
-      {
-        top     = FT_MulFix( top,     y_scale );
-        advance = FT_MulFix( advance, y_scale );
-      }
-
-      /* XXX: for now, we have no better algorithm for the lsb, but it */
-      /*      should work fine.                                        */
-      /*                                                               */
-      glyph->metrics.vertBearingX = glyph->metrics.horiBearingX -
-                                      glyph->metrics.horiAdvance / 2;
-      glyph->metrics.vertBearingY = top;
-      glyph->metrics.vertAdvance  = advance;
-    }
-
-    return 0;
-  }
-
-
-#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
-
-  static FT_Error
-  load_sbit_image( TT_Size       size,
-                   TT_GlyphSlot  glyph,
-                   FT_UInt       glyph_index,
-                   FT_Int32      load_flags )
-  {
-    TT_Face             face;
-    SFNT_Service        sfnt;
-    FT_Stream           stream;
-    FT_Error            error;
-    TT_SBit_MetricsRec  metrics;
-
-
-    face   = (TT_Face)glyph->face;
-    sfnt   = (SFNT_Service)face->sfnt;
-    stream = face->root.stream;
-
-    error = sfnt->load_sbit_image( face,
-                                   size->strike_index,
-                                   glyph_index,
-                                   (FT_UInt)load_flags,
-                                   stream,
-                                   &glyph->bitmap,
-                                   &metrics );
-    if ( !error )
-    {
-      glyph->outline.n_points   = 0;
-      glyph->outline.n_contours = 0;
-
-      glyph->metrics.width  = (FT_Pos)metrics.width  * 64;
-      glyph->metrics.height = (FT_Pos)metrics.height * 64;
-
-      glyph->metrics.horiBearingX = (FT_Pos)metrics.horiBearingX * 64;
-      glyph->metrics.horiBearingY = (FT_Pos)metrics.horiBearingY * 64;
-      glyph->metrics.horiAdvance  = (FT_Pos)metrics.horiAdvance  * 64;
-
-      glyph->metrics.vertBearingX = (FT_Pos)metrics.vertBearingX * 64;
-      glyph->metrics.vertBearingY = (FT_Pos)metrics.vertBearingY * 64;
-      glyph->metrics.vertAdvance  = (FT_Pos)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;
-      }
-      else
-      {
-        glyph->bitmap_left = metrics.horiBearingX;
-        glyph->bitmap_top  = metrics.horiBearingY;
-      }
-    }
-
-    return error;
-  }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-
-  static FT_Error
-  tt_loader_init( TT_Loader     loader,
-                  TT_Size       size,
-                  TT_GlyphSlot  glyph,
-                  FT_Int32      load_flags,
-                  FT_Bool       glyf_table_only )
-  {
-    FT_Error  error;
-
-    TT_Face    face;
-    FT_Stream  stream;
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    FT_Bool    pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
-#endif
-#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
-
-
-    face   = (TT_Face)glyph->face;
-    stream = face->root.stream;
-
-    FT_ZERO( loader );
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    /* load execution context */
-    if ( IS_HINTED( load_flags ) && !glyf_table_only )
-    {
-      TT_ExecContext  exec;
-      FT_Bool         grayscale = TRUE;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      FT_Bool         subpixel_hinting_lean;
-      FT_Bool         grayscale_cleartype;
-#endif
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      FT_Bool  subpixel_hinting = FALSE;
-
-#if 0
-      /* not used yet */
-      FT_Bool  compatible_widths;
-      FT_Bool  symmetrical_smoothing;
-      FT_Bool  bgr;
-      FT_Bool  vertical_lcd;
-      FT_Bool  subpixel_positioned;
-      FT_Bool  gray_cleartype;
-#endif
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      FT_Bool  reexecute = FALSE;
-
-
-      if ( size->bytecode_ready < 0 || size->cvt_ready < 0 )
-      {
-        error = tt_size_ready_bytecode( size, pedantic );
-        if ( error )
-          return error;
-      }
-      else if ( size->bytecode_ready )
-        return size->bytecode_ready;
-      else if ( size->cvt_ready )
-        return size->cvt_ready;
-
-      /* query new execution context */
-      exec = size->context;
-      if ( !exec )
-        return FT_THROW( Could_Not_Find_Context );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 )
-      {
-        subpixel_hinting_lean   = TRUE;
-        grayscale_cleartype     = !FT_BOOL( load_flags         &
-                                            FT_LOAD_TARGET_LCD     ||
-                                            load_flags           &
-                                            FT_LOAD_TARGET_LCD_V   );
-        exec->vertical_lcd_lean = FT_BOOL( 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 )
-      {
-        subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) !=
-                                      FT_RENDER_MODE_MONO               )  &&
-                                    SPH_OPTION_SET_SUBPIXEL                );
-
-        if ( subpixel_hinting )
-          grayscale = FALSE;
-        else if ( SPH_OPTION_SET_GRAYSCALE )
-        {
-          grayscale        = TRUE;
-          subpixel_hinting = FALSE;
-        }
-        else
-          grayscale = FALSE;
-
-        if ( FT_IS_TRICKY( glyph->face ) )
-          subpixel_hinting = FALSE;
-
-        exec->ignore_x_mode      = subpixel_hinting || grayscale;
-        exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-        if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
-          exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-
-#if 1
-        exec->compatible_widths     = SPH_OPTION_SET_COMPATIBLE_WIDTHS;
-        exec->symmetrical_smoothing = TRUE;
-        exec->bgr                   = FALSE;
-        exec->vertical_lcd          = FALSE;
-        exec->subpixel_positioned   = TRUE;
-        exec->gray_cleartype        = FALSE;
-#else /* 0 */
-        exec->compatible_widths =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_COMPATIBLE_WIDTHS );
-        exec->symmetrical_smoothing =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_SYMMETRICAL_SMOOTHING );
-        exec->bgr =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_BGR );
-        exec->vertical_lcd =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_VERTICAL_LCD );
-        exec->subpixel_positioned =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_SUBPIXEL_POSITIONED );
-        exec->gray_cleartype =
-          FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) !=
-                   TT_LOAD_GRAY_CLEARTYPE );
-#endif /* 0 */
-
-      }
-      else
-
-#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             );
-
-      error = TT_Load_Context( exec, face, size );
-      if ( error )
-        return error;
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 )
-      {
-        /* a change from mono to subpixel rendering (and vice versa) */
-        /* requires a re-execution of the CVT program                */
-        if ( subpixel_hinting != exec->subpixel_hinting )
-        {
-          FT_TRACE4(( "tt_loader_init: subpixel hinting change,"
-                      " re-executing `prep' table\n" ));
-
-          exec->subpixel_hinting = subpixel_hinting;
-          reexecute              = TRUE;
-        }
-
-        /* a change from mono to grayscale rendering (and vice versa) */
-        /* requires a re-execution of the CVT program                 */
-        if ( grayscale != exec->grayscale )
-        {
-          FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
-                      " re-executing `prep' table\n" ));
-
-          exec->grayscale = grayscale;
-          reexecute       = TRUE;
-        }
-      }
-      else
-
-#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 )
-        {
-          FT_TRACE4(( "tt_loader_init: grayscale hinting change,"
-                      " re-executing `prep' table\n" ));
-
-          exec->grayscale = grayscale;
-          reexecute       = TRUE;
-        }
-      }
-
-      if ( reexecute )
-      {
-        FT_UInt  i;
-
-
-        for ( i = 0; i < size->cvt_size; i++ )
-          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
-        error = tt_size_run_prep( size, pedantic );
-        if ( error )
-          return error;
-      }
-
-      /* check whether the cvt program has disabled hinting */
-      if ( exec->GS.instruct_control & 1 )
-        load_flags |= FT_LOAD_NO_HINTING;
-
-      /* load default graphics state -- if needed */
-      if ( exec->GS.instruct_control & 2 )
-        exec->GS = tt_default_graphics_state;
-
-#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 ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 &&
-           exec->GS.instruct_control & 4                            )
-        exec->ignore_x_mode = 0;
-#endif
-
-      exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC );
-      loader->exec = exec;
-      loader->instructions = exec->glyphIns;
-    }
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-    /* get face's glyph loader */
-    if ( !glyf_table_only )
-    {
-      FT_GlyphLoader  gloader = glyph->internal->loader;
-
-
-      FT_GlyphLoader_Rewind( gloader );
-      loader->gloader = gloader;
-    }
-
-    loader->load_flags = (FT_ULong)load_flags;
-
-    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>                                                            */
-  /*    TT_Load_Glyph                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A function used to load a single glyph within a given glyph slot,  */
-  /*    for a given size.                                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    glyph       :: A handle to a target slot object where the glyph    */
-  /*                   will be loaded.                                     */
-  /*                                                                       */
-  /*    size        :: A handle to the source face size at which the glyph */
-  /*                   must be scaled/loaded.                              */
-  /*                                                                       */
-  /*    glyph_index :: The index of the glyph in the font file.            */
-  /*                                                                       */
-  /*    load_flags  :: A flag indicating what to load for this glyph.  The */
-  /*                   FT_LOAD_XXX constants can be used to control the    */
-  /*                   glyph loading process (e.g., whether the outline    */
-  /*                   should be scaled, whether to load bitmaps or not,   */
-  /*                   whether to hint the outline, etc).                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Load_Glyph( TT_Size       size,
-                 TT_GlyphSlot  glyph,
-                 FT_UInt       glyph_index,
-                 FT_Int32      load_flags )
-  {
-    FT_Error      error;
-    TT_LoaderRec  loader;
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#define IS_DEFAULT_INSTANCE  ( ( (TT_Face)glyph->face )->is_default_instance )
-#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) */
-    if ( size->strike_index != 0xFFFFFFFFUL      &&
-         ( load_flags & FT_LOAD_NO_BITMAP ) == 0 &&
-         IS_DEFAULT_INSTANCE                     )
-    {
-      error = load_sbit_image( size, glyph, glyph_index, load_flags );
-      if ( !error )
-      {
-        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 );
-          if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance )
-            glyph->metrics.vertAdvance =
-              FT_MulFix( glyph->linearVertAdvance,
-                         size->root.metrics.y_scale );
-        }
-
-        return FT_Err_Ok;
-      }
-    }
-
-#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */
-
-    /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */
-    if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid )
-    {
-      error = FT_THROW( Invalid_Size_Handle );
-      goto Exit;
-    }
-
-    if ( load_flags & FT_LOAD_SBITS_ONLY )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    error = tt_loader_init( &loader, size, glyph, load_flags, FALSE );
-    if ( error )
-      goto Exit;
-
-    glyph->format        = FT_GLYPH_FORMAT_OUTLINE;
-    glyph->num_subglyphs = 0;
-    glyph->outline.flags = 0;
-
-    /* main loading loop */
-    error = load_truetype_glyph( &loader, glyph_index, 0, FALSE );
-    if ( !error )
-    {
-      if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE )
-      {
-        glyph->num_subglyphs = loader.gloader->base.num_subglyphs;
-        glyph->subglyphs     = loader.gloader->base.subglyphs;
-      }
-      else
-      {
-        glyph->outline        = loader.gloader->base.outline;
-        glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS;
-
-        /* Translate array so that (0,0) is the glyph's origin.  Note  */
-        /* that this behaviour is independent on the value of bit 1 of */
-        /* the `flags' field in the `head' table -- at least major     */
-        /* applications like Acroread indicate that.                   */
-        if ( loader.pp1.x )
-          FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 );
-      }
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-      if ( IS_HINTED( load_flags ) )
-      {
-        if ( loader.exec->GS.scan_control )
-        {
-          /* convert scan conversion mode to FT_OUTLINE_XXX flags */
-          switch ( loader.exec->GS.scan_type )
-          {
-          case 0: /* simple drop-outs including stubs */
-            glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS;
-            break;
-          case 1: /* simple drop-outs excluding stubs */
-            /* nothing; it's the default rendering mode */
-            break;
-          case 4: /* smart drop-outs including stubs */
-            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS |
-                                    FT_OUTLINE_INCLUDE_STUBS;
-            break;
-          case 5: /* smart drop-outs excluding stubs  */
-            glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS;
-            break;
-
-          default: /* no drop-out control */
-            glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
-            break;
-          }
-        }
-        else
-          glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS;
-      }
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-      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     )
-      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;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttgload.h b/third_party/freetype/src/truetype/ttgload.h
deleted file mode 100644
index 1dd6c84..0000000
--- a/third_party/freetype/src/truetype/ttgload.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttgload.h                                                              */
-/*                                                                         */
-/*    TrueType Glyph Loader (specification).                               */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTGLOAD_H_
-#define TTGLOAD_H_
-
-
-#include <ft2build.h>
-#include "ttobjs.h"
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-#include "ttinterp.h"
-#endif
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( void )
-  TT_Init_Glyph_Loading( TT_Face  face );
-
-  FT_LOCAL( void )
-  TT_Get_HMetrics( TT_Face     face,
-                   FT_UInt     idx,
-                   FT_Short*   lsb,
-                   FT_UShort*  aw );
-
-  FT_LOCAL( void )
-  TT_Get_VMetrics( TT_Face     face,
-                   FT_UInt     idx,
-                   FT_Pos      yMax,
-                   FT_Short*   tsb,
-                   FT_UShort*  ah );
-
-  FT_LOCAL( FT_Error )
-  TT_Load_Glyph( TT_Size       size,
-                 TT_GlyphSlot  glyph,
-                 FT_UInt       glyph_index,
-                 FT_Int32      load_flags );
-
-
-FT_END_HEADER
-
-#endif /* TTGLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttinterp.c b/third_party/freetype/src/truetype/ttinterp.c
deleted file mode 100644
index 6ea1a80..0000000
--- a/third_party/freetype/src/truetype/ttinterp.c
+++ /dev/null
@@ -1,8416 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttinterp.c                                                             */
-/*                                                                         */
-/*    TrueType bytecode interpreter (body).                                */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */
-/* issues; many thanks!                                                */
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_CALC_H
-#include FT_TRIGONOMETRY_H
-#include FT_SYSTEM_H
-#include FT_TRUETYPE_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
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_ttinterp
-
-
-#define NO_SUBPIXEL_HINTING                                                  \
-          ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \
-            TT_INTERPRETER_VERSION_35 )
-
-#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 DUALPROJ( v1, v2 )                                                \
-          exc->func_dualproj( exc, (v1)->x - (v2)->x, (v1)->y - (v2)->y )
-
-#define FAST_PROJECT( v )                          \
-          exc->func_project( exc, (v)->x, (v)->y )
-
-#define FAST_DUALPROJ( v )                          \
-          exc->func_dualproj( exc, (v)->x, (v)->y )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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) )
-
-
-#undef  SUCCESS
-#define SUCCESS  0
-
-#undef  FAILURE
-#define FAILURE  1
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                        CODERANGE FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Goto_CodeRange                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Switches to a new code range (updates the code related elements in */
-  /*    `exec', and `IP').                                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    range :: The new execution code range.                             */
-  /*                                                                       */
-  /*    IP    :: The new IP in the new code range.                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    exec  :: The target execution context.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Goto_CodeRange( TT_ExecContext  exec,
-                     FT_Int          range,
-                     FT_Long         IP )
-  {
-    TT_CodeRange*  coderange;
-
-
-    FT_ASSERT( range >= 1 && range <= 3 );
-
-    coderange = &exec->codeRangeTable[range - 1];
-
-    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    */
-    /*       range, we test for IP <= Size instead of IP < Size.     */
-    /*                                                               */
-    FT_ASSERT( IP <= coderange->size );
-
-    exec->code     = coderange->base;
-    exec->codeSize = coderange->size;
-    exec->IP       = IP;
-    exec->curRange = range;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Set_CodeRange                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Sets a code range.                                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    range  :: The code range index.                                    */
-  /*                                                                       */
-  /*    base   :: The new code base.                                       */
-  /*                                                                       */
-  /*    length :: The range size in bytes.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    exec   :: The target execution context.                            */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Set_CodeRange( TT_ExecContext  exec,
-                    FT_Int          range,
-                    void*           base,
-                    FT_Long         length )
-  {
-    FT_ASSERT( range >= 1 && range <= 3 );
-
-    exec->codeRangeTable[range - 1].base = (FT_Byte*)base;
-    exec->codeRangeTable[range - 1].size = length;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Clear_CodeRange                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Clears a code range.                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    range :: The code range index.                                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    exec  :: The target execution context.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Clear_CodeRange( TT_ExecContext  exec,
-                      FT_Int          range )
-  {
-    FT_ASSERT( range >= 1 && range <= 3 );
-
-    exec->codeRangeTable[range - 1].base = NULL;
-    exec->codeRangeTable[range - 1].size = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                   EXECUTION CONTEXT ROUTINES                          */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Done_Context                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroys a given context.                                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    exec   :: A handle to the target execution context.                */
-  /*                                                                       */
-  /*    memory :: A handle to the parent memory object.                    */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only the glyph loader and debugger should call this function.      */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Done_Context( TT_ExecContext  exec )
-  {
-    FT_Memory  memory = exec->memory;
-
-
-    /* points zone */
-    exec->maxPoints   = 0;
-    exec->maxContours = 0;
-
-    /* free stack */
-    FT_FREE( exec->stack );
-    exec->stackSize = 0;
-
-    /* free call stack */
-    FT_FREE( exec->callStack );
-    exec->callSize = 0;
-    exec->callTop  = 0;
-
-    /* free glyph code range */
-    FT_FREE( exec->glyphIns );
-    exec->glyphSize = 0;
-
-    exec->size = NULL;
-    exec->face = NULL;
-
-    FT_FREE( exec );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Init_Context                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a context object.                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory :: A handle to the parent memory object.                    */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    exec   :: A handle to the target execution context.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  Init_Context( TT_ExecContext  exec,
-                FT_Memory       memory )
-  {
-    FT_Error  error;
-
-
-    FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec ));
-
-    exec->memory   = memory;
-    exec->callSize = 32;
-
-    if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) )
-      goto Fail_Memory;
-
-    /* all values in the context are set to 0 already, but this is */
-    /* here as a remainder                                         */
-    exec->maxPoints   = 0;
-    exec->maxContours = 0;
-
-    exec->stackSize = 0;
-    exec->glyphSize = 0;
-
-    exec->stack    = NULL;
-    exec->glyphIns = NULL;
-
-    exec->face = NULL;
-    exec->size = NULL;
-
-    return FT_Err_Ok;
-
-  Fail_Memory:
-    FT_ERROR(( "Init_Context: not enough memory for %p\n", exec ));
-    TT_Done_Context( exec );
-
-    return error;
- }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Update_Max                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Checks the size of a buffer and reallocates it if necessary.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory     :: A handle to the parent memory object.                */
-  /*                                                                       */
-  /*    multiplier :: The size in bytes of each element in the buffer.     */
-  /*                                                                       */
-  /*    new_max    :: The new capacity (size) of the buffer.               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    size       :: The address of the buffer's current size expressed   */
-  /*                  in elements.                                         */
-  /*                                                                       */
-  /*    buff       :: The address of the buffer base pointer.              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  Update_Max( FT_Memory  memory,
-              FT_ULong*  size,
-              FT_ULong   multiplier,
-              void*      _pbuff,
-              FT_ULong   new_max )
-  {
-    FT_Error  error;
-    void**    pbuff = (void**)_pbuff;
-
-
-    if ( *size < new_max )
-    {
-      if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) )
-        return error;
-      *size = new_max;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Load_Context                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Prepare an execution context for glyph hinting.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source face object.                        */
-  /*                                                                       */
-  /*    size :: A handle to the source size object.                        */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    exec :: A handle to the target execution context.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only the glyph loader and debugger should call this function.      */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Load_Context( TT_ExecContext  exec,
-                   TT_Face         face,
-                   TT_Size         size )
-  {
-    FT_Int          i;
-    FT_ULong        tmp;
-    TT_MaxProfile*  maxp;
-    FT_Error        error;
-
-
-    exec->face = face;
-    maxp       = &face->max_profile;
-    exec->size = size;
-
-    if ( size )
-    {
-      exec->numFDefs   = size->num_function_defs;
-      exec->maxFDefs   = size->max_function_defs;
-      exec->numIDefs   = size->num_instruction_defs;
-      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->maxFunc    = size->max_func;
-      exec->maxIns     = size->max_ins;
-
-      for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
-        exec->codeRangeTable[i] = size->codeRangeTable[i];
-
-      /* set graphics state */
-      exec->GS = size->GS;
-
-      exec->cvtSize = size->cvt_size;
-      exec->cvt     = size->cvt;
-
-      exec->storeSize = size->storage_size;
-      exec->storage   = size->storage;
-
-      exec->twilight  = size->twilight;
-
-      /* 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_ZERO( &exec->zp0 );
-      exec->zp1 = exec->zp0;
-      exec->zp2 = exec->zp0;
-    }
-
-    /* XXX: We reserve a little more elements on the stack to deal safely */
-    /*      with broken fonts like arialbs, courbs, timesbs, etc.         */
-    tmp = (FT_ULong)exec->stackSize;
-    error = Update_Max( exec->memory,
-                        &tmp,
-                        sizeof ( FT_F26Dot6 ),
-                        (void*)&exec->stack,
-                        maxp->maxStackElements + 32 );
-    exec->stackSize = (FT_Long)tmp;
-    if ( error )
-      return error;
-
-    tmp = exec->glyphSize;
-    error = Update_Max( exec->memory,
-                        &tmp,
-                        sizeof ( FT_Byte ),
-                        (void*)&exec->glyphIns,
-                        maxp->maxSizeOfInstructions );
-    exec->glyphSize = (FT_UShort)tmp;
-    if ( error )
-      return error;
-
-    exec->pts.n_points   = 0;
-    exec->pts.n_contours = 0;
-
-    exec->zp1 = exec->pts;
-    exec->zp2 = exec->pts;
-    exec->zp0 = exec->pts;
-
-    exec->instruction_trap = FALSE;
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Save_Context                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Saves the code ranges in a `size' object.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    exec :: A handle to the source execution context.                  */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    size :: A handle to the target size object.                        */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only the glyph loader and debugger should call this function.      */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  TT_Save_Context( TT_ExecContext  exec,
-                   TT_Size         size )
-  {
-    FT_Int  i;
-
-
-    /* XXX: Will probably disappear soon with all the code range */
-    /*      management, which is now rather obsolete.            */
-    /*                                                           */
-    size->num_function_defs    = exec->numFDefs;
-    size->num_instruction_defs = exec->numIDefs;
-
-    size->max_func = exec->maxFunc;
-    size->max_ins  = exec->maxIns;
-
-    for ( i = 0; i < TT_MAX_CODE_RANGES; i++ )
-      size->codeRangeTable[i] = exec->codeRangeTable[i];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Run_Context                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Executes one or more instructions in the execution context.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    debug :: A Boolean flag.  If set, the function sets some internal  */
-  /*             variables and returns immediately, otherwise TT_RunIns()  */
-  /*             is called.                                                */
-  /*                                                                       */
-  /*             This is commented out currently.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    exec  :: A handle to the target execution context.                 */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    TrueType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Run_Context( TT_ExecContext  exec )
-  {
-    TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 );
-
-    exec->zp0 = exec->pts;
-    exec->zp1 = exec->pts;
-    exec->zp2 = exec->pts;
-
-    exec->GS.gep0 = 1;
-    exec->GS.gep1 = 1;
-    exec->GS.gep2 = 1;
-
-    exec->GS.projVector.x = 0x4000;
-    exec->GS.projVector.y = 0x0000;
-
-    exec->GS.freeVector = exec->GS.projVector;
-    exec->GS.dualVector = exec->GS.projVector;
-
-    exec->GS.round_state = 1;
-    exec->GS.loop        = 1;
-
-    /* some glyphs leave something on the stack. so we clean it */
-    /* before a new execution.                                  */
-    exec->top     = 0;
-    exec->callTop = 0;
-
-    return exec->face->interpreter( exec );
-  }
-
-
-  /* The default value for `scan_control' is documented as FALSE in the */
-  /* TrueType specification.  This is confusing since it implies a      */
-  /* Boolean value.  However, this is not the case, thus both the       */
-  /* default values of our `scan_type' and `scan_control' fields (which */
-  /* the documentation's `scan_control' variable is split into) are     */
-  /* zero.                                                              */
-
-  const TT_GraphicsState  tt_default_graphics_state =
-  {
-    0, 0, 0,
-    { 0x4000, 0 },
-    { 0x4000, 0 },
-    { 0x4000, 0 },
-
-    1, 64, 1,
-    TRUE, 68, 0, 0, 9, 3,
-    0, FALSE, 0, 1, 1, 1
-  };
-
-
-  /* documentation is in ttinterp.h */
-
-  FT_EXPORT_DEF( TT_ExecContext )
-  TT_New_Context( TT_Driver  driver )
-  {
-    FT_Memory  memory;
-    FT_Error   error;
-
-    TT_ExecContext  exec = NULL;
-
-
-    if ( !driver )
-      goto Fail;
-
-    memory = driver->root.root.memory;
-
-    /* allocate object */
-    if ( FT_NEW( exec ) )
-      goto Fail;
-
-    /* initialize it; in case of error this deallocates `exec' too */
-    error = Init_Context( exec, memory );
-    if ( error )
-      goto Fail;
-
-    return exec;
-
-  Fail:
-    return NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Before an opcode is executed, the interpreter verifies that there are */
-  /* enough arguments on the stack, with the help of the `Pop_Push_Count'  */
-  /* table.                                                                */
-  /*                                                                       */
-  /* For each opcode, the first column gives the number of arguments that  */
-  /* are popped from the stack; the second one gives the number of those   */
-  /* that are pushed in result.                                            */
-  /*                                                                       */
-  /* Opcodes which have a varying number of parameters in the data stream  */
-  /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */
-  /* the `opcode_length' table, and the value in `Pop_Push_Count' is set   */
-  /* to zero.                                                              */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#undef  PACK
-#define PACK( x, y )  ( ( x << 4 ) | y )
-
-
-  static
-  const FT_Byte  Pop_Push_Count[256] =
-  {
-    /* opcodes are gathered in groups of 16 */
-    /* please keep the spaces as they are   */
-
-    /*  SVTCA  y  */  PACK( 0, 0 ),
-    /*  SVTCA  x  */  PACK( 0, 0 ),
-    /*  SPvTCA y  */  PACK( 0, 0 ),
-    /*  SPvTCA x  */  PACK( 0, 0 ),
-    /*  SFvTCA y  */  PACK( 0, 0 ),
-    /*  SFvTCA x  */  PACK( 0, 0 ),
-    /*  SPvTL //  */  PACK( 2, 0 ),
-    /*  SPvTL +   */  PACK( 2, 0 ),
-    /*  SFvTL //  */  PACK( 2, 0 ),
-    /*  SFvTL +   */  PACK( 2, 0 ),
-    /*  SPvFS     */  PACK( 2, 0 ),
-    /*  SFvFS     */  PACK( 2, 0 ),
-    /*  GPv       */  PACK( 0, 2 ),
-    /*  GFv       */  PACK( 0, 2 ),
-    /*  SFvTPv    */  PACK( 0, 0 ),
-    /*  ISECT     */  PACK( 5, 0 ),
-
-    /*  SRP0      */  PACK( 1, 0 ),
-    /*  SRP1      */  PACK( 1, 0 ),
-    /*  SRP2      */  PACK( 1, 0 ),
-    /*  SZP0      */  PACK( 1, 0 ),
-    /*  SZP1      */  PACK( 1, 0 ),
-    /*  SZP2      */  PACK( 1, 0 ),
-    /*  SZPS      */  PACK( 1, 0 ),
-    /*  SLOOP     */  PACK( 1, 0 ),
-    /*  RTG       */  PACK( 0, 0 ),
-    /*  RTHG      */  PACK( 0, 0 ),
-    /*  SMD       */  PACK( 1, 0 ),
-    /*  ELSE      */  PACK( 0, 0 ),
-    /*  JMPR      */  PACK( 1, 0 ),
-    /*  SCvTCi    */  PACK( 1, 0 ),
-    /*  SSwCi     */  PACK( 1, 0 ),
-    /*  SSW       */  PACK( 1, 0 ),
-
-    /*  DUP       */  PACK( 1, 2 ),
-    /*  POP       */  PACK( 1, 0 ),
-    /*  CLEAR     */  PACK( 0, 0 ),
-    /*  SWAP      */  PACK( 2, 2 ),
-    /*  DEPTH     */  PACK( 0, 1 ),
-    /*  CINDEX    */  PACK( 1, 1 ),
-    /*  MINDEX    */  PACK( 1, 0 ),
-    /*  AlignPTS  */  PACK( 2, 0 ),
-    /*  INS_$28   */  PACK( 0, 0 ),
-    /*  UTP       */  PACK( 1, 0 ),
-    /*  LOOPCALL  */  PACK( 2, 0 ),
-    /*  CALL      */  PACK( 1, 0 ),
-    /*  FDEF      */  PACK( 1, 0 ),
-    /*  ENDF      */  PACK( 0, 0 ),
-    /*  MDAP[0]   */  PACK( 1, 0 ),
-    /*  MDAP[1]   */  PACK( 1, 0 ),
-
-    /*  IUP[0]    */  PACK( 0, 0 ),
-    /*  IUP[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 ), /* loops */
-    /*  IP        */  PACK( 0, 0 ), /* loops */
-    /*  MSIRP[0]  */  PACK( 2, 0 ),
-    /*  MSIRP[1]  */  PACK( 2, 0 ),
-    /*  AlignRP   */  PACK( 0, 0 ), /* loops */
-    /*  RTDG      */  PACK( 0, 0 ),
-    /*  MIAP[0]   */  PACK( 2, 0 ),
-    /*  MIAP[1]   */  PACK( 2, 0 ),
-
-    /*  NPushB    */  PACK( 0, 0 ),
-    /*  NPushW    */  PACK( 0, 0 ),
-    /*  WS        */  PACK( 2, 0 ),
-    /*  RS        */  PACK( 1, 1 ),
-    /*  WCvtP     */  PACK( 2, 0 ),
-    /*  RCvt      */  PACK( 1, 1 ),
-    /*  GC[0]     */  PACK( 1, 1 ),
-    /*  GC[1]     */  PACK( 1, 1 ),
-    /*  SCFS      */  PACK( 2, 0 ),
-    /*  MD[0]     */  PACK( 2, 1 ),
-    /*  MD[1]     */  PACK( 2, 1 ),
-    /*  MPPEM     */  PACK( 0, 1 ),
-    /*  MPS       */  PACK( 0, 1 ),
-    /*  FlipON    */  PACK( 0, 0 ),
-    /*  FlipOFF   */  PACK( 0, 0 ),
-    /*  DEBUG     */  PACK( 1, 0 ),
-
-    /*  LT        */  PACK( 2, 1 ),
-    /*  LTEQ      */  PACK( 2, 1 ),
-    /*  GT        */  PACK( 2, 1 ),
-    /*  GTEQ      */  PACK( 2, 1 ),
-    /*  EQ        */  PACK( 2, 1 ),
-    /*  NEQ       */  PACK( 2, 1 ),
-    /*  ODD       */  PACK( 1, 1 ),
-    /*  EVEN      */  PACK( 1, 1 ),
-    /*  IF        */  PACK( 1, 0 ),
-    /*  EIF       */  PACK( 0, 0 ),
-    /*  AND       */  PACK( 2, 1 ),
-    /*  OR        */  PACK( 2, 1 ),
-    /*  NOT       */  PACK( 1, 1 ),
-    /*  DeltaP1   */  PACK( 1, 0 ),
-    /*  SDB       */  PACK( 1, 0 ),
-    /*  SDS       */  PACK( 1, 0 ),
-
-    /*  ADD       */  PACK( 2, 1 ),
-    /*  SUB       */  PACK( 2, 1 ),
-    /*  DIV       */  PACK( 2, 1 ),
-    /*  MUL       */  PACK( 2, 1 ),
-    /*  ABS       */  PACK( 1, 1 ),
-    /*  NEG       */  PACK( 1, 1 ),
-    /*  FLOOR     */  PACK( 1, 1 ),
-    /*  CEILING   */  PACK( 1, 1 ),
-    /*  ROUND[0]  */  PACK( 1, 1 ),
-    /*  ROUND[1]  */  PACK( 1, 1 ),
-    /*  ROUND[2]  */  PACK( 1, 1 ),
-    /*  ROUND[3]  */  PACK( 1, 1 ),
-    /*  NROUND[0] */  PACK( 1, 1 ),
-    /*  NROUND[1] */  PACK( 1, 1 ),
-    /*  NROUND[2] */  PACK( 1, 1 ),
-    /*  NROUND[3] */  PACK( 1, 1 ),
-
-    /*  WCvtF     */  PACK( 2, 0 ),
-    /*  DeltaP2   */  PACK( 1, 0 ),
-    /*  DeltaP3   */  PACK( 1, 0 ),
-    /*  DeltaCn[0] */ PACK( 1, 0 ),
-    /*  DeltaCn[1] */ PACK( 1, 0 ),
-    /*  DeltaCn[2] */ PACK( 1, 0 ),
-    /*  SROUND    */  PACK( 1, 0 ),
-    /*  S45Round  */  PACK( 1, 0 ),
-    /*  JROT      */  PACK( 2, 0 ),
-    /*  JROF      */  PACK( 2, 0 ),
-    /*  ROFF      */  PACK( 0, 0 ),
-    /*  INS_$7B   */  PACK( 0, 0 ),
-    /*  RUTG      */  PACK( 0, 0 ),
-    /*  RDTG      */  PACK( 0, 0 ),
-    /*  SANGW     */  PACK( 1, 0 ),
-    /*  AA        */  PACK( 1, 0 ),
-
-    /*  FlipPT    */  PACK( 0, 0 ), /* loops */
-    /*  FlipRgON  */  PACK( 2, 0 ),
-    /*  FlipRgOFF */  PACK( 2, 0 ),
-    /*  INS_$83   */  PACK( 0, 0 ),
-    /*  INS_$84   */  PACK( 0, 0 ),
-    /*  ScanCTRL  */  PACK( 1, 0 ),
-    /*  SDPvTL[0] */  PACK( 2, 0 ),
-    /*  SDPvTL[1] */  PACK( 2, 0 ),
-    /*  GetINFO   */  PACK( 1, 1 ),
-    /*  IDEF      */  PACK( 1, 0 ),
-    /*  ROLL      */  PACK( 3, 3 ),
-    /*  MAX       */  PACK( 2, 1 ),
-    /*  MIN       */  PACK( 2, 1 ),
-    /*  ScanTYPE  */  PACK( 1, 0 ),
-    /*  InstCTRL  */  PACK( 2, 0 ),
-    /*  INS_$8F   */  PACK( 0, 0 ),
-
-    /*  INS_$90  */   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 ),
-    /*  INS_$96  */   PACK( 0, 0 ),
-    /*  INS_$97  */   PACK( 0, 0 ),
-    /*  INS_$98  */   PACK( 0, 0 ),
-    /*  INS_$99  */   PACK( 0, 0 ),
-    /*  INS_$9A  */   PACK( 0, 0 ),
-    /*  INS_$9B  */   PACK( 0, 0 ),
-    /*  INS_$9C  */   PACK( 0, 0 ),
-    /*  INS_$9D  */   PACK( 0, 0 ),
-    /*  INS_$9E  */   PACK( 0, 0 ),
-    /*  INS_$9F  */   PACK( 0, 0 ),
-
-    /*  INS_$A0  */   PACK( 0, 0 ),
-    /*  INS_$A1  */   PACK( 0, 0 ),
-    /*  INS_$A2  */   PACK( 0, 0 ),
-    /*  INS_$A3  */   PACK( 0, 0 ),
-    /*  INS_$A4  */   PACK( 0, 0 ),
-    /*  INS_$A5  */   PACK( 0, 0 ),
-    /*  INS_$A6  */   PACK( 0, 0 ),
-    /*  INS_$A7  */   PACK( 0, 0 ),
-    /*  INS_$A8  */   PACK( 0, 0 ),
-    /*  INS_$A9  */   PACK( 0, 0 ),
-    /*  INS_$AA  */   PACK( 0, 0 ),
-    /*  INS_$AB  */   PACK( 0, 0 ),
-    /*  INS_$AC  */   PACK( 0, 0 ),
-    /*  INS_$AD  */   PACK( 0, 0 ),
-    /*  INS_$AE  */   PACK( 0, 0 ),
-    /*  INS_$AF  */   PACK( 0, 0 ),
-
-    /*  PushB[0]  */  PACK( 0, 1 ),
-    /*  PushB[1]  */  PACK( 0, 2 ),
-    /*  PushB[2]  */  PACK( 0, 3 ),
-    /*  PushB[3]  */  PACK( 0, 4 ),
-    /*  PushB[4]  */  PACK( 0, 5 ),
-    /*  PushB[5]  */  PACK( 0, 6 ),
-    /*  PushB[6]  */  PACK( 0, 7 ),
-    /*  PushB[7]  */  PACK( 0, 8 ),
-    /*  PushW[0]  */  PACK( 0, 1 ),
-    /*  PushW[1]  */  PACK( 0, 2 ),
-    /*  PushW[2]  */  PACK( 0, 3 ),
-    /*  PushW[3]  */  PACK( 0, 4 ),
-    /*  PushW[4]  */  PACK( 0, 5 ),
-    /*  PushW[5]  */  PACK( 0, 6 ),
-    /*  PushW[6]  */  PACK( 0, 7 ),
-    /*  PushW[7]  */  PACK( 0, 8 ),
-
-    /*  MDRP[00]  */  PACK( 1, 0 ),
-    /*  MDRP[01]  */  PACK( 1, 0 ),
-    /*  MDRP[02]  */  PACK( 1, 0 ),
-    /*  MDRP[03]  */  PACK( 1, 0 ),
-    /*  MDRP[04]  */  PACK( 1, 0 ),
-    /*  MDRP[05]  */  PACK( 1, 0 ),
-    /*  MDRP[06]  */  PACK( 1, 0 ),
-    /*  MDRP[07]  */  PACK( 1, 0 ),
-    /*  MDRP[08]  */  PACK( 1, 0 ),
-    /*  MDRP[09]  */  PACK( 1, 0 ),
-    /*  MDRP[10]  */  PACK( 1, 0 ),
-    /*  MDRP[11]  */  PACK( 1, 0 ),
-    /*  MDRP[12]  */  PACK( 1, 0 ),
-    /*  MDRP[13]  */  PACK( 1, 0 ),
-    /*  MDRP[14]  */  PACK( 1, 0 ),
-    /*  MDRP[15]  */  PACK( 1, 0 ),
-
-    /*  MDRP[16]  */  PACK( 1, 0 ),
-    /*  MDRP[17]  */  PACK( 1, 0 ),
-    /*  MDRP[18]  */  PACK( 1, 0 ),
-    /*  MDRP[19]  */  PACK( 1, 0 ),
-    /*  MDRP[20]  */  PACK( 1, 0 ),
-    /*  MDRP[21]  */  PACK( 1, 0 ),
-    /*  MDRP[22]  */  PACK( 1, 0 ),
-    /*  MDRP[23]  */  PACK( 1, 0 ),
-    /*  MDRP[24]  */  PACK( 1, 0 ),
-    /*  MDRP[25]  */  PACK( 1, 0 ),
-    /*  MDRP[26]  */  PACK( 1, 0 ),
-    /*  MDRP[27]  */  PACK( 1, 0 ),
-    /*  MDRP[28]  */  PACK( 1, 0 ),
-    /*  MDRP[29]  */  PACK( 1, 0 ),
-    /*  MDRP[30]  */  PACK( 1, 0 ),
-    /*  MDRP[31]  */  PACK( 1, 0 ),
-
-    /*  MIRP[00]  */  PACK( 2, 0 ),
-    /*  MIRP[01]  */  PACK( 2, 0 ),
-    /*  MIRP[02]  */  PACK( 2, 0 ),
-    /*  MIRP[03]  */  PACK( 2, 0 ),
-    /*  MIRP[04]  */  PACK( 2, 0 ),
-    /*  MIRP[05]  */  PACK( 2, 0 ),
-    /*  MIRP[06]  */  PACK( 2, 0 ),
-    /*  MIRP[07]  */  PACK( 2, 0 ),
-    /*  MIRP[08]  */  PACK( 2, 0 ),
-    /*  MIRP[09]  */  PACK( 2, 0 ),
-    /*  MIRP[10]  */  PACK( 2, 0 ),
-    /*  MIRP[11]  */  PACK( 2, 0 ),
-    /*  MIRP[12]  */  PACK( 2, 0 ),
-    /*  MIRP[13]  */  PACK( 2, 0 ),
-    /*  MIRP[14]  */  PACK( 2, 0 ),
-    /*  MIRP[15]  */  PACK( 2, 0 ),
-
-    /*  MIRP[16]  */  PACK( 2, 0 ),
-    /*  MIRP[17]  */  PACK( 2, 0 ),
-    /*  MIRP[18]  */  PACK( 2, 0 ),
-    /*  MIRP[19]  */  PACK( 2, 0 ),
-    /*  MIRP[20]  */  PACK( 2, 0 ),
-    /*  MIRP[21]  */  PACK( 2, 0 ),
-    /*  MIRP[22]  */  PACK( 2, 0 ),
-    /*  MIRP[23]  */  PACK( 2, 0 ),
-    /*  MIRP[24]  */  PACK( 2, 0 ),
-    /*  MIRP[25]  */  PACK( 2, 0 ),
-    /*  MIRP[26]  */  PACK( 2, 0 ),
-    /*  MIRP[27]  */  PACK( 2, 0 ),
-    /*  MIRP[28]  */  PACK( 2, 0 ),
-    /*  MIRP[29]  */  PACK( 2, 0 ),
-    /*  MIRP[30]  */  PACK( 2, 0 ),
-    /*  MIRP[31]  */  PACK( 2, 0 )
-  };
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-  /* the first hex digit gives the length of the opcode name; the space */
-  /* after the digit is here just to increase readability of the source */
-  /* code                                                               */
-
-  static
-  const char*  const opcode_name[256] =
-  {
-    "7 SVTCA y",
-    "7 SVTCA x",
-    "8 SPvTCA y",
-    "8 SPvTCA x",
-    "8 SFvTCA y",
-    "8 SFvTCA x",
-    "8 SPvTL ||",
-    "7 SPvTL +",
-    "8 SFvTL ||",
-    "7 SFvTL +",
-    "5 SPvFS",
-    "5 SFvFS",
-    "3 GPv",
-    "3 GFv",
-    "6 SFvTPv",
-    "5 ISECT",
-
-    "4 SRP0",
-    "4 SRP1",
-    "4 SRP2",
-    "4 SZP0",
-    "4 SZP1",
-    "4 SZP2",
-    "4 SZPS",
-    "5 SLOOP",
-    "3 RTG",
-    "4 RTHG",
-    "3 SMD",
-    "4 ELSE",
-    "4 JMPR",
-    "6 SCvTCi",
-    "5 SSwCi",
-    "3 SSW",
-
-    "3 DUP",
-    "3 POP",
-    "5 CLEAR",
-    "4 SWAP",
-    "5 DEPTH",
-    "6 CINDEX",
-    "6 MINDEX",
-    "8 AlignPTS",
-    "7 INS_$28",
-    "3 UTP",
-    "8 LOOPCALL",
-    "4 CALL",
-    "4 FDEF",
-    "4 ENDF",
-    "7 MDAP[0]",
-    "7 MDAP[1]",
-
-    "6 IUP[0]",
-    "6 IUP[1]",
-    "6 SHP[0]",
-    "6 SHP[1]",
-    "6 SHC[0]",
-    "6 SHC[1]",
-    "6 SHZ[0]",
-    "6 SHZ[1]",
-    "5 SHPIX",
-    "2 IP",
-    "8 MSIRP[0]",
-    "8 MSIRP[1]",
-    "7 AlignRP",
-    "4 RTDG",
-    "7 MIAP[0]",
-    "7 MIAP[1]",
-
-    "6 NPushB",
-    "6 NPushW",
-    "2 WS",
-    "2 RS",
-    "5 WCvtP",
-    "4 RCvt",
-    "5 GC[0]",
-    "5 GC[1]",
-    "4 SCFS",
-    "5 MD[0]",
-    "5 MD[1]",
-    "5 MPPEM",
-    "3 MPS",
-    "6 FlipON",
-    "7 FlipOFF",
-    "5 DEBUG",
-
-    "2 LT",
-    "4 LTEQ",
-    "2 GT",
-    "4 GTEQ",
-    "2 EQ",
-    "3 NEQ",
-    "3 ODD",
-    "4 EVEN",
-    "2 IF",
-    "3 EIF",
-    "3 AND",
-    "2 OR",
-    "3 NOT",
-    "7 DeltaP1",
-    "3 SDB",
-    "3 SDS",
-
-    "3 ADD",
-    "3 SUB",
-    "3 DIV",
-    "3 MUL",
-    "3 ABS",
-    "3 NEG",
-    "5 FLOOR",
-    "7 CEILING",
-    "8 ROUND[0]",
-    "8 ROUND[1]",
-    "8 ROUND[2]",
-    "8 ROUND[3]",
-    "9 NROUND[0]",
-    "9 NROUND[1]",
-    "9 NROUND[2]",
-    "9 NROUND[3]",
-
-    "5 WCvtF",
-    "7 DeltaP2",
-    "7 DeltaP3",
-    "A DeltaCn[0]",
-    "A DeltaCn[1]",
-    "A DeltaCn[2]",
-    "6 SROUND",
-    "8 S45Round",
-    "4 JROT",
-    "4 JROF",
-    "4 ROFF",
-    "7 INS_$7B",
-    "4 RUTG",
-    "4 RDTG",
-    "5 SANGW",
-    "2 AA",
-
-    "6 FlipPT",
-    "8 FlipRgON",
-    "9 FlipRgOFF",
-    "7 INS_$83",
-    "7 INS_$84",
-    "8 ScanCTRL",
-    "9 SDPvTL[0]",
-    "9 SDPvTL[1]",
-    "7 GetINFO",
-    "4 IDEF",
-    "4 ROLL",
-    "3 MAX",
-    "3 MIN",
-    "8 ScanTYPE",
-    "8 InstCTRL",
-    "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",
-    "7 INS_$96",
-    "7 INS_$97",
-    "7 INS_$98",
-    "7 INS_$99",
-    "7 INS_$9A",
-    "7 INS_$9B",
-    "7 INS_$9C",
-    "7 INS_$9D",
-    "7 INS_$9E",
-    "7 INS_$9F",
-
-    "7 INS_$A0",
-    "7 INS_$A1",
-    "7 INS_$A2",
-    "7 INS_$A3",
-    "7 INS_$A4",
-    "7 INS_$A5",
-    "7 INS_$A6",
-    "7 INS_$A7",
-    "7 INS_$A8",
-    "7 INS_$A9",
-    "7 INS_$AA",
-    "7 INS_$AB",
-    "7 INS_$AC",
-    "7 INS_$AD",
-    "7 INS_$AE",
-    "7 INS_$AF",
-
-    "8 PushB[0]",
-    "8 PushB[1]",
-    "8 PushB[2]",
-    "8 PushB[3]",
-    "8 PushB[4]",
-    "8 PushB[5]",
-    "8 PushB[6]",
-    "8 PushB[7]",
-    "8 PushW[0]",
-    "8 PushW[1]",
-    "8 PushW[2]",
-    "8 PushW[3]",
-    "8 PushW[4]",
-    "8 PushW[5]",
-    "8 PushW[6]",
-    "8 PushW[7]",
-
-    "8 MDRP[00]",
-    "8 MDRP[01]",
-    "8 MDRP[02]",
-    "8 MDRP[03]",
-    "8 MDRP[04]",
-    "8 MDRP[05]",
-    "8 MDRP[06]",
-    "8 MDRP[07]",
-    "8 MDRP[08]",
-    "8 MDRP[09]",
-    "8 MDRP[10]",
-    "8 MDRP[11]",
-    "8 MDRP[12]",
-    "8 MDRP[13]",
-    "8 MDRP[14]",
-    "8 MDRP[15]",
-
-    "8 MDRP[16]",
-    "8 MDRP[17]",
-    "8 MDRP[18]",
-    "8 MDRP[19]",
-    "8 MDRP[20]",
-    "8 MDRP[21]",
-    "8 MDRP[22]",
-    "8 MDRP[23]",
-    "8 MDRP[24]",
-    "8 MDRP[25]",
-    "8 MDRP[26]",
-    "8 MDRP[27]",
-    "8 MDRP[28]",
-    "8 MDRP[29]",
-    "8 MDRP[30]",
-    "8 MDRP[31]",
-
-    "8 MIRP[00]",
-    "8 MIRP[01]",
-    "8 MIRP[02]",
-    "8 MIRP[03]",
-    "8 MIRP[04]",
-    "8 MIRP[05]",
-    "8 MIRP[06]",
-    "8 MIRP[07]",
-    "8 MIRP[08]",
-    "8 MIRP[09]",
-    "8 MIRP[10]",
-    "8 MIRP[11]",
-    "8 MIRP[12]",
-    "8 MIRP[13]",
-    "8 MIRP[14]",
-    "8 MIRP[15]",
-
-    "8 MIRP[16]",
-    "8 MIRP[17]",
-    "8 MIRP[18]",
-    "8 MIRP[19]",
-    "8 MIRP[20]",
-    "8 MIRP[21]",
-    "8 MIRP[22]",
-    "8 MIRP[23]",
-    "8 MIRP[24]",
-    "8 MIRP[25]",
-    "8 MIRP[26]",
-    "8 MIRP[27]",
-    "8 MIRP[28]",
-    "8 MIRP[29]",
-    "8 MIRP[30]",
-    "8 MIRP[31]"
-  };
-
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-
-  static
-  const FT_Char  opcode_length[256] =
-  {
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-
-   -1,-2, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    2, 3, 4, 5,  6, 7, 8, 9,  3, 5, 7, 9, 11,13,15,17,
-
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,
-    1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1,  1, 1, 1, 1
-  };
-
-#undef PACK
-
-
-#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER
-
-#if defined( __arm__ )                                 && \
-    ( defined( __thumb2__ ) || !defined( __thumb__ ) )
-
-#define TT_MulFix14  TT_MulFix14_arm
-
-  static FT_Int32
-  TT_MulFix14_arm( FT_Int32  a,
-                   FT_Int    b )
-  {
-    FT_Int32  t, t2;
-
-
-#if defined( __CC_ARM ) || defined( __ARMCC__ )
-
-    __asm
-    {
-      smull t2, t,  b,  a           /* (lo=t2,hi=t) = a*b */
-      mov   a,  t,  asr #31         /* a   = (hi >> 31) */
-      add   a,  a,  #0x2000         /* a  += 0x2000 */
-      adds  t2, t2, a               /* t2 += a */
-      adc   t,  t,  #0              /* t  += carry */
-      mov   a,  t2, lsr #14         /* a   = t2 >> 14 */
-      orr   a,  a,  t,  lsl #18     /* a  |= t << 18 */
-    }
-
-#elif defined( __GNUC__ )
-
-    __asm__ __volatile__ (
-      "smull  %1, %2, %4, %3\n\t"       /* (lo=%1,hi=%2) = a*b */
-      "mov    %0, %2, asr #31\n\t"      /* %0  = (hi >> 31) */
-#if defined( __clang__ ) && defined( __thumb2__ )
-      "add.w  %0, %0, #0x2000\n\t"      /* %0 += 0x2000 */
-#else
-      "add    %0, %0, #0x2000\n\t"      /* %0 += 0x2000 */
-#endif
-      "adds   %1, %1, %0\n\t"           /* %1 += %0 */
-      "adc    %2, %2, #0\n\t"           /* %2 += carry */
-      "mov    %0, %1, lsr #14\n\t"      /* %0  = %1 >> 16 */
-      "orr    %0, %0, %2, lsl #18\n\t"  /* %0 |= %2 << 16 */
-      : "=r"(a), "=&r"(t2), "=&r"(t)
-      : "r"(a), "r"(b)
-      : "cc" );
-
-#endif
-
-    return a;
-  }
-
-#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */
-
-#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */
-
-
-#if defined( __GNUC__ )                              && \
-    ( defined( __i386__ ) || defined( __x86_64__ ) )
-
-#define TT_MulFix14  TT_MulFix14_long_long
-
-  /* Temporarily disable the warning that C90 doesn't support `long long'. */
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
-
-  /* This is declared `noinline' because inlining the function results */
-  /* in slower code.  The `pure' attribute indicates that the result   */
-  /* only depends on the parameters.                                   */
-  static __attribute__(( noinline ))
-         __attribute__(( pure )) FT_Int32
-  TT_MulFix14_long_long( FT_Int32  a,
-                         FT_Int    b )
-  {
-
-    long long  ret = (long long)a * b;
-
-    /* The following line assumes that right shifting of signed values */
-    /* will actually preserve the sign bit.  The exact behaviour is    */
-    /* undefined, but this is true on x86 and x86_64.                  */
-    long long  tmp = ret >> 63;
-
-
-    ret += 0x2000 + tmp;
-
-    return (FT_Int32)( ret >> 14 );
-  }
-
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
-
-#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */
-
-
-#ifndef TT_MulFix14
-
-  /* Compute (a*b)/2^14 with maximum accuracy and rounding.  */
-  /* This is optimized to be faster than calling FT_MulFix() */
-  /* for platforms where sizeof(int) == 2.                   */
-  static FT_Int32
-  TT_MulFix14( FT_Int32  a,
-               FT_Int    b )
-  {
-    FT_Int32   sign;
-    FT_UInt32  ah, al, mid, lo, hi;
-
-
-    sign = a ^ b;
-
-    if ( a < 0 )
-      a = -a;
-    if ( b < 0 )
-      b = -b;
-
-    ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU );
-    al = (FT_UInt32)( a & 0xFFFFU );
-
-    lo    = al * b;
-    mid   = ah * b;
-    hi    = mid >> 16;
-    mid   = ( mid << 16 ) + ( 1 << 13 ); /* rounding */
-    lo   += mid;
-    if ( lo < mid )
-      hi += 1;
-
-    mid = ( lo >> 14 ) | ( hi << 18 );
-
-    return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid;
-  }
-
-#endif  /* !TT_MulFix14 */
-
-
-#if defined( __GNUC__ )        && \
-    ( defined( __i386__ )   ||    \
-      defined( __x86_64__ ) ||    \
-      defined( __arm__ )    )
-
-#define TT_DotFix14  TT_DotFix14_long_long
-
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic push
-#endif
-#pragma GCC diagnostic ignored "-Wlong-long"
-
-  static __attribute__(( pure )) FT_Int32
-  TT_DotFix14_long_long( FT_Int32  ax,
-                         FT_Int32  ay,
-                         FT_Int    bx,
-                         FT_Int    by )
-  {
-    /* Temporarily disable the warning that C90 doesn't support */
-    /* `long long'.                                             */
-
-    long long  temp1 = (long long)ax * bx;
-    long long  temp2 = (long long)ay * by;
-
-
-    temp1 += temp2;
-    temp2  = temp1 >> 63;
-    temp1 += 0x2000 + temp2;
-
-    return (FT_Int32)( temp1 >> 14 );
-
-  }
-
-#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406
-#pragma GCC diagnostic pop
-#endif
-
-#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */
-
-
-#ifndef TT_DotFix14
-
-  /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */
-  static FT_Int32
-  TT_DotFix14( FT_Int32  ax,
-               FT_Int32  ay,
-               FT_Int    bx,
-               FT_Int    by )
-  {
-    FT_Int32   m, s, hi1, hi2, hi;
-    FT_UInt32  l, lo1, lo2, lo;
-
-
-    /* compute ax*bx as 64-bit value */
-    l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx );
-    m = ( ax >> 16 ) * bx;
-
-    lo1 = l + ( (FT_UInt32)m << 16 );
-    hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l );
-
-    /* compute ay*by as 64-bit value */
-    l = (FT_UInt32)( ( ay & 0xFFFFU ) * by );
-    m = ( ay >> 16 ) * by;
-
-    lo2 = l + ( (FT_UInt32)m << 16 );
-    hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l );
-
-    /* add them */
-    lo = lo1 + lo2;
-    hi = hi1 + hi2 + ( lo < lo1 );
-
-    /* divide the result by 2^14 with rounding */
-    s   = hi >> 31;
-    l   = lo + (FT_UInt32)s;
-    hi += s + ( l < lo );
-    lo  = l;
-
-    l   = lo + 0x2000U;
-    hi += ( l < lo );
-
-    return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) );
-  }
-
-#endif /* TT_DotFix14 */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Current_Ratio                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Returns the current aspect ratio scaling factor depending on the   */
-  /*    projection vector's state and device resolutions.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The aspect ratio in 16.16 format, always <= 1.0 .                  */
-  /*                                                                       */
-  static FT_Long
-  Current_Ratio( TT_ExecContext  exc )
-  {
-    if ( !exc->tt_metrics.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
-      {
-        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 );
-      }
-    }
-    return exc->tt_metrics.ratio;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Long )
-  Current_Ppem( TT_ExecContext  exc )
-  {
-    return exc->tt_metrics.ppem;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Long )
-  Current_Ppem_Stretched( TT_ExecContext  exc )
-  {
-    return FT_MulFix( exc->tt_metrics.ppem, Current_Ratio( exc ) );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Functions related to the control value table (CVT).                   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  FT_CALLBACK_DEF( FT_F26Dot6 )
-  Read_CVT( TT_ExecContext  exc,
-            FT_ULong        idx )
-  {
-    return exc->cvt[idx];
-  }
-
-
-  FT_CALLBACK_DEF( FT_F26Dot6 )
-  Read_CVT_Stretched( TT_ExecContext  exc,
-                      FT_ULong        idx )
-  {
-    return FT_MulFix( exc->cvt[idx], Current_Ratio( exc ) );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  Write_CVT( TT_ExecContext  exc,
-             FT_ULong        idx,
-             FT_F26Dot6      value )
-  {
-    exc->cvt[idx] = value;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  Write_CVT_Stretched( TT_ExecContext  exc,
-                       FT_ULong        idx,
-                       FT_F26Dot6      value )
-  {
-    exc->cvt[idx] = FT_DivFix( value, Current_Ratio( exc ) );
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  Move_CVT( TT_ExecContext  exc,
-            FT_ULong        idx,
-            FT_F26Dot6      value )
-  {
-    exc->cvt[idx] += value;
-  }
-
-
-  FT_CALLBACK_DEF( void )
-  Move_CVT_Stretched( TT_ExecContext  exc,
-                      FT_ULong        idx,
-                      FT_F26Dot6      value )
-  {
-    exc->cvt[idx] += FT_DivFix( value, Current_Ratio( exc ) );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    GetShortIns                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Returns a short integer taken from the instruction stream at       */
-  /*    address IP.                                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Short read at code[IP].                                            */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This one could become a macro.                                     */
-  /*                                                                       */
-  static FT_Short
-  GetShortIns( TT_ExecContext  exc )
-  {
-    /* 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]      );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Ins_Goto_CodeRange                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Goes to a certain code range in the instruction stream.            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    aRange :: The index of the code range.                             */
-  /*                                                                       */
-  /*    aIP    :: The new IP address in the code range.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    SUCCESS or FAILURE.                                                */
-  /*                                                                       */
-  static FT_Bool
-  Ins_Goto_CodeRange( TT_ExecContext  exc,
-                      FT_Int          aRange,
-                      FT_Long         aIP )
-  {
-    TT_CodeRange*  range;
-
-
-    if ( aRange < 1 || aRange > 3 )
-    {
-      exc->error = FT_THROW( Bad_Argument );
-      return FAILURE;
-    }
-
-    range = &exc->codeRangeTable[aRange - 1];
-
-    if ( !range->base )     /* invalid coderange */
-    {
-      exc->error = FT_THROW( Invalid_CodeRange );
-      return FAILURE;
-    }
-
-    /* NOTE: Because the last instruction of a program may be a CALL */
-    /*       which will return to the first byte *after* the code    */
-    /*       range, we test for aIP <= Size, instead of aIP < Size.  */
-
-    if ( aIP > range->size )
-    {
-      exc->error = FT_THROW( Code_Overflow );
-      return FAILURE;
-    }
-
-    exc->code     = range->base;
-    exc->codeSize = range->size;
-    exc->IP       = aIP;
-    exc->curRange = aRange;
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Direct_Move                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Moves a point by a given distance along the freedom vector.  The   */
-  /*    point will be `touched'.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    point    :: The index of the point to move.                        */
-  /*                                                                       */
-  /*    distance :: The distance to apply.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    zone     :: The affected glyph zone.                               */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    See `ttinterp.h' for details on backwards compatibility mode.      */
-  /*    `Touches' the point.                                               */
-  /*                                                                       */
-  static void
-  Direct_Move( TT_ExecContext  exc,
-               TT_GlyphZone    zone,
-               FT_UShort       point,
-               FT_F26Dot6      distance )
-  {
-    FT_F26Dot6  v;
-
-
-    v = exc->GS.freeVector.x;
-
-    if ( v != 0 )
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY                            &&
-           ( !exc->ignore_x_mode                                ||
-             ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) )
-        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->backwards_compatibility )
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
-      else
-#endif
-
-      if ( NO_SUBPIXEL_HINTING )
-        zone->cur[point].x += FT_MulDiv( distance, v, exc->F_dot_P );
-
-      zone->tags[point] |= FT_CURVE_TAG_TOUCH_X;
-    }
-
-    v = exc->GS.freeVector.y;
-
-    if ( v != 0 )
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL     &&
-              exc->backwards_compatibility &&
-              exc->iupx_called             &&
-              exc->iupy_called             ) )
-#endif
-        zone->cur[point].y += FT_MulDiv( distance, v, exc->F_dot_P );
-
-      zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Direct_Move_Orig                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Moves the *original* position of a point by a given distance along */
-  /*    the freedom vector.  Obviously, the point will not be `touched'.   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    point    :: The index of the point to move.                        */
-  /*                                                                       */
-  /*    distance :: The distance to apply.                                 */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    zone     :: The affected glyph zone.                               */
-  /*                                                                       */
-  static void
-  Direct_Move_Orig( TT_ExecContext  exc,
-                    TT_GlyphZone    zone,
-                    FT_UShort       point,
-                    FT_F26Dot6      distance )
-  {
-    FT_F26Dot6  v;
-
-
-    v = exc->GS.freeVector.x;
-
-    if ( v != 0 )
-      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 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Special versions of Direct_Move()                                     */
-  /*                                                                       */
-  /*   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 backwards compatibility mode.       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static void
-  Direct_Move_X( TT_ExecContext  exc,
-                 TT_GlyphZone    zone,
-                 FT_UShort       point,
-                 FT_F26Dot6      distance )
-  {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode )
-      zone->cur[point].x += distance;
-    else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( SUBPIXEL_HINTING_MINIMAL && !exc->backwards_compatibility )
-      zone->cur[point].x += distance;
-    else
-#endif
-
-    if ( NO_SUBPIXEL_HINTING )
-      zone->cur[point].x += distance;
-
-    zone->tags[point]  |= FT_CURVE_TAG_TOUCH_X;
-  }
-
-
-  static void
-  Direct_Move_Y( TT_ExecContext  exc,
-                 TT_GlyphZone    zone,
-                 FT_UShort       point,
-                 FT_F26Dot6      distance )
-  {
-    FT_UNUSED( exc );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( !( SUBPIXEL_HINTING_MINIMAL             &&
-            exc->backwards_compatibility         &&
-            exc->iupx_called && exc->iupy_called ) )
-#endif
-      zone->cur[point].y += distance;
-
-    zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Special versions of Direct_Move_Orig()                                */
-  /*                                                                       */
-  /*   The following versions are used whenever both vectors are both      */
-  /*   along one of the coordinate unit vectors, i.e. in 90% of the cases. */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static void
-  Direct_Move_Orig_X( TT_ExecContext  exc,
-                      TT_GlyphZone    zone,
-                      FT_UShort       point,
-                      FT_F26Dot6      distance )
-  {
-    FT_UNUSED( exc );
-
-    zone->org[point].x += distance;
-  }
-
-
-  static void
-  Direct_Move_Orig_Y( TT_ExecContext  exc,
-                      TT_GlyphZone    zone,
-                      FT_UShort       point,
-                      FT_F26Dot6      distance )
-  {
-    FT_UNUSED( exc );
-
-    zone->org[point].y += distance;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_None                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Does not round, but adds engine compensation.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance (not) to round.                       */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The compensated distance.                                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The TrueType specification says very few 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.                                                   */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_None( TT_ExecContext  exc,
-              FT_F26Dot6      distance,
-              FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = distance + compensation;
-      if ( val < 0 )
-        val = 0;
-    }
-    else
-    {
-      val = distance - compensation;
-      if ( val > 0 )
-        val = 0;
-    }
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_To_Grid                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Rounds value to grid after adding engine compensation.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_To_Grid( TT_ExecContext  exc,
-                 FT_F26Dot6      distance,
-                 FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = FT_PIX_ROUND( distance + compensation );
-      if ( val < 0 )
-        val = 0;
-    }
-    else
-    {
-      val = -FT_PIX_ROUND( compensation - distance );
-      if ( val > 0 )
-        val = 0;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_To_Half_Grid                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Rounds value to half grid after adding engine compensation.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_To_Half_Grid( TT_ExecContext  exc,
-                      FT_F26Dot6      distance,
-                      FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = FT_PIX_FLOOR( distance + compensation ) + 32;
-      if ( val < 0 )
-        val = 32;
-    }
-    else
-    {
-      val = -( FT_PIX_FLOOR( compensation - distance ) + 32 );
-      if ( val > 0 )
-        val = -32;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_Down_To_Grid                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Rounds value down to grid after adding engine compensation.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_Down_To_Grid( TT_ExecContext  exc,
-                      FT_F26Dot6      distance,
-                      FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = FT_PIX_FLOOR( distance + compensation );
-      if ( val < 0 )
-        val = 0;
-    }
-    else
-    {
-      val = -FT_PIX_FLOOR( compensation - distance );
-      if ( val > 0 )
-        val = 0;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_Up_To_Grid                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Rounds value up to grid after adding engine compensation.          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_Up_To_Grid( TT_ExecContext  exc,
-                    FT_F26Dot6      distance,
-                    FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = FT_PIX_CEIL( distance + compensation );
-      if ( val < 0 )
-        val = 0;
-    }
-    else
-    {
-      val = -FT_PIX_CEIL( compensation - distance );
-      if ( val > 0 )
-        val = 0;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_To_Double_Grid                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Rounds value to double grid after adding engine compensation.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_To_Double_Grid( TT_ExecContext  exc,
-                        FT_F26Dot6      distance,
-                        FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-    FT_UNUSED( exc );
-
-
-    if ( distance >= 0 )
-    {
-      val = FT_PAD_ROUND( distance + compensation, 32 );
-      if ( val < 0 )
-        val = 0;
-    }
-    else
-    {
-      val = -FT_PAD_ROUND( compensation - distance, 32 );
-      if ( val > 0 )
-        val = 0;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_Super                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Super-rounds value to grid after adding engine compensation.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    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.                                                   */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_Super( TT_ExecContext  exc,
-               FT_F26Dot6      distance,
-               FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-
-    if ( distance >= 0 )
-    {
-      val = ( distance - exc->phase + exc->threshold + compensation ) &
-              -exc->period;
-      val += exc->phase;
-      if ( val < 0 )
-        val = exc->phase;
-    }
-    else
-    {
-      val = -( ( exc->threshold - exc->phase - distance + compensation ) &
-               -exc->period );
-      val -= exc->phase;
-      if ( val > 0 )
-        val = -exc->phase;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Round_Super_45                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Super-rounds value to grid after adding engine compensation.       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    distance     :: The distance to round.                             */
-  /*                                                                       */
-  /*    compensation :: The engine compensation.                           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Rounded distance.                                                  */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    There is a separate function for Round_Super_45() as we may need   */
-  /*    greater precision.                                                 */
-  /*                                                                       */
-  static FT_F26Dot6
-  Round_Super_45( TT_ExecContext  exc,
-                  FT_F26Dot6      distance,
-                  FT_F26Dot6      compensation )
-  {
-    FT_F26Dot6  val;
-
-
-    if ( distance >= 0 )
-    {
-      val = ( ( distance - exc->phase + exc->threshold + compensation ) /
-                exc->period ) * exc->period;
-      val += exc->phase;
-      if ( val < 0 )
-        val = exc->phase;
-    }
-    else
-    {
-      val = -( ( ( exc->threshold - exc->phase - distance + compensation ) /
-                   exc->period ) * exc->period );
-      val -= exc->phase;
-      if ( val > 0 )
-        val = -exc->phase;
-    }
-
-    return val;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Compute_Round                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Sets the rounding mode.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    round_mode :: The rounding mode to be used.                        */
-  /*                                                                       */
-  static void
-  Compute_Round( TT_ExecContext  exc,
-                 FT_Byte         round_mode )
-  {
-    switch ( round_mode )
-    {
-    case TT_Round_Off:
-      exc->func_round = (TT_Round_Func)Round_None;
-      break;
-
-    case TT_Round_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Grid;
-      break;
-
-    case TT_Round_Up_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_Up_To_Grid;
-      break;
-
-    case TT_Round_Down_To_Grid:
-      exc->func_round = (TT_Round_Func)Round_Down_To_Grid;
-      break;
-
-    case TT_Round_To_Half_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Half_Grid;
-      break;
-
-    case TT_Round_To_Double_Grid:
-      exc->func_round = (TT_Round_Func)Round_To_Double_Grid;
-      break;
-
-    case TT_Round_Super:
-      exc->func_round = (TT_Round_Func)Round_Super;
-      break;
-
-    case TT_Round_Super_45:
-      exc->func_round = (TT_Round_Func)Round_Super_45;
-      break;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    SetSuperRound                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Sets Super Round parameters.                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    GridPeriod :: The grid period.                                     */
-  /*                                                                       */
-  /*    selector   :: The SROUND opcode.                                   */
-  /*                                                                       */
-  static void
-  SetSuperRound( TT_ExecContext  exc,
-                 FT_F2Dot14      GridPeriod,
-                 FT_Long         selector )
-  {
-    switch ( (FT_Int)( selector & 0xC0 ) )
-    {
-      case 0:
-        exc->period = GridPeriod / 2;
-        break;
-
-      case 0x40:
-        exc->period = GridPeriod;
-        break;
-
-      case 0x80:
-        exc->period = GridPeriod * 2;
-        break;
-
-      /* This opcode is reserved, but... */
-      case 0xC0:
-        exc->period = GridPeriod;
-        break;
-    }
-
-    switch ( (FT_Int)( selector & 0x30 ) )
-    {
-    case 0:
-      exc->phase = 0;
-      break;
-
-    case 0x10:
-      exc->phase = exc->period / 4;
-      break;
-
-    case 0x20:
-      exc->phase = exc->period / 2;
-      break;
-
-    case 0x30:
-      exc->phase = exc->period * 3 / 4;
-      break;
-    }
-
-    if ( ( selector & 0x0F ) == 0 )
-      exc->threshold = exc->period - 1;
-    else
-      exc->threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * exc->period / 8;
-
-    /* convert to F26Dot6 format */
-    exc->period    >>= 8;
-    exc->phase     >>= 8;
-    exc->threshold >>= 8;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Project                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the projection of vector given by (v2-v1) along the       */
-  /*    current projection vector.                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    v1 :: First input vector.                                          */
-  /*    v2 :: Second input vector.                                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The distance in F26dot6 format.                                    */
-  /*                                                                       */
-  static FT_F26Dot6
-  Project( TT_ExecContext  exc,
-           FT_Pos          dx,
-           FT_Pos          dy )
-  {
-    return TT_DotFix14( dx, dy,
-                        exc->GS.projVector.x,
-                        exc->GS.projVector.y );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Dual_Project                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the projection of the vector given by (v2-v1) along the   */
-  /*    current dual vector.                                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    v1 :: First input vector.                                          */
-  /*    v2 :: Second input vector.                                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The distance in F26dot6 format.                                    */
-  /*                                                                       */
-  static FT_F26Dot6
-  Dual_Project( TT_ExecContext  exc,
-                FT_Pos          dx,
-                FT_Pos          dy )
-  {
-    return TT_DotFix14( dx, dy,
-                        exc->GS.dualVector.x,
-                        exc->GS.dualVector.y );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Project_x                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the projection of the vector given by (v2-v1) along the   */
-  /*    horizontal axis.                                                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    v1 :: First input vector.                                          */
-  /*    v2 :: Second input vector.                                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The distance in F26dot6 format.                                    */
-  /*                                                                       */
-  static FT_F26Dot6
-  Project_x( TT_ExecContext  exc,
-             FT_Pos          dx,
-             FT_Pos          dy )
-  {
-    FT_UNUSED( exc );
-    FT_UNUSED( dy );
-
-    return dx;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Project_y                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the projection of the vector given by (v2-v1) along the   */
-  /*    vertical axis.                                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    v1 :: First input vector.                                          */
-  /*    v2 :: Second input vector.                                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    The distance in F26dot6 format.                                    */
-  /*                                                                       */
-  static FT_F26Dot6
-  Project_y( TT_ExecContext  exc,
-             FT_Pos          dx,
-             FT_Pos          dy )
-  {
-    FT_UNUSED( exc );
-    FT_UNUSED( dx );
-
-    return dy;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Compute_Funcs                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Computes the projection and movement function pointers according   */
-  /*    to the current graphics state.                                     */
-  /*                                                                       */
-  static void
-  Compute_Funcs( TT_ExecContext  exc )
-  {
-    if ( exc->GS.freeVector.x == 0x4000 )
-      exc->F_dot_P = exc->GS.projVector.x;
-    else if ( exc->GS.freeVector.y == 0x4000 )
-      exc->F_dot_P = exc->GS.projVector.y;
-    else
-      exc->F_dot_P =
-        ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x +
-          (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14;
-
-    if ( exc->GS.projVector.x == 0x4000 )
-      exc->func_project = (TT_Project_Func)Project_x;
-    else if ( exc->GS.projVector.y == 0x4000 )
-      exc->func_project = (TT_Project_Func)Project_y;
-    else
-      exc->func_project = (TT_Project_Func)Project;
-
-    if ( exc->GS.dualVector.x == 0x4000 )
-      exc->func_dualproj = (TT_Project_Func)Project_x;
-    else if ( exc->GS.dualVector.y == 0x4000 )
-      exc->func_dualproj = (TT_Project_Func)Project_y;
-    else
-      exc->func_dualproj = (TT_Project_Func)Dual_Project;
-
-    exc->func_move      = (TT_Move_Func)Direct_Move;
-    exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig;
-
-    if ( exc->F_dot_P == 0x4000L )
-    {
-      if ( exc->GS.freeVector.x == 0x4000 )
-      {
-        exc->func_move      = (TT_Move_Func)Direct_Move_X;
-        exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X;
-      }
-      else if ( exc->GS.freeVector.y == 0x4000 )
-      {
-        exc->func_move      = (TT_Move_Func)Direct_Move_Y;
-        exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y;
-      }
-    }
-
-    /* at small sizes, F_dot_P can become too small, resulting   */
-    /* in overflows and `spikes' in a number of glyphs like `w'. */
-
-    if ( FT_ABS( exc->F_dot_P ) < 0x400L )
-      exc->F_dot_P = 0x4000L;
-
-    /* Disable cached aspect ratio */
-    exc->tt_metrics.ratio = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Normalize                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Norms a vector.                                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    Vx :: The horizontal input vector coordinate.                      */
-  /*    Vy :: The vertical input vector coordinate.                        */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    R  :: The normed unit vector.                                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Returns FAILURE if a vector parameter is zero.                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    In case Vx and Vy are both zero, `Normalize' returns SUCCESS, and  */
-  /*    R is undefined.                                                    */
-  /*                                                                       */
-  static FT_Bool
-  Normalize( FT_F26Dot6      Vx,
-             FT_F26Dot6      Vy,
-             FT_UnitVector*  R )
-  {
-    FT_Vector V;
-
-
-    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;
-    }
-
-    V.x = Vx;
-    V.y = Vy;
-
-    FT_Vector_NormLen( &V );
-
-    R->x = (FT_F2Dot14)( V.x / 4 );
-    R->y = (FT_F2Dot14)( V.y / 4 );
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Here we start with the implementation of the various opcodes.         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#define ARRAY_BOUND_ERROR                         \
-    do                                            \
-    {                                             \
-      exc->error = FT_THROW( Invalid_Reference ); \
-      return;                                     \
-    } while (0)
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MPPEM[]:      Measure Pixel Per EM                                    */
-  /* Opcode range: 0x4B                                                    */
-  /* Stack:        --> Euint16                                             */
-  /*                                                                       */
-  static void
-  Ins_MPPEM( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    args[0] = exc->func_cur_ppem( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MPS[]:        Measure Point Size                                      */
-  /* Opcode range: 0x4C                                                    */
-  /* Stack:        --> Euint16                                             */
-  /*                                                                       */
-  static void
-  Ins_MPS( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    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;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DUP[]:        DUPlicate the stack's top element                       */
-  /* Opcode range: 0x20                                                    */
-  /* Stack:        StkElt --> StkElt StkElt                                */
-  /*                                                                       */
-  static void
-  Ins_DUP( FT_Long*  args )
-  {
-    args[1] = args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* POP[]:        POP the stack's top element                             */
-  /* Opcode range: 0x21                                                    */
-  /* Stack:        StkElt -->                                              */
-  /*                                                                       */
-  static void
-  Ins_POP( void )
-  {
-    /* nothing to do */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* CLEAR[]:      CLEAR the entire stack                                  */
-  /* Opcode range: 0x22                                                    */
-  /* Stack:        StkElt... -->                                           */
-  /*                                                                       */
-  static void
-  Ins_CLEAR( TT_ExecContext  exc )
-  {
-    exc->new_top = 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SWAP[]:       SWAP the stack's top two elements                       */
-  /* Opcode range: 0x23                                                    */
-  /* Stack:        2 * StkElt --> 2 * StkElt                               */
-  /*                                                                       */
-  static void
-  Ins_SWAP( FT_Long*  args )
-  {
-    FT_Long  L;
-
-
-    L       = args[0];
-    args[0] = args[1];
-    args[1] = L;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DEPTH[]:      return the stack DEPTH                                  */
-  /* Opcode range: 0x24                                                    */
-  /* Stack:        --> uint32                                              */
-  /*                                                                       */
-  static void
-  Ins_DEPTH( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    args[0] = exc->top;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* LT[]:         Less Than                                               */
-  /* Opcode range: 0x50                                                    */
-  /* Stack:        int32? int32? --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_LT( FT_Long*  args )
-  {
-    args[0] = ( args[0] < args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* LTEQ[]:       Less Than or EQual                                      */
-  /* Opcode range: 0x51                                                    */
-  /* Stack:        int32? int32? --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_LTEQ( FT_Long*  args )
-  {
-    args[0] = ( args[0] <= args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GT[]:         Greater Than                                            */
-  /* Opcode range: 0x52                                                    */
-  /* Stack:        int32? int32? --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_GT( FT_Long*  args )
-  {
-    args[0] = ( args[0] > args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GTEQ[]:       Greater Than or EQual                                   */
-  /* Opcode range: 0x53                                                    */
-  /* Stack:        int32? int32? --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_GTEQ( FT_Long*  args )
-  {
-    args[0] = ( args[0] >= args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* EQ[]:         EQual                                                   */
-  /* Opcode range: 0x54                                                    */
-  /* Stack:        StkElt StkElt --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_EQ( FT_Long*  args )
-  {
-    args[0] = ( args[0] == args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NEQ[]:        Not EQual                                               */
-  /* Opcode range: 0x55                                                    */
-  /* Stack:        StkElt StkElt --> bool                                  */
-  /*                                                                       */
-  static void
-  Ins_NEQ( FT_Long*  args )
-  {
-    args[0] = ( args[0] != args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ODD[]:        Is ODD                                                  */
-  /* Opcode range: 0x56                                                    */
-  /* Stack:        f26.6 --> bool                                          */
-  /*                                                                       */
-  static void
-  Ins_ODD( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* EVEN[]:       Is EVEN                                                 */
-  /* Opcode range: 0x57                                                    */
-  /* Stack:        f26.6 --> bool                                          */
-  /*                                                                       */
-  static void
-  Ins_EVEN( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* AND[]:        logical AND                                             */
-  /* Opcode range: 0x5A                                                    */
-  /* Stack:        uint32 uint32 --> uint32                                */
-  /*                                                                       */
-  static void
-  Ins_AND( FT_Long*  args )
-  {
-    args[0] = ( args[0] && args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* OR[]:         logical OR                                              */
-  /* Opcode range: 0x5B                                                    */
-  /* Stack:        uint32 uint32 --> uint32                                */
-  /*                                                                       */
-  static void
-  Ins_OR( FT_Long*  args )
-  {
-    args[0] = ( args[0] || args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NOT[]:        logical NOT                                             */
-  /* Opcode range: 0x5C                                                    */
-  /* Stack:        StkElt --> uint32                                       */
-  /*                                                                       */
-  static void
-  Ins_NOT( FT_Long*  args )
-  {
-    args[0] = !args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ADD[]:        ADD                                                     */
-  /* Opcode range: 0x60                                                    */
-  /* Stack:        f26.6 f26.6 --> f26.6                                   */
-  /*                                                                       */
-  static void
-  Ins_ADD( FT_Long*  args )
-  {
-    args[0] += args[1];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SUB[]:        SUBtract                                                */
-  /* Opcode range: 0x61                                                    */
-  /* Stack:        f26.6 f26.6 --> f26.6                                   */
-  /*                                                                       */
-  static void
-  Ins_SUB( FT_Long*  args )
-  {
-    args[0] -= args[1];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DIV[]:        DIVide                                                  */
-  /* Opcode range: 0x62                                                    */
-  /* Stack:        f26.6 f26.6 --> f26.6                                   */
-  /*                                                                       */
-  static void
-  Ins_DIV( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    if ( args[1] == 0 )
-      exc->error = FT_THROW( Divide_By_Zero );
-    else
-      args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MUL[]:        MULtiply                                                */
-  /* Opcode range: 0x63                                                    */
-  /* Stack:        f26.6 f26.6 --> f26.6                                   */
-  /*                                                                       */
-  static void
-  Ins_MUL( FT_Long*  args )
-  {
-    args[0] = FT_MulDiv( args[0], args[1], 64L );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ABS[]:        ABSolute value                                          */
-  /* Opcode range: 0x64                                                    */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_ABS( FT_Long*  args )
-  {
-    args[0] = FT_ABS( args[0] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NEG[]:        NEGate                                                  */
-  /* Opcode range: 0x65                                                    */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_NEG( FT_Long*  args )
-  {
-    args[0] = -args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLOOR[]:      FLOOR                                                   */
-  /* Opcode range: 0x66                                                    */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_FLOOR( FT_Long*  args )
-  {
-    args[0] = FT_PIX_FLOOR( args[0] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* CEILING[]:    CEILING                                                 */
-  /* Opcode range: 0x67                                                    */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_CEILING( FT_Long*  args )
-  {
-    args[0] = FT_PIX_CEIL( args[0] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RS[]:         Read Store                                              */
-  /* Opcode range: 0x43                                                    */
-  /* Stack:        uint32 --> uint32                                       */
-  /*                                                                       */
-  static void
-  Ins_RS( TT_ExecContext  exc,
-          FT_Long*        args )
-  {
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->storeSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-      else
-        args[0] = 0;
-    }
-    else
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* subpixel hinting - avoid Typeman Dstroke and */
-      /* IStroke and Vacuform rounds                  */
-      if ( SUBPIXEL_HINTING_INFINALITY                 &&
-           exc->ignore_x_mode                          &&
-           ( ( I == 24                             &&
-               ( exc->face->sph_found_func_flags &
-                 ( SPH_FDEF_SPACING_1 |
-                   SPH_FDEF_SPACING_2 )          ) ) ||
-             ( I == 22                      &&
-               ( exc->sph_in_func_flags   &
-                 SPH_FDEF_TYPEMAN_STROKES ) )        ||
-             ( I == 8                              &&
-               ( exc->face->sph_found_func_flags &
-                 SPH_FDEF_VACUFORM_ROUND_1       ) &&
-               exc->iup_called                     ) ) )
-        args[0] = 0;
-      else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-        args[0] = exc->storage[I];
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* WS[]:         Write Store                                             */
-  /* Opcode range: 0x42                                                    */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_WS( TT_ExecContext  exc,
-          FT_Long*        args )
-  {
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->storeSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-    }
-    else
-      exc->storage[I] = args[1];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* WCVTP[]:      Write CVT in Pixel units                                */
-  /* Opcode range: 0x44                                                    */
-  /* Stack:        f26.6 uint32 -->                                        */
-  /*                                                                       */
-  static void
-  Ins_WCVTP( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->cvtSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-    }
-    else
-      exc->func_write_cvt( exc, I, args[1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* WCVTF[]:      Write CVT in Funits                                     */
-  /* Opcode range: 0x70                                                    */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_WCVTF( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->cvtSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-    }
-    else
-      exc->cvt[I] = FT_MulFix( args[1], exc->tt_metrics.scale );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RCVT[]:       Read CVT                                                */
-  /* Opcode range: 0x45                                                    */
-  /* Stack:        uint32 --> f26.6                                        */
-  /*                                                                       */
-  static void
-  Ins_RCVT( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_ULong  I = (FT_ULong)args[0];
-
-
-    if ( BOUNDSL( I, exc->cvtSize ) )
-    {
-      if ( exc->pedantic_hinting )
-        ARRAY_BOUND_ERROR;
-      else
-        args[0] = 0;
-    }
-    else
-      args[0] = exc->func_read_cvt( exc, I );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* AA[]:         Adjust Angle                                            */
-  /* Opcode range: 0x7F                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_AA( void )
-  {
-    /* intentionally no longer supported */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DEBUG[]:      DEBUG.  Unsupported.                                    */
-  /* Opcode range: 0x4F                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  /* Note: The original instruction pops a value from the stack.           */
-  /*                                                                       */
-  static void
-  Ins_DEBUG( TT_ExecContext  exc )
-  {
-    exc->error = FT_THROW( Debug_OpCode );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ROUND[ab]:    ROUND value                                             */
-  /* Opcode range: 0x68-0x6B                                               */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_ROUND( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    args[0] = exc->func_round(
-                exc,
-                args[0],
-                exc->tt_metrics.compensations[exc->opcode - 0x68] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NROUND[ab]:   No ROUNDing of value                                    */
-  /* Opcode range: 0x6C-0x6F                                               */
-  /* Stack:        f26.6 --> f26.6                                         */
-  /*                                                                       */
-  static void
-  Ins_NROUND( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    args[0] = Round_None(
-                exc,
-                args[0],
-                exc->tt_metrics.compensations[exc->opcode - 0x6C] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MAX[]:        MAXimum                                                 */
-  /* Opcode range: 0x8B                                                    */
-  /* Stack:        int32? int32? --> int32                                 */
-  /*                                                                       */
-  static void
-  Ins_MAX( FT_Long*  args )
-  {
-    if ( args[1] > args[0] )
-      args[0] = args[1];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MIN[]:        MINimum                                                 */
-  /* Opcode range: 0x8C                                                    */
-  /* Stack:        int32? int32? --> int32                                 */
-  /*                                                                       */
-  static void
-  Ins_MIN( FT_Long*  args )
-  {
-    if ( args[1] < args[0] )
-      args[0] = args[1];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MINDEX[]:     Move INDEXed element                                    */
-  /* Opcode range: 0x26                                                    */
-  /* Stack:        int32? --> StkElt                                       */
-  /*                                                                       */
-  static void
-  Ins_MINDEX( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_Long  L, K;
-
-
-    L = args[0];
-
-    if ( L <= 0 || L > exc->args )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-    }
-    else
-    {
-      K = exc->stack[exc->args - L];
-
-      FT_ARRAY_MOVE( &exc->stack[exc->args - L    ],
-                     &exc->stack[exc->args - L + 1],
-                     ( L - 1 ) );
-
-      exc->stack[exc->args - 1] = K;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* CINDEX[]:     Copy INDEXed element                                    */
-  /* Opcode range: 0x25                                                    */
-  /* Stack:        int32 --> StkElt                                        */
-  /*                                                                       */
-  static void
-  Ins_CINDEX( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_Long  L;
-
-
-    L = args[0];
-
-    if ( L <= 0 || L > exc->args )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      args[0] = 0;
-    }
-    else
-      args[0] = exc->stack[exc->args - L];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ROLL[]:       ROLL top three elements                                 */
-  /* Opcode range: 0x8A                                                    */
-  /* Stack:        3 * StkElt --> 3 * StkElt                               */
-  /*                                                                       */
-  static void
-  Ins_ROLL( FT_Long*  args )
-  {
-    FT_Long  A, B, C;
-
-
-    A = args[2];
-    B = args[1];
-    C = args[0];
-
-    args[2] = C;
-    args[1] = A;
-    args[0] = B;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MANAGING THE FLOW OF CONTROL                                          */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SLOOP[]:      Set LOOP variable                                       */
-  /* Opcode range: 0x17                                                    */
-  /* Stack:        int32? -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SLOOP( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    if ( args[0] < 0 )
-      exc->error = FT_THROW( Bad_Argument );
-    else
-      exc->GS.loop = args[0];
-  }
-
-
-  static FT_Bool
-  SkipCode( TT_ExecContext  exc )
-  {
-    exc->IP += exc->length;
-
-    if ( exc->IP < exc->codeSize )
-    {
-      exc->opcode = exc->code[exc->IP];
-
-      exc->length = opcode_length[exc->opcode];
-      if ( exc->length < 0 )
-      {
-        if ( exc->IP + 1 >= exc->codeSize )
-          goto Fail_Overflow;
-        exc->length = 2 - exc->length * exc->code[exc->IP + 1];
-      }
-
-      if ( exc->IP + exc->length <= exc->codeSize )
-        return SUCCESS;
-    }
-
-  Fail_Overflow:
-    exc->error = FT_THROW( Code_Overflow );
-    return FAILURE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* IF[]:         IF test                                                 */
-  /* Opcode range: 0x58                                                    */
-  /* Stack:        StkElt -->                                              */
-  /*                                                                       */
-  static void
-  Ins_IF( TT_ExecContext  exc,
-          FT_Long*        args )
-  {
-    FT_Int   nIfs;
-    FT_Bool  Out;
-
-
-    if ( args[0] != 0 )
-      return;
-
-    nIfs = 1;
-    Out = 0;
-
-    do
-    {
-      if ( SkipCode( exc ) == FAILURE )
-        return;
-
-      switch ( exc->opcode )
-      {
-      case 0x58:      /* IF */
-        nIfs++;
-        break;
-
-      case 0x1B:      /* ELSE */
-        Out = FT_BOOL( nIfs == 1 );
-        break;
-
-      case 0x59:      /* EIF */
-        nIfs--;
-        Out = FT_BOOL( nIfs == 0 );
-        break;
-      }
-    } while ( Out == 0 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ELSE[]:       ELSE                                                    */
-  /* Opcode range: 0x1B                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_ELSE( TT_ExecContext  exc )
-  {
-    FT_Int  nIfs;
-
-
-    nIfs = 1;
-
-    do
-    {
-      if ( SkipCode( exc ) == FAILURE )
-        return;
-
-      switch ( exc->opcode )
-      {
-      case 0x58:    /* IF */
-        nIfs++;
-        break;
-
-      case 0x59:    /* EIF */
-        nIfs--;
-        break;
-      }
-    } while ( nIfs != 0 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* EIF[]:        End IF                                                  */
-  /* Opcode range: 0x59                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_EIF( void )
-  {
-    /* nothing to do */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* JMPR[]:       JuMP Relative                                           */
-  /* Opcode range: 0x1C                                                    */
-  /* Stack:        int32 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_JMPR( TT_ExecContext  exc,
-            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 );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* JROT[]:       Jump Relative On True                                   */
-  /* Opcode range: 0x78                                                    */
-  /* Stack:        StkElt int32 -->                                        */
-  /*                                                                       */
-  static void
-  Ins_JROT( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    if ( args[1] != 0 )
-      Ins_JMPR( exc, args );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* JROF[]:       Jump Relative On False                                  */
-  /* Opcode range: 0x79                                                    */
-  /* Stack:        StkElt int32 -->                                        */
-  /*                                                                       */
-  static void
-  Ins_JROF( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    if ( args[1] == 0 )
-      Ins_JMPR( exc, args );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FDEF[]:       Function DEFinition                                     */
-  /* Opcode range: 0x2C                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_FDEF( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_ULong       n;
-    TT_DefRecord*  rec;
-    TT_DefRecord*  limit;
-
-#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 */
-                 {
-                   0x4B, /* PPEM    */
-                   0x53, /* GTEQ    */
-                   0x23, /* SWAP    */
-                   0x4B, /* PPEM    */
-                   0x51, /* LTEQ    */
-                   0x5A, /* AND     */
-                   0x58, /* IF      */
-                   0x38, /*   SHPIX */
-                   0x1B, /* ELSE    */
-                   0x21, /*   POP   */
-                   0x21, /*   POP   */
-                   0x59  /* EIF     */
-                 },
-                 /* #1 inline delta function 2 */
-                 {
-                   0x4B, /* PPEM    */
-                   0x54, /* EQ      */
-                   0x58, /* IF      */
-                   0x38, /*   SHPIX */
-                   0x1B, /* ELSE    */
-                   0x21, /*   POP   */
-                   0x21, /*   POP   */
-                   0x59  /* EIF     */
-                 },
-                 /* #2 diagonal stroke function */
-                 {
-                   0x20, /* DUP     */
-                   0x20, /* DUP     */
-                   0xB0, /* PUSHB_1 */
-                         /*   1     */
-                   0x60, /* ADD     */
-                   0x46, /* GC_cur  */
-                   0xB0, /* PUSHB_1 */
-                         /*   64    */
-                   0x23, /* SWAP    */
-                   0x42  /* WS      */
-                 },
-                 /* #3 VacuFormRound function */
-                 {
-                   0x45, /* RCVT    */
-                   0x23, /* SWAP    */
-                   0x46, /* GC_cur  */
-                   0x60, /* ADD     */
-                   0x20, /* DUP     */
-                   0xB0  /* PUSHB_1 */
-                         /*   38    */
-                 },
-                 /* #4 TTFautohint bytecode (old) */
-                 {
-                   0x20, /* DUP     */
-                   0x64, /* ABS     */
-                   0xB0, /* PUSHB_1 */
-                         /*   32    */
-                   0x60, /* ADD     */
-                   0x66, /* FLOOR   */
-                   0x23, /* SWAP    */
-                   0xB0  /* PUSHB_1 */
-                 },
-                 /* #5 spacing function 1 */
-                 {
-                   0x01, /* SVTCA_x */
-                   0xB0, /* PUSHB_1 */
-                         /*   24    */
-                   0x43, /* RS      */
-                   0x58  /* IF      */
-                 },
-                 /* #6 spacing function 2 */
-                 {
-                   0x01, /* SVTCA_x */
-                   0x18, /* RTG     */
-                   0xB0, /* PUSHB_1 */
-                         /*   24    */
-                   0x43, /* RS      */
-                   0x58  /* IF      */
-                 },
-                 /* #7 TypeMan Talk DiagEndCtrl function */
-                 {
-                   0x01, /* SVTCA_x */
-                   0x20, /* DUP     */
-                   0xB0, /* PUSHB_1 */
-                         /*   3     */
-                   0x25, /* CINDEX  */
-                 },
-                 /* #8 TypeMan Talk Align */
-                 {
-                   0x06, /* SPVTL   */
-                   0x7D, /* RDTG    */
-                 },
-               };
-    FT_UShort  opcode_patterns   = 9;
-    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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-    /* some font programs are broken enough to redefine functions! */
-    /* We will then parse the current table.                       */
-
-    rec   = exc->FDefs;
-    limit = rec + exc->numFDefs;
-    n     = (FT_ULong)args[0];
-
-    for ( ; rec < limit; rec++ )
-    {
-      if ( rec->opc == n )
-        break;
-    }
-
-    if ( rec == limit )
-    {
-      /* check that there is enough room for new functions */
-      if ( exc->numFDefs >= exc->maxFDefs )
-      {
-        exc->error = FT_THROW( Too_Many_Function_Defs );
-        return;
-      }
-      exc->numFDefs++;
-    }
-
-    /* Although FDEF takes unsigned 32-bit integer,  */
-    /* func # must be within unsigned 16-bit integer */
-    if ( n > 0xFFFFU )
-    {
-      exc->error = FT_THROW( Too_Many_Function_Defs );
-      return;
-    }
-
-    rec->range          = exc->curRange;
-    rec->opc            = (FT_UInt16)n;
-    rec->start          = exc->IP + 1;
-    rec->active         = TRUE;
-    rec->inline_delta   = FALSE;
-    rec->sph_fdef_flags = 0x0000;
-
-    if ( n > exc->maxFunc )
-      exc->maxFunc = (FT_UInt16)n;
-
-#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 )
-      rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES;
-#endif
-
-    /* Now skip the whole function definition. */
-    /* We don't allow nested IDEFS & FDEFs.    */
-
-    while ( SkipCode( exc ) == SUCCESS )
-    {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( SUBPIXEL_HINTING_INFINALITY )
-      {
-        for ( i = 0; i < opcode_patterns; i++ )
-        {
-          if ( opcode_pointer[i] < opcode_size[i]                  &&
-               exc->opcode == opcode_pattern[i][opcode_pointer[i]] )
-          {
-            opcode_pointer[i] += 1;
-
-            if ( opcode_pointer[i] == opcode_size[i] )
-            {
-              FT_TRACE6(( "sph: Function %d, opcode ptrn: %d, %s %s\n",
-                          i, n,
-                          exc->face->root.family_name,
-                          exc->face->root.style_name ));
-
-              switch ( i )
-              {
-              case 0:
-                rec->sph_fdef_flags             |= SPH_FDEF_INLINE_DELTA_1;
-                exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1;
-                break;
-
-              case 1:
-                rec->sph_fdef_flags             |= SPH_FDEF_INLINE_DELTA_2;
-                exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2;
-                break;
-
-              case 2:
-                switch ( n )
-                {
-                  /* needs to be implemented still */
-                case 58:
-                  rec->sph_fdef_flags             |= SPH_FDEF_DIAGONAL_STROKE;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE;
-                }
-                break;
-
-              case 3:
-                switch ( n )
-                {
-                case 0:
-                  rec->sph_fdef_flags             |= SPH_FDEF_VACUFORM_ROUND_1;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1;
-                }
-                break;
-
-              case 4:
-                /* probably not necessary to detect anymore */
-                rec->sph_fdef_flags             |= SPH_FDEF_TTFAUTOHINT_1;
-                exc->face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1;
-                break;
-
-              case 5:
-                switch ( n )
-                {
-                case 0:
-                case 1:
-                case 2:
-                case 4:
-                case 7:
-                case 8:
-                  rec->sph_fdef_flags             |= SPH_FDEF_SPACING_1;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_1;
-                }
-                break;
-
-              case 6:
-                switch ( n )
-                {
-                case 0:
-                case 1:
-                case 2:
-                case 4:
-                case 7:
-                case 8:
-                  rec->sph_fdef_flags             |= SPH_FDEF_SPACING_2;
-                  exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_2;
-                }
-                break;
-
-               case 7:
-                 rec->sph_fdef_flags             |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 break;
-
-               case 8:
-#if 0
-                 rec->sph_fdef_flags             |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-                 exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL;
-#endif
-                 break;
-              }
-              opcode_pointer[i] = 0;
-            }
-          }
-
-          else
-            opcode_pointer[i] = 0;
-        }
-
-        /* Set sph_compatibility_mode only when deltas are detected */
-        exc->face->sph_compatibility_mode =
-          ( ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) |
-            ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) );
-      }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      switch ( exc->opcode )
-      {
-      case 0x89:    /* IDEF */
-      case 0x2C:    /* FDEF */
-        exc->error = FT_THROW( Nested_DEFS );
-        return;
-
-      case 0x2D:   /* ENDF */
-        rec->end = exc->IP;
-        return;
-      }
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ENDF[]:       END Function definition                                 */
-  /* Opcode range: 0x2D                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_ENDF( TT_ExecContext  exc )
-  {
-    TT_CallRec*  pRec;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    exc->sph_in_func_flags = 0x0000;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    if ( exc->callTop <= 0 )     /* We encountered an ENDF without a call */
-    {
-      exc->error = FT_THROW( ENDF_In_Exec_Stream );
-      return;
-    }
-
-    exc->callTop--;
-
-    pRec = &exc->callStack[exc->callTop];
-
-    pRec->Cur_Count--;
-
-    exc->step_ins = FALSE;
-
-    if ( pRec->Cur_Count > 0 )
-    {
-      exc->callTop++;
-      exc->IP = pRec->Def->start;
-    }
-    else
-      /* Loop through the current function */
-      Ins_Goto_CodeRange( exc, pRec->Caller_Range, pRec->Caller_IP );
-
-    /* Exit the current call frame.                      */
-
-    /* NOTE: If the last instruction of a program is a   */
-    /*       CALL or LOOPCALL, the return address is     */
-    /*       always out of the code range.  This is a    */
-    /*       valid address, and it is why we do not test */
-    /*       the result of Ins_Goto_CodeRange() here!    */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* CALL[]:       CALL function                                           */
-  /* Opcode range: 0x2B                                                    */
-  /* Stack:        uint32? -->                                             */
-  /*                                                                       */
-  static void
-  Ins_CALL( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_ULong       F;
-    TT_CallRec*    pCrec;
-    TT_DefRecord*  def;
-
-
-    /* first of all, check the index */
-
-    F = (FT_ULong)args[0];
-    if ( BOUNDSL( F, exc->maxFunc + 1 ) )
-      goto Fail;
-
-    /* Except for some old Apple fonts, all functions in a TrueType */
-    /* font are defined in increasing order, starting from 0.  This */
-    /* means that we normally have                                  */
-    /*                                                              */
-    /*    exc->maxFunc+1 == exc->numFDefs                           */
-    /*    exc->FDefs[n].opc == n for n in 0..exc->maxFunc           */
-    /*                                                              */
-    /* If this isn't true, we need to look up the function table.   */
-
-    def = exc->FDefs + F;
-    if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F )
-    {
-      /* look up the FDefs table */
-      TT_DefRecord*  limit;
-
-
-      def   = exc->FDefs;
-      limit = def + exc->numFDefs;
-
-      while ( def < limit && def->opc != F )
-        def++;
-
-      if ( def == limit )
-        goto Fail;
-    }
-
-    /* check that the function is active */
-    if ( !def->active )
-      goto Fail;
-
-#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 ) ) ||
-           ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 )        ) )
-      goto Fail;
-    else
-      exc->sph_in_func_flags = def->sph_fdef_flags;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    /* check the call stack */
-    if ( exc->callTop >= exc->callSize )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    pCrec = exc->callStack + exc->callTop;
-
-    pCrec->Caller_Range = exc->curRange;
-    pCrec->Caller_IP    = exc->IP + 1;
-    pCrec->Cur_Count    = 1;
-    pCrec->Def          = def;
-
-    exc->callTop++;
-
-    Ins_Goto_CodeRange( exc, def->range, def->start );
-
-    exc->step_ins = FALSE;
-
-    return;
-
-  Fail:
-    exc->error = FT_THROW( Invalid_Reference );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* LOOPCALL[]:   LOOP and CALL function                                  */
-  /* Opcode range: 0x2A                                                    */
-  /* Stack:        uint32? Eint16? -->                                     */
-  /*                                                                       */
-  static void
-  Ins_LOOPCALL( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    FT_ULong       F;
-    TT_CallRec*    pCrec;
-    TT_DefRecord*  def;
-
-
-    /* first of all, check the index */
-    F = (FT_ULong)args[1];
-    if ( BOUNDSL( F, exc->maxFunc + 1 ) )
-      goto Fail;
-
-    /* Except for some old Apple fonts, all functions in a TrueType */
-    /* font are defined in increasing order, starting from 0.  This */
-    /* means that we normally have                                  */
-    /*                                                              */
-    /*    exc->maxFunc+1 == exc->numFDefs                           */
-    /*    exc->FDefs[n].opc == n for n in 0..exc->maxFunc           */
-    /*                                                              */
-    /* If this isn't true, we need to look up the function table.   */
-
-    def = exc->FDefs + F;
-    if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F )
-    {
-      /* look up the FDefs table */
-      TT_DefRecord*  limit;
-
-
-      def   = exc->FDefs;
-      limit = def + exc->numFDefs;
-
-      while ( def < limit && def->opc != F )
-        def++;
-
-      if ( def == limit )
-        goto Fail;
-    }
-
-    /* check that the function is active */
-    if ( !def->active )
-      goto Fail;
-
-#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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    /* check stack */
-    if ( exc->callTop >= exc->callSize )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    if ( args[0] > 0 )
-    {
-      pCrec = exc->callStack + exc->callTop;
-
-      pCrec->Caller_Range = exc->curRange;
-      pCrec->Caller_IP    = exc->IP + 1;
-      pCrec->Cur_Count    = (FT_Int)args[0];
-      pCrec->Def          = def;
-
-      exc->callTop++;
-
-      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;
-
-  Fail:
-    exc->error = FT_THROW( Invalid_Reference );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* IDEF[]:       Instruction DEFinition                                  */
-  /* Opcode range: 0x89                                                    */
-  /* Stack:        Eint8 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_IDEF( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    TT_DefRecord*  def;
-    TT_DefRecord*  limit;
-
-
-    /*  First of all, look for the same function in our table */
-
-    def   = exc->IDefs;
-    limit = def + exc->numIDefs;
-
-    for ( ; def < limit; def++ )
-      if ( def->opc == (FT_ULong)args[0] )
-        break;
-
-    if ( def == limit )
-    {
-      /* check that there is enough room for a new instruction */
-      if ( exc->numIDefs >= exc->maxIDefs )
-      {
-        exc->error = FT_THROW( Too_Many_Instruction_Defs );
-        return;
-      }
-      exc->numIDefs++;
-    }
-
-    /* opcode must be unsigned 8-bit integer */
-    if ( 0 > args[0] || args[0] > 0x00FF )
-    {
-      exc->error = FT_THROW( Too_Many_Instruction_Defs );
-      return;
-    }
-
-    def->opc    = (FT_Byte)args[0];
-    def->start  = exc->IP + 1;
-    def->range  = exc->curRange;
-    def->active = TRUE;
-
-    if ( (FT_ULong)args[0] > exc->maxIns )
-      exc->maxIns = (FT_Byte)args[0];
-
-    /* Now skip the whole function definition. */
-    /* We don't allow nested IDEFs & FDEFs.    */
-
-    while ( SkipCode( exc ) == SUCCESS )
-    {
-      switch ( exc->opcode )
-      {
-      case 0x89:   /* IDEF */
-      case 0x2C:   /* FDEF */
-        exc->error = FT_THROW( Nested_DEFS );
-        return;
-      case 0x2D:   /* ENDF */
-        def->end = exc->IP;
-        return;
-      }
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* PUSHING DATA ONTO THE INTERPRETER STACK                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NPUSHB[]:     PUSH N Bytes                                            */
-  /* Opcode range: 0x40                                                    */
-  /* Stack:        --> uint32...                                           */
-  /*                                                                       */
-  static void
-  Ins_NPUSHB( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_UShort  L, K;
-
-
-    L = (FT_UShort)exc->code[exc->IP + 1];
-
-    if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    for ( K = 1; K <= L; K++ )
-      args[K - 1] = exc->code[exc->IP + K + 1];
-
-    exc->new_top += L;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* NPUSHW[]:     PUSH N Words                                            */
-  /* Opcode range: 0x41                                                    */
-  /* Stack:        --> int32...                                            */
-  /*                                                                       */
-  static void
-  Ins_NPUSHW( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_UShort  L, K;
-
-
-    L = (FT_UShort)exc->code[exc->IP + 1];
-
-    if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    exc->IP += 2;
-
-    for ( K = 0; K < L; K++ )
-      args[K] = GetShortIns( exc );
-
-    exc->step_ins = FALSE;
-    exc->new_top += L;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* PUSHB[abc]:   PUSH Bytes                                              */
-  /* Opcode range: 0xB0-0xB7                                               */
-  /* Stack:        --> uint32...                                           */
-  /*                                                                       */
-  static void
-  Ins_PUSHB( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_UShort  L, K;
-
-
-    L = (FT_UShort)( exc->opcode - 0xB0 + 1 );
-
-    if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    for ( K = 1; K <= L; K++ )
-      args[K - 1] = exc->code[exc->IP + K];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* PUSHW[abc]:   PUSH Words                                              */
-  /* Opcode range: 0xB8-0xBF                                               */
-  /* Stack:        --> int32...                                            */
-  /*                                                                       */
-  static void
-  Ins_PUSHW( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_UShort  L, K;
-
-
-    L = (FT_UShort)( exc->opcode - 0xB8 + 1 );
-
-    if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) )
-    {
-      exc->error = FT_THROW( Stack_Overflow );
-      return;
-    }
-
-    exc->IP++;
-
-    for ( K = 0; K < L; K++ )
-      args[K] = GetShortIns( exc );
-
-    exc->step_ins = FALSE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MANAGING THE GRAPHICS STATE                                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static FT_Bool
-  Ins_SxVTL( TT_ExecContext  exc,
-             FT_UShort       aIdx1,
-             FT_UShort       aIdx2,
-             FT_UnitVector*  Vec )
-  {
-    FT_Long     A, B, C;
-    FT_Vector*  p1;
-    FT_Vector*  p2;
-
-    FT_Byte  opcode = exc->opcode;
-
-
-    if ( BOUNDS( aIdx1, exc->zp2.n_points ) ||
-         BOUNDS( aIdx2, exc->zp1.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return FAILURE;
-    }
-
-    p1 = exc->zp1.cur + aIdx2;
-    p2 = exc->zp2.cur + aIdx1;
-
-    A = p1->x - p2->x;
-    B = p1->y - p2->y;
-
-    /* If p1 == p2, SPvTL and SFvTL behave the same as */
-    /* SPvTCA[X] and SFvTCA[X], respectively.          */
-    /*                                                 */
-    /* Confirmed by Greg Hitchcock.                    */
-
-    if ( A == 0 && B == 0 )
-    {
-      A      = 0x4000;
-      opcode = 0;
-    }
-
-    if ( ( opcode & 1 ) != 0 )
-    {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
-    }
-
-    Normalize( A, B, Vec );
-
-    return SUCCESS;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SVTCA[a]:     Set (F and P) Vectors to Coordinate Axis                */
-  /* Opcode range: 0x00-0x01                                               */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  /* SPvTCA[a]:    Set PVector to Coordinate Axis                          */
-  /* Opcode range: 0x02-0x03                                               */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  /* SFvTCA[a]:    Set FVector to Coordinate Axis                          */
-  /* Opcode range: 0x04-0x05                                               */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_SxyTCA( TT_ExecContext  exc )
-  {
-    FT_Short  AA, BB;
-
-    FT_Byte  opcode = exc->opcode;
-
-
-    AA = (FT_Short)( ( opcode & 1 ) << 14 );
-    BB = (FT_Short)( AA ^ 0x4000 );
-
-    if ( opcode < 4 )
-    {
-      exc->GS.projVector.x = AA;
-      exc->GS.projVector.y = BB;
-
-      exc->GS.dualVector.x = AA;
-      exc->GS.dualVector.y = BB;
-    }
-
-    if ( ( opcode & 2 ) == 0 )
-    {
-      exc->GS.freeVector.x = AA;
-      exc->GS.freeVector.y = BB;
-    }
-
-    Compute_Funcs( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SPvTL[a]:     Set PVector To Line                                     */
-  /* Opcode range: 0x06-0x07                                               */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_SPVTL( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    if ( Ins_SxVTL( exc,
-                    (FT_UShort)args[1],
-                    (FT_UShort)args[0],
-                    &exc->GS.projVector ) == SUCCESS )
-    {
-      exc->GS.dualVector = exc->GS.projVector;
-      Compute_Funcs( exc );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SFvTL[a]:     Set FVector To Line                                     */
-  /* Opcode range: 0x08-0x09                                               */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_SFVTL( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    if ( Ins_SxVTL( exc,
-                    (FT_UShort)args[1],
-                    (FT_UShort)args[0],
-                    &exc->GS.freeVector ) == SUCCESS )
-    {
-      Compute_Funcs( exc );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SFvTPv[]:     Set FVector To PVector                                  */
-  /* Opcode range: 0x0E                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_SFVTPV( TT_ExecContext  exc )
-  {
-    exc->GS.freeVector = exc->GS.projVector;
-    Compute_Funcs( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SPvFS[]:      Set PVector From Stack                                  */
-  /* Opcode range: 0x0A                                                    */
-  /* Stack:        f2.14 f2.14 -->                                         */
-  /*                                                                       */
-  static void
-  Ins_SPVFS( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_Short  S;
-    FT_Long   X, Y;
-
-
-    /* Only use low 16bits, then sign extend */
-    S = (FT_Short)args[1];
-    Y = (FT_Long)S;
-    S = (FT_Short)args[0];
-    X = (FT_Long)S;
-
-    Normalize( X, Y, &exc->GS.projVector );
-
-    exc->GS.dualVector = exc->GS.projVector;
-    Compute_Funcs( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SFvFS[]:      Set FVector From Stack                                  */
-  /* Opcode range: 0x0B                                                    */
-  /* Stack:        f2.14 f2.14 -->                                         */
-  /*                                                                       */
-  static void
-  Ins_SFVFS( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_Short  S;
-    FT_Long   X, Y;
-
-
-    /* Only use low 16bits, then sign extend */
-    S = (FT_Short)args[1];
-    Y = (FT_Long)S;
-    S = (FT_Short)args[0];
-    X = S;
-
-    Normalize( X, Y, &exc->GS.freeVector );
-    Compute_Funcs( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GPv[]:        Get Projection Vector                                   */
-  /* Opcode range: 0x0C                                                    */
-  /* Stack:        ef2.14 --> ef2.14                                       */
-  /*                                                                       */
-  static void
-  Ins_GPV( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    args[0] = exc->GS.projVector.x;
-    args[1] = exc->GS.projVector.y;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GFv[]:        Get Freedom Vector                                      */
-  /* Opcode range: 0x0D                                                    */
-  /* Stack:        ef2.14 --> ef2.14                                       */
-  /*                                                                       */
-  static void
-  Ins_GFV( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    args[0] = exc->GS.freeVector.x;
-    args[1] = exc->GS.freeVector.y;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SRP0[]:       Set Reference Point 0                                   */
-  /* Opcode range: 0x10                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SRP0( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    exc->GS.rp0 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SRP1[]:       Set Reference Point 1                                   */
-  /* Opcode range: 0x11                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SRP1( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    exc->GS.rp1 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SRP2[]:       Set Reference Point 2                                   */
-  /* Opcode range: 0x12                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SRP2( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    exc->GS.rp2 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SMD[]:        Set Minimum Distance                                    */
-  /* Opcode range: 0x1A                                                    */
-  /* Stack:        f26.6 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_SMD( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    exc->GS.minimum_distance = args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SCVTCI[]:     Set Control Value Table Cut In                          */
-  /* Opcode range: 0x1D                                                    */
-  /* Stack:        f26.6 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_SCVTCI( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    exc->GS.control_value_cutin = (FT_F26Dot6)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SSWCI[]:      Set Single Width Cut In                                 */
-  /* Opcode range: 0x1E                                                    */
-  /* Stack:        f26.6 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_SSWCI( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    exc->GS.single_width_cutin = (FT_F26Dot6)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SSW[]:        Set Single Width                                        */
-  /* Opcode range: 0x1F                                                    */
-  /* Stack:        int32? -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SSW( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    exc->GS.single_width_value = FT_MulFix( args[0],
-                                            exc->tt_metrics.scale );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLIPON[]:     Set auto-FLIP to ON                                     */
-  /* Opcode range: 0x4D                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_FLIPON( TT_ExecContext  exc )
-  {
-    exc->GS.auto_flip = TRUE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLIPOFF[]:    Set auto-FLIP to OFF                                    */
-  /* Opcode range: 0x4E                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_FLIPOFF( TT_ExecContext  exc )
-  {
-    exc->GS.auto_flip = FALSE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SANGW[]:      Set ANGle Weight                                        */
-  /* Opcode range: 0x7E                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SANGW( void )
-  {
-    /* instruction not supported anymore */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SDB[]:        Set Delta Base                                          */
-  /* Opcode range: 0x5E                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SDB( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    exc->GS.delta_base = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SDS[]:        Set Delta Shift                                         */
-  /* Opcode range: 0x5F                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SDS( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    if ( (FT_ULong)args[0] > 6UL )
-      exc->error = FT_THROW( Bad_Argument );
-    else
-      exc->GS.delta_shift = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RTHG[]:       Round To Half Grid                                      */
-  /* Opcode range: 0x19                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_RTHG( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_To_Half_Grid;
-    exc->func_round     = (TT_Round_Func)Round_To_Half_Grid;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RTG[]:        Round To Grid                                           */
-  /* Opcode range: 0x18                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_RTG( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_To_Grid;
-    exc->func_round     = (TT_Round_Func)Round_To_Grid;
-  }
-
-
-  /*************************************************************************/
-  /* RTDG[]:       Round To Double Grid                                    */
-  /* Opcode range: 0x3D                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_RTDG( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_To_Double_Grid;
-    exc->func_round     = (TT_Round_Func)Round_To_Double_Grid;
-  }
-
-
-  /*************************************************************************/
-  /* RUTG[]:       Round Up To Grid                                        */
-  /* Opcode range: 0x7C                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_RUTG( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_Up_To_Grid;
-    exc->func_round     = (TT_Round_Func)Round_Up_To_Grid;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RDTG[]:       Round Down To Grid                                      */
-  /* Opcode range: 0x7D                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_RDTG( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_Down_To_Grid;
-    exc->func_round     = (TT_Round_Func)Round_Down_To_Grid;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ROFF[]:       Round OFF                                               */
-  /* Opcode range: 0x7A                                                    */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_ROFF( TT_ExecContext  exc )
-  {
-    exc->GS.round_state = TT_Round_Off;
-    exc->func_round     = (TT_Round_Func)Round_None;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SROUND[]:     Super ROUND                                             */
-  /* Opcode range: 0x76                                                    */
-  /* Stack:        Eint8 -->                                               */
-  /*                                                                       */
-  static void
-  Ins_SROUND( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    SetSuperRound( exc, 0x4000, args[0] );
-
-    exc->GS.round_state = TT_Round_Super;
-    exc->func_round     = (TT_Round_Func)Round_Super;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* S45ROUND[]:   Super ROUND 45 degrees                                  */
-  /* Opcode range: 0x77                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_S45ROUND( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    SetSuperRound( exc, 0x2D41, args[0] );
-
-    exc->GS.round_state = TT_Round_Super_45;
-    exc->func_round     = (TT_Round_Func)Round_Super_45;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GC[a]:        Get Coordinate projected onto                           */
-  /* Opcode range: 0x46-0x47                                               */
-  /* Stack:        uint32 --> f26.6                                        */
-  /*                                                                       */
-  /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken     */
-  /*      along the dual projection vector!                                */
-  /*                                                                       */
-  static void
-  Ins_GC( TT_ExecContext  exc,
-          FT_Long*        args )
-  {
-    FT_ULong    L;
-    FT_F26Dot6  R;
-
-
-    L = (FT_ULong)args[0];
-
-    if ( BOUNDSL( L, exc->zp2.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      R = 0;
-    }
-    else
-    {
-      if ( exc->opcode & 1 )
-        R = FAST_DUALPROJ( &exc->zp2.org[L] );
-      else
-        R = FAST_PROJECT( &exc->zp2.cur[L] );
-    }
-
-    args[0] = R;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SCFS[]:       Set Coordinate From Stack                               */
-  /* Opcode range: 0x48                                                    */
-  /* Stack:        f26.6 uint32 -->                                        */
-  /*                                                                       */
-  /* Formula:                                                              */
-  /*                                                                       */
-  /*   OA := OA + ( value - OA.p )/( f.p ) * f                             */
-  /*                                                                       */
-  static void
-  Ins_SCFS( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_Long    K;
-    FT_UShort  L;
-
-
-    L = (FT_UShort)args[0];
-
-    if ( BOUNDS( L, exc->zp2.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    K = FAST_PROJECT( &exc->zp2.cur[L] );
-
-    exc->func_move( exc, &exc->zp2, L, args[1] - K );
-
-    /* UNDOCUMENTED!  The MS rasterizer does that with */
-    /* twilight points (confirmed by Greg Hitchcock)   */
-    if ( exc->GS.gep2 == 0 )
-      exc->zp2.org[L] = exc->zp2.cur[L];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MD[a]:        Measure Distance                                        */
-  /* Opcode range: 0x49-0x4A                                               */
-  /* Stack:        uint32 uint32 --> f26.6                                 */
-  /*                                                                       */
-  /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along  */
-  /*                    the dual projection vector.                        */
-  /*                                                                       */
-  /* XXX: UNDOCUMENTED: Flag attributes are inverted!                      */
-  /*                      0 => measure distance in original outline        */
-  /*                      1 => measure distance in grid-fitted outline     */
-  /*                                                                       */
-  /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1!                   */
-  /*                                                                       */
-  static void
-  Ins_MD( TT_ExecContext  exc,
-          FT_Long*        args )
-  {
-    FT_UShort   K, L;
-    FT_F26Dot6  D;
-
-
-    K = (FT_UShort)args[1];
-    L = (FT_UShort)args[0];
-
-    if ( BOUNDS( L, exc->zp0.n_points ) ||
-         BOUNDS( K, exc->zp1.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      D = 0;
-    }
-    else
-    {
-      if ( exc->opcode & 1 )
-        D = PROJECT( exc->zp0.cur + L, exc->zp1.cur + K );
-      else
-      {
-        /* XXX: UNDOCUMENTED: twilight zone special case */
-
-        if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 )
-        {
-          FT_Vector*  vec1 = exc->zp0.org + L;
-          FT_Vector*  vec2 = exc->zp1.org + K;
-
-
-          D = DUALPROJ( vec1, vec2 );
-        }
-        else
-        {
-          FT_Vector*  vec1 = exc->zp0.orus + L;
-          FT_Vector*  vec2 = exc->zp1.orus + K;
-
-
-          if ( exc->metrics.x_scale == exc->metrics.y_scale )
-          {
-            /* this should be faster */
-            D = DUALPROJ( vec1, vec2 );
-            D = FT_MulFix( D, exc->metrics.x_scale );
-          }
-          else
-          {
-            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 );
-
-            D = FAST_DUALPROJ( &vec );
-          }
-        }
-      }
-    }
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         exc->ignore_x_mode          &&
-         FT_ABS( D ) == 64           )
-      D += 1;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    args[0] = D;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SDPvTL[a]:    Set Dual PVector to Line                                */
-  /* Opcode range: 0x86-0x87                                               */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_SDPVTL( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_Long    A, B, C;
-    FT_UShort  p1, p2;            /* was FT_Int in pas type ERROR */
-
-    FT_Byte  opcode = exc->opcode;
-
-
-    p1 = (FT_UShort)args[1];
-    p2 = (FT_UShort)args[0];
-
-    if ( BOUNDS( p2, exc->zp1.n_points ) ||
-         BOUNDS( p1, exc->zp2.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    {
-      FT_Vector* v1 = exc->zp1.org + p2;
-      FT_Vector* v2 = exc->zp2.org + p1;
-
-
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
-
-      /* If v1 == v2, SDPvTL behaves the same as */
-      /* SVTCA[X], respectively.                 */
-      /*                                         */
-      /* Confirmed by Greg Hitchcock.            */
-
-      if ( A == 0 && B == 0 )
-      {
-        A      = 0x4000;
-        opcode = 0;
-      }
-    }
-
-    if ( ( opcode & 1 ) != 0 )
-    {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
-    }
-
-    Normalize( A, B, &exc->GS.dualVector );
-
-    {
-      FT_Vector*  v1 = exc->zp1.cur + p2;
-      FT_Vector*  v2 = exc->zp2.cur + p1;
-
-
-      A = v1->x - v2->x;
-      B = v1->y - v2->y;
-
-      if ( A == 0 && B == 0 )
-      {
-        A      = 0x4000;
-        opcode = 0;
-      }
-    }
-
-    if ( ( opcode & 1 ) != 0 )
-    {
-      C =  B;   /* counter clockwise rotation */
-      B =  A;
-      A = -C;
-    }
-
-    Normalize( A, B, &exc->GS.projVector );
-    Compute_Funcs( exc );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SZP0[]:       Set Zone Pointer 0                                      */
-  /* Opcode range: 0x13                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SZP0( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    switch ( (FT_Int)args[0] )
-    {
-    case 0:
-      exc->zp0 = exc->twilight;
-      break;
-
-    case 1:
-      exc->zp0 = exc->pts;
-      break;
-
-    default:
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    exc->GS.gep0 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SZP1[]:       Set Zone Pointer 1                                      */
-  /* Opcode range: 0x14                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SZP1( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    switch ( (FT_Int)args[0] )
-    {
-    case 0:
-      exc->zp1 = exc->twilight;
-      break;
-
-    case 1:
-      exc->zp1 = exc->pts;
-      break;
-
-    default:
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    exc->GS.gep1 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SZP2[]:       Set Zone Pointer 2                                      */
-  /* Opcode range: 0x15                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SZP2( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    switch ( (FT_Int)args[0] )
-    {
-    case 0:
-      exc->zp2 = exc->twilight;
-      break;
-
-    case 1:
-      exc->zp2 = exc->pts;
-      break;
-
-    default:
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    exc->GS.gep2 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SZPS[]:       Set Zone PointerS                                       */
-  /* Opcode range: 0x16                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SZPS( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    switch ( (FT_Int)args[0] )
-    {
-    case 0:
-      exc->zp0 = exc->twilight;
-      break;
-
-    case 1:
-      exc->zp0 = exc->pts;
-      break;
-
-    default:
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    exc->zp1 = exc->zp0;
-    exc->zp2 = exc->zp0;
-
-    exc->GS.gep0 = (FT_UShort)args[0];
-    exc->GS.gep1 = (FT_UShort)args[0];
-    exc->GS.gep2 = (FT_UShort)args[0];
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* INSTCTRL[]:   INSTruction ConTRoL                                     */
-  /* Opcode range: 0x8E                                                    */
-  /* Stack:        int32 int32 -->                                         */
-  /*                                                                       */
-  static void
-  Ins_INSTCTRL( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    FT_ULong  K, L, Kf;
-
-
-    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 */
-    if ( K < 1 || K > 3 )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    /* convert index to flag value */
-    Kf = 1 << ( K - 1 );
-
-    if ( L != 0 )
-    {
-      /* arguments to selectors look like flag values */
-      if ( L != Kf )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Invalid_Reference );
-        return;
-      }
-    }
-
-    exc->GS.instruct_control &= ~(FT_Byte)Kf;
-    exc->GS.instruct_control |= (FT_Byte)L;
-
-    if ( K == 3 )
-    {
-#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 backwards */
-      /* 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->backwards_compatibility = !FT_BOOL( L == 4 );
-#endif
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SCANCTRL[]:   SCAN ConTRoL                                            */
-  /* Opcode range: 0x85                                                    */
-  /* Stack:        uint32? -->                                             */
-  /*                                                                       */
-  static void
-  Ins_SCANCTRL( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    FT_Int  A;
-
-
-    /* Get Threshold */
-    A = (FT_Int)( args[0] & 0xFF );
-
-    if ( A == 0xFF )
-    {
-      exc->GS.scan_control = TRUE;
-      return;
-    }
-    else if ( A == 0 )
-    {
-      exc->GS.scan_control = FALSE;
-      return;
-    }
-
-    if ( ( args[0] & 0x100 ) != 0 && exc->tt_metrics.ppem <= A )
-      exc->GS.scan_control = TRUE;
-
-    if ( ( args[0] & 0x200 ) != 0 && exc->tt_metrics.rotated )
-      exc->GS.scan_control = TRUE;
-
-    if ( ( args[0] & 0x400 ) != 0 && exc->tt_metrics.stretched )
-      exc->GS.scan_control = TRUE;
-
-    if ( ( args[0] & 0x800 ) != 0 && exc->tt_metrics.ppem > A )
-      exc->GS.scan_control = FALSE;
-
-    if ( ( args[0] & 0x1000 ) != 0 && exc->tt_metrics.rotated )
-      exc->GS.scan_control = FALSE;
-
-    if ( ( args[0] & 0x2000 ) != 0 && exc->tt_metrics.stretched )
-      exc->GS.scan_control = FALSE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SCANTYPE[]:   SCAN TYPE                                               */
-  /* Opcode range: 0x8D                                                    */
-  /* Stack:        uint16 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SCANTYPE( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    if ( args[0] >= 0 )
-      exc->GS.scan_type = (FT_Int)args[0] & 0xFFFF;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MANAGING OUTLINES                                                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLIPPT[]:     FLIP PoinT                                              */
-  /* Opcode range: 0x80                                                    */
-  /* Stack:        uint32... -->                                           */
-  /*                                                                       */
-  static void
-  Ins_FLIPPT( TT_ExecContext  exc )
-  {
-    FT_UShort  point;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* See `ttinterp.h' for details on backwards compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL     &&
-         exc->backwards_compatibility &&
-         exc->iupx_called             &&
-         exc->iupy_called             )
-      goto Fail;
-#endif
-
-    if ( exc->top < exc->GS.loop )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Too_Few_Arguments );
-      goto Fail;
-    }
-
-    while ( exc->GS.loop > 0 )
-    {
-      exc->args--;
-
-      point = (FT_UShort)exc->stack[exc->args];
-
-      if ( BOUNDS( point, exc->pts.n_points ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-      }
-      else
-        exc->pts.tags[point] ^= FT_CURVE_TAG_ON;
-
-      exc->GS.loop--;
-    }
-
-  Fail:
-    exc->GS.loop = 1;
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLIPRGON[]:   FLIP RanGe ON                                           */
-  /* Opcode range: 0x81                                                    */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_FLIPRGON( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    FT_UShort  I, K, L;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* See `ttinterp.h' for details on backwards compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL     &&
-         exc->backwards_compatibility &&
-         exc->iupx_called             &&
-         exc->iupy_called             )
-      return;
-#endif
-
-    K = (FT_UShort)args[1];
-    L = (FT_UShort)args[0];
-
-    if ( BOUNDS( K, exc->pts.n_points ) ||
-         BOUNDS( L, exc->pts.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    for ( I = L; I <= K; I++ )
-      exc->pts.tags[I] |= FT_CURVE_TAG_ON;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* FLIPRGOFF:    FLIP RanGe OFF                                          */
-  /* Opcode range: 0x82                                                    */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_FLIPRGOFF( TT_ExecContext  exc,
-                 FT_Long*        args )
-  {
-    FT_UShort  I, K, L;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* See `ttinterp.h' for details on backwards compatibility mode. */
-    if ( SUBPIXEL_HINTING_MINIMAL     &&
-         exc->backwards_compatibility &&
-         exc->iupx_called             &&
-         exc->iupy_called             )
-      return;
-#endif
-
-    K = (FT_UShort)args[1];
-    L = (FT_UShort)args[0];
-
-    if ( BOUNDS( K, exc->pts.n_points ) ||
-         BOUNDS( L, exc->pts.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    for ( I = L; I <= K; I++ )
-      exc->pts.tags[I] &= ~FT_CURVE_TAG_ON;
-  }
-
-
-  static FT_Bool
-  Compute_Point_Displacement( TT_ExecContext  exc,
-                              FT_F26Dot6*     x,
-                              FT_F26Dot6*     y,
-                              TT_GlyphZone    zone,
-                              FT_UShort*      refp )
-  {
-    TT_GlyphZoneRec  zp;
-    FT_UShort        p;
-    FT_F26Dot6       d;
-
-
-    if ( exc->opcode & 1 )
-    {
-      zp = exc->zp0;
-      p  = exc->GS.rp1;
-    }
-    else
-    {
-      zp = exc->zp1;
-      p  = exc->GS.rp2;
-    }
-
-    if ( BOUNDS( p, zp.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      *refp = 0;
-      return FAILURE;
-    }
-
-    *zone = zp;
-    *refp = p;
-
-    d = PROJECT( zp.cur + p, zp.org + 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 backwards compatibility mode. */
-  static void
-  Move_Zp2_Point( TT_ExecContext  exc,
-                  FT_UShort       point,
-                  FT_F26Dot6      dx,
-                  FT_F26Dot6      dy,
-                  FT_Bool         touch )
-  {
-    if ( exc->GS.freeVector.x != 0 )
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL     &&
-              exc->backwards_compatibility ) )
-#endif
-        exc->zp2.cur[point].x += dx;
-
-      if ( touch )
-        exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X;
-    }
-
-    if ( exc->GS.freeVector.y != 0 )
-    {
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( !( SUBPIXEL_HINTING_MINIMAL     &&
-              exc->backwards_compatibility &&
-              exc->iupx_called             &&
-              exc->iupy_called             ) )
-#endif
-        exc->zp2.cur[point].y += dy;
-
-      if ( touch )
-        exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SHP[a]:       SHift Point by the last point                           */
-  /* Opcode range: 0x32-0x33                                               */
-  /* Stack:        uint32... -->                                           */
-  /*                                                                       */
-  static void
-  Ins_SHP( TT_ExecContext  exc )
-  {
-    TT_GlyphZoneRec  zp;
-    FT_UShort        refp;
-
-    FT_F26Dot6       dx, dy;
-    FT_UShort        point;
-
-
-    if ( exc->top < exc->GS.loop )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
-      return;
-
-    while ( exc->GS.loop > 0 )
-    {
-      exc->args--;
-      point = (FT_UShort)exc->stack[exc->args];
-
-      if ( BOUNDS( point, exc->zp2.n_points ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-      }
-      else
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* doesn't follow Cleartype spec but produces better result */
-      if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode )
-        Move_Zp2_Point( exc, point, 0, dy, TRUE );
-      else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-        Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-      exc->GS.loop--;
-    }
-
-  Fail:
-    exc->GS.loop = 1;
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SHC[a]:       SHift Contour                                           */
-  /* Opcode range: 0x34-35                                                 */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual)     */
-  /*               contour in the twilight zone, namely contour number     */
-  /*               zero which includes all points of it.                   */
-  /*                                                                       */
-  static void
-  Ins_SHC( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    TT_GlyphZoneRec  zp;
-    FT_UShort        refp;
-    FT_F26Dot6       dx, dy;
-
-    FT_Short         contour, bounds;
-    FT_UShort        start, limit, i;
-
-
-    contour = (FT_Short)args[0];
-    bounds  = ( exc->GS.gep2 == 0 ) ? 1 : exc->zp2.n_contours;
-
-    if ( BOUNDS( contour, bounds ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
-      return;
-
-    if ( contour == 0 )
-      start = 0;
-    else
-      start = (FT_UShort)( exc->zp2.contours[contour - 1] + 1 -
-                           exc->zp2.first_point );
-
-    /* we use the number of points if in the twilight zone */
-    if ( exc->GS.gep2 == 0 )
-      limit = exc->zp2.n_points;
-    else
-      limit = (FT_UShort)( exc->zp2.contours[contour] -
-                           exc->zp2.first_point + 1 );
-
-    for ( i = start; i < limit; i++ )
-    {
-      if ( zp.cur != exc->zp2.cur || refp != i )
-        Move_Zp2_Point( exc, i, dx, dy, TRUE );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SHZ[a]:       SHift Zone                                              */
-  /* Opcode range: 0x36-37                                                 */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_SHZ( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    TT_GlyphZoneRec  zp;
-    FT_UShort        refp;
-    FT_F26Dot6       dx,
-                     dy;
-
-    FT_UShort        limit, i;
-
-
-    if ( BOUNDS( args[0], 2 ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) )
-      return;
-
-    /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points.     */
-    /*      Twilight zone has no real contours, so use `n_points'. */
-    /*      Normal zone's `n_points' includes phantoms, so must    */
-    /*      use end of last contour.                               */
-    if ( exc->GS.gep2 == 0 )
-      limit = (FT_UShort)exc->zp2.n_points;
-    else if ( exc->GS.gep2 == 1 && exc->zp2.n_contours > 0 )
-      limit = (FT_UShort)( exc->zp2.contours[exc->zp2.n_contours - 1] + 1 );
-    else
-      limit = 0;
-
-    /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */
-    for ( i = 0; i < limit; i++ )
-    {
-      if ( zp.cur != exc->zp2.cur || refp != i )
-        Move_Zp2_Point( exc, i, dx, dy, FALSE );
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* SHPIX[]:      SHift points by a PIXel amount                          */
-  /* Opcode range: 0x38                                                    */
-  /* Stack:        f26.6 uint32... -->                                     */
-  /*                                                                       */
-  static void
-  Ins_SHPIX( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_F26Dot6  dx, dy;
-    FT_UShort   point;
-#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 )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    dx = TT_MulFix14( args[0], exc->GS.freeVector.x );
-    dy = TT_MulFix14( args[0], exc->GS.freeVector.y );
-
-    while ( exc->GS.loop > 0 )
-    {
-      exc->args--;
-
-      point = (FT_UShort)exc->stack[exc->args];
-
-      if ( BOUNDS( point, exc->zp2.n_points ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-      }
-      else
-#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.              */
-        /*  If using ignore_x_mode rendering, allow ZP2 point move if:   */
-        /*   - freedom vector is y and sph_compatibility_mode is off     */
-        /*   - the glyph is composite and the move is in the Y direction */
-        /*   - the glyph is specifically set to allow SHPIX moves        */
-        /*   - the move is on a previously Y-touched point               */
-
-        if ( exc->ignore_x_mode )
-        {
-          /* save point for later comparison */
-          if ( exc->GS.freeVector.y != 0 )
-            B1 = exc->zp2.cur[point].y;
-          else
-            B1 = exc->zp2.cur[point].x;
-
-          if ( !exc->face->sph_compatibility_mode &&
-               exc->GS.freeVector.y != 0          )
-          {
-            Move_Zp2_Point( exc, point, dx, dy, TRUE );
-
-            /* save new point */
-            if ( exc->GS.freeVector.y != 0 )
-            {
-              B2 = exc->zp2.cur[point].y;
-
-              /* reverse any disallowed moves */
-              if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
-                   ( B1 & 63 ) != 0                                           &&
-                   ( B2 & 63 ) != 0                                           &&
-                   B1 != B2                                                   )
-                Move_Zp2_Point( exc, point, -dx, -dy, TRUE );
-            }
-          }
-          else if ( exc->face->sph_compatibility_mode )
-          {
-            if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
-            {
-              dx = FT_PIX_ROUND( B1 + dx ) - B1;
-              dy = FT_PIX_ROUND( B1 + dy ) - B1;
-            }
-
-            /* skip post-iup deltas */
-            if ( exc->iup_called                                          &&
-                 ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) ||
-                   ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) )
-              goto Skip;
-
-            if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) &&
-                  ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) ||
-                    ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y )    ||
-                    ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX )      )  )
-              Move_Zp2_Point( exc, point, 0, dy, TRUE );
-
-            /* save new point */
-            if ( exc->GS.freeVector.y != 0 )
-            {
-              B2 = exc->zp2.cur[point].y;
-
-              /* reverse any disallowed moves */
-              if ( ( B1 & 63 ) == 0 &&
-                   ( B2 & 63 ) != 0 &&
-                   B1 != B2         )
-                Move_Zp2_Point( exc, point, 0, -dy, TRUE );
-            }
-          }
-          else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL )
-            Move_Zp2_Point( exc, point, dx, dy, TRUE );
-        }
-        else
-          Move_Zp2_Point( exc, point, dx, dy, TRUE );
-      }
-      else
-#endif
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-      if ( SUBPIXEL_HINTING_MINIMAL     &&
-           exc->backwards_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 severly 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:
-#endif
-      exc->GS.loop--;
-    }
-
-  Fail:
-    exc->GS.loop = 1;
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MSIRP[a]:     Move Stack Indirect Relative Position                   */
-  /* Opcode range: 0x3A-0x3B                                               */
-  /* Stack:        f26.6 uint32 -->                                        */
-  /*                                                                       */
-  static void
-  Ins_MSIRP( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_UShort   point = 0;
-    FT_F26Dot6  distance;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    FT_F26Dot6  control_value_cutin = 0;
-
-
-    if ( SUBPIXEL_HINTING_INFINALITY )
-    {
-      control_value_cutin = exc->GS.control_value_cutin;
-
-      if ( exc->ignore_x_mode                                 &&
-           exc->GS.freeVector.x != 0                          &&
-           !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) )
-        control_value_cutin = 0;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    point = (FT_UShort)args[0];
-
-    if ( BOUNDS( point,       exc->zp1.n_points ) ||
-         BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    /* UNDOCUMENTED!  The MS rasterizer does that with */
-    /* twilight points (confirmed by Greg Hitchcock)   */
-    if ( exc->GS.gep1 == 0 )
-    {
-      exc->zp1.org[point] = exc->zp0.org[exc->GS.rp0];
-      exc->func_move_orig( exc, &exc->zp1, point, args[1] );
-      exc->zp1.cur[point] = exc->zp1.org[point];
-    }
-
-    distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /* subpixel hinting - make MSIRP respect CVT cut-in; */
-    if ( SUBPIXEL_HINTING_INFINALITY                         &&
-         exc->ignore_x_mode                                  &&
-         exc->GS.freeVector.x != 0                           &&
-         FT_ABS( distance - args[1] ) >= control_value_cutin )
-      distance = args[1];
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    exc->func_move( exc, &exc->zp1, point, args[1] - distance );
-
-    exc->GS.rp1 = exc->GS.rp0;
-    exc->GS.rp2 = point;
-
-    if ( ( exc->opcode & 1 ) != 0 )
-      exc->GS.rp0 = point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MDAP[a]:      Move Direct Absolute Point                              */
-  /* Opcode range: 0x2E-0x2F                                               */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_MDAP( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_UShort   point;
-    FT_F26Dot6  cur_dist;
-    FT_F26Dot6  distance;
-
-
-    point = (FT_UShort)args[0];
-
-    if ( BOUNDS( point, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    if ( ( exc->opcode & 1 ) != 0 )
-    {
-      cur_dist = FAST_PROJECT( &exc->zp0.cur[point] );
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      if ( SUBPIXEL_HINTING_INFINALITY &&
-           exc->ignore_x_mode          &&
-           exc->GS.freeVector.x != 0   )
-        distance = 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;
-    }
-    else
-      distance = 0;
-
-    exc->func_move( exc, &exc->zp0, point, distance );
-
-    exc->GS.rp0 = point;
-    exc->GS.rp1 = point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MIAP[a]:      Move Indirect Absolute Point                            */
-  /* Opcode range: 0x3E-0x3F                                               */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_MIAP( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_ULong    cvtEntry;
-    FT_UShort   point;
-    FT_F26Dot6  distance;
-    FT_F26Dot6  org_dist;
-    FT_F26Dot6  control_value_cutin;
-
-
-    control_value_cutin = exc->GS.control_value_cutin;
-    cvtEntry            = (FT_ULong)args[1];
-    point               = (FT_UShort)args[0];
-
-#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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    if ( BOUNDS( point,     exc->zp0.n_points ) ||
-         BOUNDSL( cvtEntry, exc->cvtSize )      )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    /* UNDOCUMENTED!                                                      */
-    /*                                                                    */
-    /* The behaviour of an MIAP instruction is quite different when used  */
-    /* in the twilight zone.                                              */
-    /*                                                                    */
-    /* First, no control value cut-in test is performed as it would fail  */
-    /* anyway.  Second, the original point, i.e. (org_x,org_y) of         */
-    /* zp0.point, is set to the absolute, unrounded distance found in the */
-    /* CVT.                                                               */
-    /*                                                                    */
-    /* This is used in the CVT programs of the Microsoft fonts Arial,     */
-    /* Times, etc., in order to re-adjust some key font heights.  It      */
-    /* allows the use of the IP instruction in the twilight zone, which   */
-    /* otherwise would be invalid according to the specification.         */
-    /*                                                                    */
-    /* We implement it with a special sequence for the twilight zone.     */
-    /* This is a bad hack, but it seems to work.                          */
-    /*                                                                    */
-    /* Confirmed by Greg Hitchcock.                                       */
-
-    distance = exc->func_read_cvt( exc, cvtEntry );
-
-    if ( exc->GS.gep0 == 0 )   /* If in twilight zone */
-    {
-#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_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_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_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 )
-        distance = org_dist;
-
-#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] );
-      else
-#endif
-        distance = exc->func_round( exc,
-                                    distance,
-                                    exc->tt_metrics.compensations[0] );
-    }
-
-    exc->func_move( exc, &exc->zp0, point, distance - org_dist );
-
-  Fail:
-    exc->GS.rp0 = point;
-    exc->GS.rp1 = point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MDRP[abcde]:  Move Direct Relative Point                              */
-  /* Opcode range: 0xC0-0xDF                                               */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_MDRP( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_UShort   point = 0;
-    FT_F26Dot6  org_dist, distance, minimum_distance;
-
-
-    minimum_distance = exc->GS.minimum_distance;
-
-#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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    point = (FT_UShort)args[0];
-
-    if ( BOUNDS( point,       exc->zp1.n_points ) ||
-         BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    /* XXX: Is there some undocumented feature while in the */
-    /*      twilight zone?                                  */
-
-    /* XXX: UNDOCUMENTED: twilight zone special case */
-
-    if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 )
-    {
-      FT_Vector*  vec1 = &exc->zp1.org[point];
-      FT_Vector*  vec2 = &exc->zp0.org[exc->GS.rp0];
-
-
-      org_dist = DUALPROJ( vec1, vec2 );
-    }
-    else
-    {
-      FT_Vector*  vec1 = &exc->zp1.orus[point];
-      FT_Vector*  vec2 = &exc->zp0.orus[exc->GS.rp0];
-
-
-      if ( exc->metrics.x_scale == exc->metrics.y_scale )
-      {
-        /* this should be faster */
-        org_dist = DUALPROJ( vec1, vec2 );
-        org_dist = FT_MulFix( org_dist, exc->metrics.x_scale );
-      }
-      else
-      {
-        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 );
-
-        org_dist = FAST_DUALPROJ( &vec );
-      }
-    }
-
-    /* single width cut-in test */
-
-    if ( FT_ABS( org_dist - exc->GS.single_width_value ) <
-         exc->GS.single_width_cutin )
-    {
-      if ( org_dist >= 0 )
-        org_dist = exc->GS.single_width_value;
-      else
-        org_dist = -exc->GS.single_width_value;
-    }
-
-    /* round flag */
-
-    if ( ( exc->opcode & 4 ) != 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,
-                     exc->tt_metrics.compensations[exc->opcode & 3] );
-      else
-#endif
-        distance = exc->func_round(
-                     exc,
-                     org_dist,
-                     exc->tt_metrics.compensations[exc->opcode & 3] );
-    }
-    else
-      distance = Round_None(
-                   exc,
-                   org_dist,
-                   exc->tt_metrics.compensations[exc->opcode & 3] );
-
-    /* minimum distance flag */
-
-    if ( ( exc->opcode & 8 ) != 0 )
-    {
-      if ( org_dist >= 0 )
-      {
-        if ( distance < minimum_distance )
-          distance = minimum_distance;
-      }
-      else
-      {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
-      }
-    }
-
-    /* now move the point */
-
-    org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 );
-
-    exc->func_move( exc, &exc->zp1, point, distance - org_dist );
-
-  Fail:
-    exc->GS.rp1 = exc->GS.rp0;
-    exc->GS.rp2 = point;
-
-    if ( ( exc->opcode & 16 ) != 0 )
-      exc->GS.rp0 = point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MIRP[abcde]:  Move Indirect Relative Point                            */
-  /* Opcode range: 0xE0-0xFF                                               */
-  /* Stack:        int32? uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_MIRP( TT_ExecContext  exc,
-            FT_Long*        args )
-  {
-    FT_UShort   point;
-    FT_ULong    cvtEntry;
-
-    FT_F26Dot6  cvt_dist,
-                distance,
-                cur_dist,
-                org_dist,
-                control_value_cutin,
-                minimum_distance;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    FT_Int      B1           = 0; /* pacify compiler */
-    FT_Int      B2           = 0;
-    FT_Bool     reverse_move = FALSE;
-#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 );
-
-#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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
-
-    if ( BOUNDS( point,       exc->zp1.n_points ) ||
-         BOUNDSL( cvtEntry,   exc->cvtSize + 1 )  ||
-         BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    if ( !cvtEntry )
-      cvt_dist = 0;
-    else
-      cvt_dist = exc->func_read_cvt( exc, cvtEntry - 1 );
-
-    /* single width test */
-
-    if ( FT_ABS( cvt_dist - exc->GS.single_width_value ) <
-         exc->GS.single_width_cutin )
-    {
-      if ( cvt_dist >= 0 )
-        cvt_dist =  exc->GS.single_width_value;
-      else
-        cvt_dist = -exc->GS.single_width_value;
-    }
-
-    /* UNDOCUMENTED!  The MS rasterizer does that with */
-    /* twilight points (confirmed by Greg Hitchcock)   */
-    if ( exc->GS.gep1 == 0 )
-    {
-      exc->zp1.org[point].x = exc->zp0.org[exc->GS.rp0].x +
-                              TT_MulFix14( cvt_dist,
-                                           exc->GS.freeVector.x );
-      exc->zp1.org[point].y = exc->zp0.org[exc->GS.rp0].y +
-                              TT_MulFix14( cvt_dist,
-                                           exc->GS.freeVector.y );
-      exc->zp1.cur[point]   = exc->zp1.org[point];
-    }
-
-    org_dist = DUALPROJ( &exc->zp1.org[point], &exc->zp0.org[exc->GS.rp0] );
-    cur_dist = PROJECT ( &exc->zp1.cur[point], &exc->zp0.cur[exc->GS.rp0] );
-
-    /* auto-flip test */
-
-    if ( exc->GS.auto_flip )
-    {
-      if ( ( org_dist ^ cvt_dist ) < 0 )
-        cvt_dist = -cvt_dist;
-    }
-
-#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 ) )
-    {
-      if ( cur_dist < -64 )
-        cvt_dist -= 16;
-      else if ( cur_dist > 64 && cur_dist < 84 )
-        cvt_dist += 32;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    /* control value cut-in and round */
-
-    if ( ( exc->opcode & 4 ) != 0 )
-    {
-      /* XXX: UNDOCUMENTED!  Only perform cut-in test when both points */
-      /*      refer to the same zone.                                  */
-
-      if ( exc->GS.gep0 == exc->GS.gep1 )
-      {
-        /* XXX: According to Greg Hitchcock, the following wording is */
-        /*      the right one:                                        */
-        /*                                                            */
-        /*        When the absolute difference between the value in   */
-        /*        the table [CVT] and the measurement directly from   */
-        /*        the outline is _greater_ than the cut_in value, the */
-        /*        outline measurement is used.                        */
-        /*                                                            */
-        /*      This is from `instgly.doc'.  The description in       */
-        /*      `ttinst2.doc', version 1.66, is thus incorrect since  */
-        /*      it implies `>=' instead of `>'.                       */
-
-        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
-          cvt_dist = org_dist;
-      }
-
-      distance = exc->func_round(
-                   exc,
-                   cvt_dist,
-                   exc->tt_metrics.compensations[exc->opcode & 3] );
-    }
-    else
-    {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-      /* do cvt cut-in always in MIRP for sph */
-      if ( SUBPIXEL_HINTING_INFINALITY  &&
-           exc->ignore_x_mode           &&
-           exc->GS.gep0 == exc->GS.gep1 )
-      {
-        if ( FT_ABS( cvt_dist - org_dist ) > control_value_cutin )
-          cvt_dist = org_dist;
-      }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      distance = Round_None(
-                   exc,
-                   cvt_dist,
-                   exc->tt_metrics.compensations[exc->opcode & 3] );
-    }
-
-    /* minimum distance test */
-
-    if ( ( exc->opcode & 8 ) != 0 )
-    {
-      if ( org_dist >= 0 )
-      {
-        if ( distance < minimum_distance )
-          distance = minimum_distance;
-      }
-      else
-      {
-        if ( distance > -minimum_distance )
-          distance = -minimum_distance;
-      }
-    }
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY )
-    {
-      B1 = exc->zp1.cur[point].y;
-
-      /* Round moves if necessary */
-      if ( exc->ignore_x_mode                                          &&
-           exc->GS.freeVector.y != 0                                   &&
-           ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) )
-        distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist;
-
-      if ( exc->ignore_x_mode                                      &&
-           exc->GS.freeVector.y != 0                               &&
-           ( exc->opcode & 16 ) == 0                               &&
-           ( exc->opcode & 8 ) == 0                                &&
-           ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) )
-        distance += 64;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    exc->func_move( exc, &exc->zp1, point, distance - cur_dist );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    if ( SUBPIXEL_HINTING_INFINALITY )
-    {
-      B2 = exc->zp1.cur[point].y;
-
-      /* Reverse move if necessary */
-      if ( exc->ignore_x_mode )
-      {
-        if ( exc->face->sph_compatibility_mode &&
-             exc->GS.freeVector.y != 0         &&
-             ( B1 & 63 ) == 0                  &&
-             ( B2 & 63 ) != 0                  )
-          reverse_move = TRUE;
-
-        if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) &&
-             exc->GS.freeVector.y != 0                                  &&
-             ( B2 & 63 ) != 0                                           &&
-             ( B1 & 63 ) != 0                                           )
-          reverse_move = TRUE;
-      }
-
-      if ( reverse_move )
-        exc->func_move( exc, &exc->zp1, point, -( distance - cur_dist ) );
-    }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-  Fail:
-    exc->GS.rp1 = exc->GS.rp0;
-
-    if ( ( exc->opcode & 16 ) != 0 )
-      exc->GS.rp0 = point;
-
-    exc->GS.rp2 = point;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ALIGNRP[]:    ALIGN Relative Point                                    */
-  /* Opcode range: 0x3C                                                    */
-  /* Stack:        uint32 uint32... -->                                    */
-  /*                                                                       */
-  static void
-  Ins_ALIGNRP( TT_ExecContext  exc )
-  {
-    FT_UShort   point;
-    FT_F26Dot6  distance;
-
-
-#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 ) )
-    {
-      exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    if ( exc->top < exc->GS.loop                  ||
-         BOUNDS( exc->GS.rp0, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    while ( exc->GS.loop > 0 )
-    {
-      exc->args--;
-
-      point = (FT_UShort)exc->stack[exc->args];
-
-      if ( BOUNDS( point, exc->zp1.n_points ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-      }
-      else
-      {
-        distance = PROJECT( exc->zp1.cur + point,
-                            exc->zp0.cur + exc->GS.rp0 );
-
-        exc->func_move( exc, &exc->zp1, point, -distance );
-      }
-
-      exc->GS.loop--;
-    }
-
-  Fail:
-    exc->GS.loop = 1;
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ISECT[]:      moves point to InterSECTion                             */
-  /* Opcode range: 0x0F                                                    */
-  /* Stack:        5 * uint32 -->                                          */
-  /*                                                                       */
-  static void
-  Ins_ISECT( TT_ExecContext  exc,
-             FT_Long*        args )
-  {
-    FT_UShort   point,
-                a0, a1,
-                b0, b1;
-
-    FT_F26Dot6  discriminant, dotproduct;
-
-    FT_F26Dot6  dx,  dy,
-                dax, day,
-                dbx, dby;
-
-    FT_F26Dot6  val;
-
-    FT_Vector   R;
-
-
-    point = (FT_UShort)args[0];
-
-    a0 = (FT_UShort)args[1];
-    a1 = (FT_UShort)args[2];
-    b0 = (FT_UShort)args[3];
-    b1 = (FT_UShort)args[4];
-
-    if ( BOUNDS( b0,    exc->zp0.n_points ) ||
-         BOUNDS( b1,    exc->zp0.n_points ) ||
-         BOUNDS( a0,    exc->zp1.n_points ) ||
-         BOUNDS( a1,    exc->zp1.n_points ) ||
-         BOUNDS( point, exc->zp2.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    /* 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;
-
-    dax = exc->zp1.cur[a1].x - exc->zp1.cur[a0].x;
-    day = 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;
-
-    discriminant = FT_MulDiv( dax, -dby, 0x40 ) +
-                   FT_MulDiv( day, dbx, 0x40 );
-    dotproduct   = 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     */
-    /* surrogates for sine and cosine of the angle between the vectors.  */
-    /* Indeed,                                                           */
-    /*       dotproduct   = |da||db|cos(angle)                           */
-    /*       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 ) )
-    {
-      val = FT_MulDiv( dx, -dby, 0x40 ) + FT_MulDiv( dy, dbx, 0x40 );
-
-      R.x = FT_MulDiv( val, dax, discriminant );
-      R.y = FT_MulDiv( val, day, discriminant );
-
-      /* XXX: Block in backwards_compatibility and/or post-IUP? */
-      exc->zp2.cur[point].x = exc->zp1.cur[a0].x + R.x;
-      exc->zp2.cur[point].y = exc->zp1.cur[a0].y + R.y;
-    }
-    else
-    {
-      /* else, take the middle of the middles of A and B */
-
-      /* XXX: Block in backwards_compatibility and/or post-IUP? */
-      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;
-    }
-
-    exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ALIGNPTS[]:   ALIGN PoinTS                                            */
-  /* Opcode range: 0x27                                                    */
-  /* Stack:        uint32 uint32 -->                                       */
-  /*                                                                       */
-  static void
-  Ins_ALIGNPTS( TT_ExecContext  exc,
-                FT_Long*        args )
-  {
-    FT_UShort   p1, p2;
-    FT_F26Dot6  distance;
-
-
-    p1 = (FT_UShort)args[0];
-    p2 = (FT_UShort)args[1];
-
-    if ( BOUNDS( p1, exc->zp1.n_points ) ||
-         BOUNDS( p2, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    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 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* IP[]:         Interpolate Point                                       */
-  /* Opcode range: 0x39                                                    */
-  /* Stack:        uint32... -->                                           */
-  /*                                                                       */
-
-  /* SOMETIMES, DUMBER CODE IS BETTER CODE */
-
-  static void
-  Ins_IP( TT_ExecContext  exc )
-  {
-    FT_F26Dot6  old_range, cur_range;
-    FT_Vector*  orus_base;
-    FT_Vector*  cur_base;
-    FT_Int      twilight;
-
-
-    if ( exc->top < exc->GS.loop )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    /*
-     * We need to deal in a special way with the twilight zone.
-     * 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 );
-
-    if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      goto Fail;
-    }
-
-    if ( twilight )
-      orus_base = &exc->zp0.org[exc->GS.rp1];
-    else
-      orus_base = &exc->zp0.orus[exc->GS.rp1];
-
-    cur_base = &exc->zp0.cur[exc->GS.rp1];
-
-    /* XXX: There are some glyphs in some braindead but popular */
-    /*      fonts out there (e.g. [aeu]grave in monotype.ttf)   */
-    /*      calling IP[] with bad values of rp[12].             */
-    /*      Do something sane when this odd thing happens.      */
-    if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ||
-         BOUNDS( exc->GS.rp2, exc->zp1.n_points ) )
-    {
-      old_range = 0;
-      cur_range = 0;
-    }
-    else
-    {
-      if ( twilight )
-        old_range = DUALPROJ( &exc->zp1.org[exc->GS.rp2], orus_base );
-      else if ( exc->metrics.x_scale == exc->metrics.y_scale )
-        old_range = DUALPROJ( &exc->zp1.orus[exc->GS.rp2], orus_base );
-      else
-      {
-        FT_Vector  vec;
-
-
-        vec.x = FT_MulFix( 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,
-                           exc->metrics.y_scale );
-
-        old_range = FAST_DUALPROJ( &vec );
-      }
-
-      cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base );
-    }
-
-    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;
-
-
-      /* check point bounds */
-      if ( BOUNDS( point, exc->zp2.n_points ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-        continue;
-      }
-
-      if ( twilight )
-        org_dist = DUALPROJ( &exc->zp2.org[point], orus_base );
-      else if ( exc->metrics.x_scale == exc->metrics.y_scale )
-        org_dist = DUALPROJ( &exc->zp2.orus[point], orus_base );
-      else
-      {
-        FT_Vector  vec;
-
-
-        vec.x = FT_MulFix( exc->zp2.orus[point].x - orus_base->x,
-                           exc->metrics.x_scale );
-        vec.y = FT_MulFix( exc->zp2.orus[point].y - orus_base->y,
-                           exc->metrics.y_scale );
-
-        org_dist = FAST_DUALPROJ( &vec );
-      }
-
-      cur_dist = PROJECT( &exc->zp2.cur[point], cur_base );
-
-      if ( org_dist )
-      {
-        if ( old_range )
-          new_dist = FT_MulDiv( org_dist, cur_range, old_range );
-        else
-        {
-          /* This is the same as what MS does for the invalid case:  */
-          /*                                                         */
-          /*   delta = (Original_Pt - Original_RP1) -                */
-          /*           (Current_Pt - Current_RP1)         ;          */
-          /*                                                         */
-          /* In FreeType speak:                                      */
-          /*                                                         */
-          /*   delta = org_dist - cur_dist          .                */
-          /*                                                         */
-          /* We move `point' by `new_dist - cur_dist' after leaving  */
-          /* this block, thus we have                                */
-          /*                                                         */
-          /*   new_dist - cur_dist = delta                   ,       */
-          /*   new_dist - cur_dist = org_dist - cur_dist     ,       */
-          /*              new_dist = org_dist                .       */
-
-          new_dist = org_dist;
-        }
-      }
-      else
-        new_dist = 0;
-
-      exc->func_move( exc,
-                      &exc->zp2,
-                      (FT_UShort)point,
-                      new_dist - cur_dist );
-    }
-
-  Fail:
-    exc->GS.loop = 1;
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* UTP[a]:       UnTouch Point                                           */
-  /* Opcode range: 0x29                                                    */
-  /* Stack:        uint32 -->                                              */
-  /*                                                                       */
-  static void
-  Ins_UTP( TT_ExecContext  exc,
-           FT_Long*        args )
-  {
-    FT_UShort  point;
-    FT_Byte    mask;
-
-
-    point = (FT_UShort)args[0];
-
-    if ( BOUNDS( point, exc->zp0.n_points ) )
-    {
-      if ( exc->pedantic_hinting )
-        exc->error = FT_THROW( Invalid_Reference );
-      return;
-    }
-
-    mask = 0xFF;
-
-    if ( exc->GS.freeVector.x != 0 )
-      mask &= ~FT_CURVE_TAG_TOUCH_X;
-
-    if ( exc->GS.freeVector.y != 0 )
-      mask &= ~FT_CURVE_TAG_TOUCH_Y;
-
-    exc->zp0.tags[point] &= mask;
-  }
-
-
-  /* Local variables for Ins_IUP: */
-  typedef struct  IUP_WorkerRec_
-  {
-    FT_Vector*  orgs;   /* original and current coordinate */
-    FT_Vector*  curs;   /* arrays                          */
-    FT_Vector*  orus;
-    FT_UInt     max_points;
-
-  } IUP_WorkerRec, *IUP_Worker;
-
-
-  static void
-  _iup_worker_shift( IUP_Worker  worker,
-                     FT_UInt     p1,
-                     FT_UInt     p2,
-                     FT_UInt     p )
-  {
-    FT_UInt     i;
-    FT_F26Dot6  dx;
-
-
-    dx = worker->curs[p].x - worker->orgs[p].x;
-    if ( dx != 0 )
-    {
-      for ( i = p1; i < p; i++ )
-        worker->curs[i].x += dx;
-
-      for ( i = p + 1; i <= p2; i++ )
-        worker->curs[i].x += dx;
-    }
-  }
-
-
-  static void
-  _iup_worker_interpolate( IUP_Worker  worker,
-                           FT_UInt     p1,
-                           FT_UInt     p2,
-                           FT_UInt     ref1,
-                           FT_UInt     ref2 )
-  {
-    FT_UInt     i;
-    FT_F26Dot6  orus1, orus2, org1, org2, cur1, cur2, delta1, delta2;
-
-
-    if ( p1 > p2 )
-      return;
-
-    if ( BOUNDS( ref1, worker->max_points ) ||
-         BOUNDS( ref2, worker->max_points ) )
-      return;
-
-    orus1 = worker->orus[ref1].x;
-    orus2 = worker->orus[ref2].x;
-
-    if ( orus1 > orus2 )
-    {
-      FT_F26Dot6  tmp_o;
-      FT_UInt     tmp_r;
-
-
-      tmp_o = orus1;
-      orus1 = orus2;
-      orus2 = tmp_o;
-
-      tmp_r = ref1;
-      ref1  = ref2;
-      ref2  = tmp_r;
-    }
-
-    org1   = worker->orgs[ref1].x;
-    org2   = worker->orgs[ref2].x;
-    cur1   = worker->curs[ref1].x;
-    cur2   = worker->curs[ref2].x;
-    delta1 = cur1 - org1;
-    delta2 = cur2 - org2;
-
-    if ( cur1 == cur2 || orus1 == orus2 )
-    {
-
-      /* trivial snap or shift of untouched points */
-      for ( i = p1; i <= p2; i++ )
-      {
-        FT_F26Dot6  x = worker->orgs[i].x;
-
-
-        if ( x <= org1 )
-          x += delta1;
-
-        else if ( x >= org2 )
-          x += delta2;
-
-        else
-          x = cur1;
-
-        worker->curs[i].x = x;
-      }
-    }
-    else
-    {
-      FT_Fixed  scale       = 0;
-      FT_Bool   scale_valid = 0;
-
-
-      /* interpolation */
-      for ( i = p1; i <= p2; i++ )
-      {
-        FT_F26Dot6  x = worker->orgs[i].x;
-
-
-        if ( x <= org1 )
-          x += delta1;
-
-        else if ( x >= org2 )
-          x += delta2;
-
-        else
-        {
-          if ( !scale_valid )
-          {
-            scale_valid = 1;
-            scale       = FT_DivFix( cur2 - cur1, orus2 - orus1 );
-          }
-
-          x = cur1 + FT_MulFix( worker->orus[i].x - orus1, scale );
-        }
-        worker->curs[i].x = x;
-      }
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* IUP[a]:       Interpolate Untouched Points                            */
-  /* Opcode range: 0x30-0x31                                               */
-  /* Stack:        -->                                                     */
-  /*                                                                       */
-  static void
-  Ins_IUP( TT_ExecContext  exc )
-  {
-    IUP_WorkerRec  V;
-    FT_Byte        mask;
-
-    FT_UInt   first_point;   /* first point of contour        */
-    FT_UInt   end_point;     /* end point (last+1) of contour */
-
-    FT_UInt   first_touched; /* first touched point in contour   */
-    FT_UInt   cur_touched;   /* current touched point in contour */
-
-    FT_UInt   point;         /* current point   */
-    FT_Short  contour;       /* current contour */
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* See `ttinterp.h' for details on backwards compatibility mode. */
-    /* Allow IUP until it has been called on both axes.  Immediately */
-    /* return on subsequent ones.                                    */
-    if ( SUBPIXEL_HINTING_MINIMAL     &&
-         exc->backwards_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;
-
-    if ( exc->opcode & 1 )
-    {
-      mask   = FT_CURVE_TAG_TOUCH_X;
-      V.orgs = exc->pts.org;
-      V.curs = exc->pts.cur;
-      V.orus = exc->pts.orus;
-    }
-    else
-    {
-      mask   = FT_CURVE_TAG_TOUCH_Y;
-      V.orgs = (FT_Vector*)( (FT_Pos*)exc->pts.org + 1 );
-      V.curs = (FT_Vector*)( (FT_Pos*)exc->pts.cur + 1 );
-      V.orus = (FT_Vector*)( (FT_Pos*)exc->pts.orus + 1 );
-    }
-    V.max_points = exc->pts.n_points;
-
-    contour = 0;
-    point   = 0;
-
-#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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    do
-    {
-      end_point   = exc->pts.contours[contour] - exc->pts.first_point;
-      first_point = point;
-
-      if ( BOUNDS( end_point, exc->pts.n_points ) )
-        end_point = exc->pts.n_points - 1;
-
-      while ( point <= end_point && ( exc->pts.tags[point] & mask ) == 0 )
-        point++;
-
-      if ( point <= end_point )
-      {
-        first_touched = point;
-        cur_touched   = point;
-
-        point++;
-
-        while ( point <= end_point )
-        {
-          if ( ( exc->pts.tags[point] & mask ) != 0 )
-          {
-            _iup_worker_interpolate( &V,
-                                     cur_touched + 1,
-                                     point - 1,
-                                     cur_touched,
-                                     point );
-            cur_touched = point;
-          }
-
-          point++;
-        }
-
-        if ( cur_touched == first_touched )
-          _iup_worker_shift( &V, first_point, end_point, cur_touched );
-        else
-        {
-          _iup_worker_interpolate( &V,
-                                   (FT_UShort)( cur_touched + 1 ),
-                                   end_point,
-                                   cur_touched,
-                                   first_touched );
-
-          if ( first_touched > 0 )
-            _iup_worker_interpolate( &V,
-                                     first_point,
-                                     first_touched - 1,
-                                     cur_touched,
-                                     first_touched );
-        }
-      }
-      contour++;
-    } while ( contour < exc->pts.n_contours );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DELTAPn[]:    DELTA exceptions P1, P2, P3                             */
-  /* Opcode range: 0x5D,0x71,0x72                                          */
-  /* Stack:        uint32 (2 * uint32)... -->                              */
-  /*                                                                       */
-  static void
-  Ins_DELTAP( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_ULong   nump, k;
-    FT_UShort  A;
-    FT_ULong   C, P;
-    FT_Long    B;
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    FT_UShort  B1, B2;
-
-
-    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_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-    P    = (FT_ULong)exc->func_cur_ppem( exc );
-    nump = (FT_ULong)args[0];   /* some points theoretically may occur more
-                                   than once, thus UShort isn't enough */
-
-    for ( k = 1; k <= nump; k++ )
-    {
-      if ( exc->args < 2 )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        exc->args = 0;
-        goto Fail;
-      }
-
-      exc->args -= 2;
-
-      A = (FT_UShort)exc->stack[exc->args + 1];
-      B = exc->stack[exc->args];
-
-      /* XXX: Because some popular fonts contain some invalid DeltaP */
-      /*      instructions, we simply ignore them when the stacked   */
-      /*      point reference is off limit, rather than returning an */
-      /*      error.  As a delta instruction doesn't change a glyph  */
-      /*      in great ways, this shouldn't be a problem.            */
-
-      if ( !BOUNDS( A, exc->zp0.n_points ) )
-      {
-        C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
-        switch ( exc->opcode )
-        {
-        case 0x5D:
-          break;
-
-        case 0x71:
-          C += 16;
-          break;
-
-        case 0x72:
-          C += 32;
-          break;
-        }
-
-        C += exc->GS.delta_base;
-
-        if ( P == C )
-        {
-          B = ( (FT_ULong)B & 0xF ) - 8;
-          if ( B >= 0 )
-            B++;
-          B *= 1L << ( 6 - exc->GS.delta_shift );
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-          if ( SUBPIXEL_HINTING_INFINALITY )
-          {
-            /*
-             *  Allow delta move if
-             *
-             *  - not using ignore_x_mode rendering,
-             *  - glyph is specifically set to allow it, or
-             *  - glyph is composite and freedom vector is not in subpixel
-             *    direction.
-             */
-            if ( !exc->ignore_x_mode                                   ||
-                 ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) ||
-                 ( exc->is_composite && exc->GS.freeVector.y != 0 )    )
-              exc->func_move( exc, &exc->zp0, A, B );
-
-            /* Otherwise, apply subpixel hinting and compatibility mode */
-            /* rules, always skipping deltas in subpixel direction.     */
-            else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 )
-            {
-              /* save the y value of the point now; compare after move */
-              B1 = (FT_UShort)exc->zp0.cur[A].y;
-
-              /* Standard subpixel hinting: Allow y move for y-touched */
-              /* points.  This messes up DejaVu ...                    */
-              if ( !exc->face->sph_compatibility_mode          &&
-                   ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                exc->func_move( exc, &exc->zp0, A, B );
-
-              /* compatibility mode */
-              else if ( exc->face->sph_compatibility_mode                        &&
-                        !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) )
-              {
-                if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES )
-                  B = FT_PIX_ROUND( B1 + B ) - B1;
-
-                /* Allow delta move if using sph_compatibility_mode,   */
-                /* IUP has not been called, and point is touched on Y. */
-                if ( !exc->iup_called                            &&
-                     ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) )
-                  exc->func_move( exc, &exc->zp0, A, B );
-              }
-
-              B2 = (FT_UShort)exc->zp0.cur[A].y;
-
-              /* Reverse this move if it results in a disallowed move */
-              if ( exc->GS.freeVector.y != 0                          &&
-                   ( ( exc->face->sph_compatibility_mode          &&
-                       ( B1 & 63 ) == 0                           &&
-                       ( B2 & 63 ) != 0                           ) ||
-                     ( ( exc->sph_tweak_flags                   &
-                         SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) &&
-                       ( B1 & 63 ) != 0                           &&
-                       ( B2 & 63 ) != 0                           ) ) )
-                exc->func_move( exc, &exc->zp0, A, -B );
-            }
-          }
-          else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-          {
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-            /* See `ttinterp.h' for details on backwards compatibility */
-            /* mode.                                                   */
-            if ( SUBPIXEL_HINTING_MINIMAL     &&
-                 exc->backwards_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
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Invalid_Reference );
-    }
-
-  Fail:
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* DELTACn[]:    DELTA exceptions C1, C2, C3                             */
-  /* Opcode range: 0x73,0x74,0x75                                          */
-  /* Stack:        uint32 (2 * uint32)... -->                              */
-  /*                                                                       */
-  static void
-  Ins_DELTAC( TT_ExecContext  exc,
-              FT_Long*        args )
-  {
-    FT_ULong  nump, k;
-    FT_ULong  A, C, P;
-    FT_Long   B;
-
-
-    P    = (FT_ULong)exc->func_cur_ppem( exc );
-    nump = (FT_ULong)args[0];
-
-    for ( k = 1; k <= nump; k++ )
-    {
-      if ( exc->args < 2 )
-      {
-        if ( exc->pedantic_hinting )
-          exc->error = FT_THROW( Too_Few_Arguments );
-        exc->args = 0;
-        goto Fail;
-      }
-
-      exc->args -= 2;
-
-      A = (FT_ULong)exc->stack[exc->args + 1];
-      B = exc->stack[exc->args];
-
-      if ( BOUNDSL( A, exc->cvtSize ) )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Invalid_Reference );
-          return;
-        }
-      }
-      else
-      {
-        C = ( (FT_ULong)B & 0xF0 ) >> 4;
-
-        switch ( exc->opcode )
-        {
-        case 0x73:
-          break;
-
-        case 0x74:
-          C += 16;
-          break;
-
-        case 0x75:
-          C += 32;
-          break;
-        }
-
-        C += exc->GS.delta_base;
-
-        if ( P == C )
-        {
-          B = ( (FT_ULong)B & 0xF ) - 8;
-          if ( B >= 0 )
-            B++;
-          B *= 1L << ( 6 - exc->GS.delta_shift );
-
-          exc->func_move_cvt( exc, A, B );
-        }
-      }
-    }
-
-  Fail:
-    exc->new_top = exc->args;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* MISC. INSTRUCTIONS                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* GETINFO[]:    GET INFOrmation                                         */
-  /* Opcode range: 0x88                                                    */
-  /* Stack:        uint32 --> uint32                                       */
-  /*                                                                       */
-  /* XXX: UNDOCUMENTED: Selector bits higher than 9 are currently (May     */
-  /*      2015) not documented in the OpenType specification.              */
-  /*                                                                       */
-  /*      Selector bit 11 is incorrectly described as bit 8, while the     */
-  /*      real meaning of bit 8 (vertical LCD subpixels) stays             */
-  /*      undocumented.  The same mistake can be found in Greg Hitchcock's */
-  /*      whitepaper.                                                      */
-  /*                                                                       */
-  static void
-  Ins_GETINFO( TT_ExecContext  exc,
-               FT_Long*        args )
-  {
-    FT_Long    K;
-    TT_Driver  driver = (TT_Driver)FT_FACE_DRIVER( exc->face );
-
-
-    K = 0;
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    /********************************/
-    /* RASTERIZER VERSION           */
-    /* Selector Bit:  0             */
-    /* Return Bit(s): 0-7           */
-    /*                              */
-    if ( SUBPIXEL_HINTING_INFINALITY &&
-         ( args[0] & 1 ) != 0        &&
-         exc->subpixel_hinting       )
-    {
-      if ( exc->ignore_x_mode )
-      {
-        /* if in ClearType backwards compatibility mode,        */
-        /* we sometimes change the TrueType version dynamically */
-        K = exc->rasterizer_version;
-        FT_TRACE6(( "Setting rasterizer version %d\n",
-                    exc->rasterizer_version ));
-      }
-      else
-        K = TT_INTERPRETER_VERSION_38;
-    }
-    else
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-      if ( ( args[0] & 1 ) != 0 )
-        K = driver->interpreter_version;
-
-    /********************************/
-    /* GLYPH ROTATED                */
-    /* Selector Bit:  1             */
-    /* Return Bit(s): 8             */
-    /*                              */
-    if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated )
-      K |= 1 << 8;
-
-    /********************************/
-    /* GLYPH STRETCHED              */
-    /* Selector Bit:  2             */
-    /* Return Bit(s): 9             */
-    /*                              */
-    if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched )
-      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
-
-    /********************************/
-    /* 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_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    if ( SUBPIXEL_HINTING_MINIMAL )
-    {
-      /********************************/
-      /* HINTING FOR SUBPIXEL         */
-      /* Selector Bit:  6             */
-      /* Return Bit(s): 13            */
-      /*                              */
-      /* v40 does subpixel hinting by default. */
-      if ( ( args[0] & 64 ) != 0 )
-        K |= 1 << 13;
-
-      /********************************/
-      /* 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 )
-        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 )
-    {
-
-      if ( exc->rasterizer_version >= 37 )
-      {
-        /********************************/
-        /* HINTING FOR SUBPIXEL         */
-        /* Selector Bit:  6             */
-        /* Return Bit(s): 13            */
-        /*                              */
-        if ( ( args[0] & 64 ) != 0 && exc->subpixel_hinting )
-          K |= 1 << 13;
-
-        /********************************/
-        /* COMPATIBLE WIDTHS ENABLED    */
-        /* Selector Bit:  7             */
-        /* Return Bit(s): 14            */
-        /*                              */
-        /* Functionality still needs to be added */
-        if ( ( args[0] & 128 ) != 0 && exc->compatible_widths )
-          K |= 1 << 14;
-
-        /********************************/
-        /* VERTICAL LCD SUBPIXELS?      */
-        /* Selector Bit:  8             */
-        /* Return Bit(s): 15            */
-        /*                              */
-        /* Functionality still needs to be added */
-        if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd )
-          K |= 1 << 15;
-
-        /********************************/
-        /* HINTING FOR BGR?             */
-        /* Selector Bit:  9             */
-        /* Return Bit(s): 16            */
-        /*                              */
-        /* Functionality still needs to be added */
-        if ( ( args[0] & 512 ) != 0 && exc->bgr )
-          K |= 1 << 16;
-
-        if ( exc->rasterizer_version >= 38 )
-        {
-          /********************************/
-          /* SUBPIXEL POSITIONED?         */
-          /* Selector Bit:  10            */
-          /* Return Bit(s): 17            */
-          /*                              */
-          /* Functionality still needs to be added */
-          if ( ( args[0] & 1024 ) != 0 && exc->subpixel_positioned )
-            K |= 1 << 17;
-
-          /********************************/
-          /* SYMMETRICAL SMOOTHING        */
-          /* Selector Bit:  11            */
-          /* Return Bit(s): 18            */
-          /*                              */
-          /* Functionality still needs to be added */
-          if ( ( args[0] & 2048 ) != 0 && exc->symmetrical_smoothing )
-            K |= 1 << 18;
-
-          /********************************/
-          /* GRAY CLEARTYPE               */
-          /* Selector Bit:  12            */
-          /* Return Bit(s): 19            */
-          /*                              */
-          /* Functionality still needs to be added */
-          if ( ( args[0] & 4096 ) != 0 && exc->gray_cleartype )
-            K |= 1 << 19;
-        }
-      }
-    }
-
-#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;
-    }
-
-    for ( i = 0; i < num_axes; i++ )
-      args[i] = coords[i] >> 2; /* convert 16.16 to 2.14 format */
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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 )
-  {
-    TT_DefRecord*  def   = exc->IDefs;
-    TT_DefRecord*  limit = def + exc->numIDefs;
-
-
-    for ( ; def < limit; def++ )
-    {
-      if ( (FT_Byte)def->opc == exc->opcode && def->active )
-      {
-        TT_CallRec*  call;
-
-
-        if ( exc->callTop >= exc->callSize )
-        {
-          exc->error = FT_THROW( Stack_Overflow );
-          return;
-        }
-
-        call = exc->callStack + exc->callTop++;
-
-        call->Caller_Range = exc->curRange;
-        call->Caller_IP    = exc->IP + 1;
-        call->Cur_Count    = 1;
-        call->Def          = def;
-
-        Ins_Goto_CodeRange( exc, def->range, def->start );
-
-        exc->step_ins = FALSE;
-        return;
-      }
-    }
-
-    exc->error = FT_THROW( Invalid_Opcode );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* RUN                                                                   */
-  /*                                                                       */
-  /*  This function executes a run of opcodes.  It will exit in the        */
-  /*  following cases:                                                     */
-  /*                                                                       */
-  /*  - Errors (in which case it returns FALSE).                           */
-  /*                                                                       */
-  /*  - Reaching the end of the main code range (returns TRUE).            */
-  /*    Reaching the end of a code range within a function call is an      */
-  /*    error.                                                             */
-  /*                                                                       */
-  /*  - After executing one single opcode, if the flag `Instruction_Trap'  */
-  /*    is set to TRUE (returns TRUE).                                     */
-  /*                                                                       */
-  /*  On exit with TRUE, test IP < CodeSize to know whether it comes from  */
-  /*  an instruction trap or a normal termination.                         */
-  /*                                                                       */
-  /*                                                                       */
-  /*  Note: The documented DEBUG opcode pops a value from the stack.  This */
-  /*        behaviour is unsupported; here a DEBUG opcode is always an     */
-  /*        error.                                                         */
-  /*                                                                       */
-  /*                                                                       */
-  /* THIS IS THE INTERPRETER'S MAIN LOOP.                                  */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /* documentation is in ttinterp.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  TT_RunIns( TT_ExecContext  exc )
-  {
-    FT_ULong   ins_counter = 0;  /* executed instructions counter */
-    FT_ULong   num_twilight_points;
-    FT_UShort  i;
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    FT_Byte    opcode_pattern[1][2] = {
-                  /* #8 TypeMan Talk Align */
-                  {
-                    0x06, /* SPVTL   */
-                    0x7D, /* RDTG    */
-                  },
-                };
-    FT_UShort  opcode_patterns   = 1;
-    FT_UShort  opcode_pointer[1] = { 0 };
-    FT_UShort  opcode_size[1]    = { 1 };
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-    exc->iup_called = FALSE;
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /* Toggle backwards compatibility according to what font says, except  */
-    /* when it's a `tricky' font that heavily relies on the interpreter to */
-    /* render glyphs correctly, e.g. DFKai-SB.  Backwards compatibility    */
-    /* hacks may break it.                                                 */
-    if ( SUBPIXEL_HINTING_MINIMAL          &&
-         !FT_IS_TRICKY( &exc->face->root ) )
-      exc->backwards_compatibility = !( exc->GS.instruct_control & 4 );
-    else
-      exc->backwards_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 the size of the CVT table and   */
-    /* 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, or over all points (or contours) 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. */
-    exc->loopcall_counter_max = FT_MAX( 100,
-                                        10 * ( exc->pts.n_points +
-                                               exc->cvtSize ) );
-    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;
-    if ( exc->metrics.x_ppem != exc->metrics.y_ppem )
-    {
-      /* non-square pixels, use the stretched routines */
-      exc->func_cur_ppem  = Current_Ppem_Stretched;
-      exc->func_read_cvt  = Read_CVT_Stretched;
-      exc->func_write_cvt = Write_CVT_Stretched;
-      exc->func_move_cvt  = Move_CVT_Stretched;
-    }
-    else
-    {
-      /* square pixels, use normal routines */
-      exc->func_cur_ppem  = Current_Ppem;
-      exc->func_read_cvt  = Read_CVT;
-      exc->func_write_cvt = Write_CVT;
-      exc->func_move_cvt  = Move_CVT;
-    }
-
-    Compute_Funcs( exc );
-    Compute_Round( exc, (FT_Byte)exc->GS.round_state );
-
-    do
-    {
-      exc->opcode = exc->code[exc->IP];
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-      {
-        FT_Long  cnt = FT_MIN( 8, exc->top );
-        FT_Long  n;
-
-
-        /* if tracing level is 7, show current code position */
-        /* and the first few stack elements also             */
-        FT_TRACE6(( "  " ));
-        FT_TRACE7(( "%06d ", exc->IP ));
-        FT_TRACE6(( opcode_name[exc->opcode] + 2 ));
-        FT_TRACE7(( "%*s", *opcode_name[exc->opcode] == 'A'
-                              ? 2
-                              : 12 - ( *opcode_name[exc->opcode] - '0' ),
-                              "#" ));
-        for ( n = 1; n <= cnt; n++ )
-          FT_TRACE7(( " %d", exc->stack[exc->top - n] ));
-        FT_TRACE6(( "\n" ));
-      }
-#endif /* FT_DEBUG_LEVEL_TRACE */
-
-      if ( ( exc->length = opcode_length[exc->opcode] ) < 0 )
-      {
-        if ( exc->IP + 1 >= exc->codeSize )
-          goto LErrorCodeOverflow_;
-
-        exc->length = 2 - exc->length * exc->code[exc->IP + 1];
-      }
-
-      if ( exc->IP + exc->length > exc->codeSize )
-        goto LErrorCodeOverflow_;
-
-      /* First, let's check for empty stack and overflow */
-      exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 );
-
-      /* `args' is the top of the stack once arguments have been popped. */
-      /* One can also interpret it as the index of the last argument.    */
-      if ( exc->args < 0 )
-      {
-        if ( exc->pedantic_hinting )
-        {
-          exc->error = FT_THROW( Too_Few_Arguments );
-          goto LErrorLabel_;
-        }
-
-        /* push zeroes onto the stack */
-        for ( i = 0; i < Pop_Push_Count[exc->opcode] >> 4; i++ )
-          exc->stack[i] = 0;
-        exc->args = 0;
-      }
-
-#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'  */
-      /* statement.                                                     */
-      if ( exc->new_top > exc->stackSize )
-      {
-        exc->error = FT_THROW( Stack_Overflow );
-        goto LErrorLabel_;
-      }
-
-      exc->step_ins = TRUE;
-      exc->error    = FT_Err_Ok;
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-      if ( SUBPIXEL_HINTING_INFINALITY )
-      {
-        for ( i = 0; i < opcode_patterns; i++ )
-        {
-          if ( opcode_pointer[i] < opcode_size[i]                  &&
-               exc->opcode == opcode_pattern[i][opcode_pointer[i]] )
-          {
-            opcode_pointer[i] += 1;
-
-            if ( opcode_pointer[i] == opcode_size[i] )
-            {
-              FT_TRACE6(( "sph: opcode ptrn: %d, %s %s\n",
-                          i,
-                          exc->face->root.family_name,
-                          exc->face->root.style_name ));
-
-              switch ( i )
-              {
-              case 0:
-                break;
-              }
-              opcode_pointer[i] = 0;
-            }
-          }
-          else
-            opcode_pointer[i] = 0;
-        }
-      }
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-      {
-        FT_Long*  args   = exc->stack + exc->args;
-        FT_Byte   opcode = exc->opcode;
-
-
-        switch ( opcode )
-        {
-        case 0x00:  /* SVTCA y  */
-        case 0x01:  /* SVTCA x  */
-        case 0x02:  /* SPvTCA y */
-        case 0x03:  /* SPvTCA x */
-        case 0x04:  /* SFvTCA y */
-        case 0x05:  /* SFvTCA x */
-          Ins_SxyTCA( exc );
-          break;
-
-        case 0x06:  /* SPvTL // */
-        case 0x07:  /* SPvTL +  */
-          Ins_SPVTL( exc, args );
-          break;
-
-        case 0x08:  /* SFvTL // */
-        case 0x09:  /* SFvTL +  */
-          Ins_SFVTL( exc, args );
-          break;
-
-        case 0x0A:  /* SPvFS */
-          Ins_SPVFS( exc, args );
-          break;
-
-        case 0x0B:  /* SFvFS */
-          Ins_SFVFS( exc, args );
-          break;
-
-        case 0x0C:  /* GPv */
-          Ins_GPV( exc, args );
-          break;
-
-        case 0x0D:  /* GFv */
-          Ins_GFV( exc, args );
-          break;
-
-        case 0x0E:  /* SFvTPv */
-          Ins_SFVTPV( exc );
-          break;
-
-        case 0x0F:  /* ISECT  */
-          Ins_ISECT( exc, args );
-          break;
-
-        case 0x10:  /* SRP0 */
-          Ins_SRP0( exc, args );
-          break;
-
-        case 0x11:  /* SRP1 */
-          Ins_SRP1( exc, args );
-          break;
-
-        case 0x12:  /* SRP2 */
-          Ins_SRP2( exc, args );
-          break;
-
-        case 0x13:  /* SZP0 */
-          Ins_SZP0( exc, args );
-          break;
-
-        case 0x14:  /* SZP1 */
-          Ins_SZP1( exc, args );
-          break;
-
-        case 0x15:  /* SZP2 */
-          Ins_SZP2( exc, args );
-          break;
-
-        case 0x16:  /* SZPS */
-          Ins_SZPS( exc, args );
-          break;
-
-        case 0x17:  /* SLOOP */
-          Ins_SLOOP( exc, args );
-          break;
-
-        case 0x18:  /* RTG */
-          Ins_RTG( exc );
-          break;
-
-        case 0x19:  /* RTHG */
-          Ins_RTHG( exc );
-          break;
-
-        case 0x1A:  /* SMD */
-          Ins_SMD( exc, args );
-          break;
-
-        case 0x1B:  /* ELSE */
-          Ins_ELSE( exc );
-          break;
-
-        case 0x1C:  /* JMPR */
-          Ins_JMPR( exc, args );
-          break;
-
-        case 0x1D:  /* SCVTCI */
-          Ins_SCVTCI( exc, args );
-          break;
-
-        case 0x1E:  /* SSWCI */
-          Ins_SSWCI( exc, args );
-          break;
-
-        case 0x1F:  /* SSW */
-          Ins_SSW( exc, args );
-          break;
-
-        case 0x20:  /* DUP */
-          Ins_DUP( args );
-          break;
-
-        case 0x21:  /* POP */
-          Ins_POP();
-          break;
-
-        case 0x22:  /* CLEAR */
-          Ins_CLEAR( exc );
-          break;
-
-        case 0x23:  /* SWAP */
-          Ins_SWAP( args );
-          break;
-
-        case 0x24:  /* DEPTH */
-          Ins_DEPTH( exc, args );
-          break;
-
-        case 0x25:  /* CINDEX */
-          Ins_CINDEX( exc, args );
-          break;
-
-        case 0x26:  /* MINDEX */
-          Ins_MINDEX( exc, args );
-          break;
-
-        case 0x27:  /* ALIGNPTS */
-          Ins_ALIGNPTS( exc, args );
-          break;
-
-        case 0x28:  /* RAW */
-          Ins_UNKNOWN( exc );
-          break;
-
-        case 0x29:  /* UTP */
-          Ins_UTP( exc, args );
-          break;
-
-        case 0x2A:  /* LOOPCALL */
-          Ins_LOOPCALL( exc, args );
-          break;
-
-        case 0x2B:  /* CALL */
-          Ins_CALL( exc, args );
-          break;
-
-        case 0x2C:  /* FDEF */
-          Ins_FDEF( exc, args );
-          break;
-
-        case 0x2D:  /* ENDF */
-          Ins_ENDF( exc );
-          break;
-
-        case 0x2E:  /* MDAP */
-        case 0x2F:  /* MDAP */
-          Ins_MDAP( exc, args );
-          break;
-
-        case 0x30:  /* IUP */
-        case 0x31:  /* IUP */
-          Ins_IUP( exc );
-          break;
-
-        case 0x32:  /* SHP */
-        case 0x33:  /* SHP */
-          Ins_SHP( exc );
-          break;
-
-        case 0x34:  /* SHC */
-        case 0x35:  /* SHC */
-          Ins_SHC( exc, args );
-          break;
-
-        case 0x36:  /* SHZ */
-        case 0x37:  /* SHZ */
-          Ins_SHZ( exc, args );
-          break;
-
-        case 0x38:  /* SHPIX */
-          Ins_SHPIX( exc, args );
-          break;
-
-        case 0x39:  /* IP    */
-          Ins_IP( exc );
-          break;
-
-        case 0x3A:  /* MSIRP */
-        case 0x3B:  /* MSIRP */
-          Ins_MSIRP( exc, args );
-          break;
-
-        case 0x3C:  /* AlignRP */
-          Ins_ALIGNRP( exc );
-          break;
-
-        case 0x3D:  /* RTDG */
-          Ins_RTDG( exc );
-          break;
-
-        case 0x3E:  /* MIAP */
-        case 0x3F:  /* MIAP */
-          Ins_MIAP( exc, args );
-          break;
-
-        case 0x40:  /* NPUSHB */
-          Ins_NPUSHB( exc, args );
-          break;
-
-        case 0x41:  /* NPUSHW */
-          Ins_NPUSHW( exc, args );
-          break;
-
-        case 0x42:  /* WS */
-          Ins_WS( exc, args );
-          break;
-
-        case 0x43:  /* RS */
-          Ins_RS( exc, args );
-          break;
-
-        case 0x44:  /* WCVTP */
-          Ins_WCVTP( exc, args );
-          break;
-
-        case 0x45:  /* RCVT */
-          Ins_RCVT( exc, args );
-          break;
-
-        case 0x46:  /* GC */
-        case 0x47:  /* GC */
-          Ins_GC( exc, args );
-          break;
-
-        case 0x48:  /* SCFS */
-          Ins_SCFS( exc, args );
-          break;
-
-        case 0x49:  /* MD */
-        case 0x4A:  /* MD */
-          Ins_MD( exc, args );
-          break;
-
-        case 0x4B:  /* MPPEM */
-          Ins_MPPEM( exc, args );
-          break;
-
-        case 0x4C:  /* MPS */
-          Ins_MPS( exc, args );
-          break;
-
-        case 0x4D:  /* FLIPON */
-          Ins_FLIPON( exc );
-          break;
-
-        case 0x4E:  /* FLIPOFF */
-          Ins_FLIPOFF( exc );
-          break;
-
-        case 0x4F:  /* DEBUG */
-          Ins_DEBUG( exc );
-          break;
-
-        case 0x50:  /* LT */
-          Ins_LT( args );
-          break;
-
-        case 0x51:  /* LTEQ */
-          Ins_LTEQ( args );
-          break;
-
-        case 0x52:  /* GT */
-          Ins_GT( args );
-          break;
-
-        case 0x53:  /* GTEQ */
-          Ins_GTEQ( args );
-          break;
-
-        case 0x54:  /* EQ */
-          Ins_EQ( args );
-          break;
-
-        case 0x55:  /* NEQ */
-          Ins_NEQ( args );
-          break;
-
-        case 0x56:  /* ODD */
-          Ins_ODD( exc, args );
-          break;
-
-        case 0x57:  /* EVEN */
-          Ins_EVEN( exc, args );
-          break;
-
-        case 0x58:  /* IF */
-          Ins_IF( exc, args );
-          break;
-
-        case 0x59:  /* EIF */
-          Ins_EIF();
-          break;
-
-        case 0x5A:  /* AND */
-          Ins_AND( args );
-          break;
-
-        case 0x5B:  /* OR */
-          Ins_OR( args );
-          break;
-
-        case 0x5C:  /* NOT */
-          Ins_NOT( args );
-          break;
-
-        case 0x5D:  /* DELTAP1 */
-          Ins_DELTAP( exc, args );
-          break;
-
-        case 0x5E:  /* SDB */
-          Ins_SDB( exc, args );
-          break;
-
-        case 0x5F:  /* SDS */
-          Ins_SDS( exc, args );
-          break;
-
-        case 0x60:  /* ADD */
-          Ins_ADD( args );
-          break;
-
-        case 0x61:  /* SUB */
-          Ins_SUB( args );
-          break;
-
-        case 0x62:  /* DIV */
-          Ins_DIV( exc, args );
-          break;
-
-        case 0x63:  /* MUL */
-          Ins_MUL( args );
-          break;
-
-        case 0x64:  /* ABS */
-          Ins_ABS( args );
-          break;
-
-        case 0x65:  /* NEG */
-          Ins_NEG( args );
-          break;
-
-        case 0x66:  /* FLOOR */
-          Ins_FLOOR( args );
-          break;
-
-        case 0x67:  /* CEILING */
-          Ins_CEILING( args );
-          break;
-
-        case 0x68:  /* ROUND */
-        case 0x69:  /* ROUND */
-        case 0x6A:  /* ROUND */
-        case 0x6B:  /* ROUND */
-          Ins_ROUND( exc, args );
-          break;
-
-        case 0x6C:  /* NROUND */
-        case 0x6D:  /* NROUND */
-        case 0x6E:  /* NRRUND */
-        case 0x6F:  /* NROUND */
-          Ins_NROUND( exc, args );
-          break;
-
-        case 0x70:  /* WCVTF */
-          Ins_WCVTF( exc, args );
-          break;
-
-        case 0x71:  /* DELTAP2 */
-        case 0x72:  /* DELTAP3 */
-          Ins_DELTAP( exc, args );
-          break;
-
-        case 0x73:  /* DELTAC0 */
-        case 0x74:  /* DELTAC1 */
-        case 0x75:  /* DELTAC2 */
-          Ins_DELTAC( exc, args );
-          break;
-
-        case 0x76:  /* SROUND */
-          Ins_SROUND( exc, args );
-          break;
-
-        case 0x77:  /* S45Round */
-          Ins_S45ROUND( exc, args );
-          break;
-
-        case 0x78:  /* JROT */
-          Ins_JROT( exc, args );
-          break;
-
-        case 0x79:  /* JROF */
-          Ins_JROF( exc, args );
-          break;
-
-        case 0x7A:  /* ROFF */
-          Ins_ROFF( exc );
-          break;
-
-        case 0x7B:  /* ???? */
-          Ins_UNKNOWN( exc );
-          break;
-
-        case 0x7C:  /* RUTG */
-          Ins_RUTG( exc );
-          break;
-
-        case 0x7D:  /* RDTG */
-          Ins_RDTG( exc );
-          break;
-
-        case 0x7E:  /* SANGW */
-          Ins_SANGW();
-          break;
-
-        case 0x7F:  /* AA */
-          Ins_AA();
-          break;
-
-        case 0x80:  /* FLIPPT */
-          Ins_FLIPPT( exc );
-          break;
-
-        case 0x81:  /* FLIPRGON */
-          Ins_FLIPRGON( exc, args );
-          break;
-
-        case 0x82:  /* FLIPRGOFF */
-          Ins_FLIPRGOFF( exc, args );
-          break;
-
-        case 0x83:  /* UNKNOWN */
-        case 0x84:  /* UNKNOWN */
-          Ins_UNKNOWN( exc );
-          break;
-
-        case 0x85:  /* SCANCTRL */
-          Ins_SCANCTRL( exc, args );
-          break;
-
-        case 0x86:  /* SDPvTL */
-        case 0x87:  /* SDPvTL */
-          Ins_SDPVTL( exc, args );
-          break;
-
-        case 0x88:  /* GETINFO */
-          Ins_GETINFO( exc, args );
-          break;
-
-        case 0x89:  /* IDEF */
-          Ins_IDEF( exc, args );
-          break;
-
-        case 0x8A:  /* ROLL */
-          Ins_ROLL( args );
-          break;
-
-        case 0x8B:  /* MAX */
-          Ins_MAX( args );
-          break;
-
-        case 0x8C:  /* MIN */
-          Ins_MIN( args );
-          break;
-
-        case 0x8D:  /* SCANTYPE */
-          Ins_SCANTYPE( exc, args );
-          break;
-
-        case 0x8E:  /* INSTCTRL */
-          Ins_INSTCTRL( exc, args );
-          break;
-
-        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 );
-          else if ( opcode >= 0xC0 )
-            Ins_MDRP( exc, args );
-          else if ( opcode >= 0xB8 )
-            Ins_PUSHW( exc, args );
-          else if ( opcode >= 0xB0 )
-            Ins_PUSHB( exc, args );
-          else
-            Ins_UNKNOWN( exc );
-        }
-      }
-
-      if ( exc->error )
-      {
-        switch ( exc->error )
-        {
-          /* looking for redefined instructions */
-        case FT_ERR( Invalid_Opcode ):
-          {
-            TT_DefRecord*  def   = exc->IDefs;
-            TT_DefRecord*  limit = def + exc->numIDefs;
-
-
-            for ( ; def < limit; def++ )
-            {
-              if ( def->active && exc->opcode == (FT_Byte)def->opc )
-              {
-                TT_CallRec*  callrec;
-
-
-                if ( exc->callTop >= exc->callSize )
-                {
-                  exc->error = FT_THROW( Invalid_Reference );
-                  goto LErrorLabel_;
-                }
-
-                callrec = &exc->callStack[exc->callTop];
-
-                callrec->Caller_Range = exc->curRange;
-                callrec->Caller_IP    = exc->IP + 1;
-                callrec->Cur_Count    = 1;
-                callrec->Def          = def;
-
-                if ( Ins_Goto_CodeRange( exc,
-                                         def->range,
-                                         def->start ) == FAILURE )
-                  goto LErrorLabel_;
-
-                goto LSuiteLabel_;
-              }
-            }
-          }
-
-          exc->error = FT_THROW( Invalid_Opcode );
-          goto LErrorLabel_;
-
-#if 0
-          break;   /* Unreachable code warning suppression.             */
-                   /* Leave to remind in case a later change the editor */
-                   /* to consider break;                                */
-#endif
-
-        default:
-          goto LErrorLabel_;
-
-#if 0
-        break;
-#endif
-        }
-      }
-
-      exc->top = exc->new_top;
-
-      if ( exc->step_ins )
-        exc->IP += exc->length;
-
-      /* increment instruction counter and check if we didn't */
-      /* run this program for too long (e.g. infinite loops). */
-      if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES )
-        return FT_THROW( Execution_Too_Long );
-
-    LSuiteLabel_:
-      if ( exc->IP >= exc->codeSize )
-      {
-        if ( exc->callTop > 0 )
-        {
-          exc->error = FT_THROW( Code_Overflow );
-          goto LErrorLabel_;
-        }
-        else
-          goto LNo_Error_;
-      }
-    } while ( !exc->instruction_trap );
-
-  LNo_Error_:
-    FT_TRACE4(( "  %d instructions executed\n", ins_counter ));
-    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 )
-    {
-      FT_TRACE1(( "  The interpreter returned error 0x%x\n", exc->error ));
-      exc->size->bytecode_ready = -1;
-      exc->size->cvt_ready      = -1;
-    }
-
-    return exc->error;
-  }
-
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttinterp.h b/third_party/freetype/src/truetype/ttinterp.h
deleted file mode 100644
index 6625e16..0000000
--- a/third_party/freetype/src/truetype/ttinterp.h
+++ /dev/null
@@ -1,523 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttinterp.h                                                             */
-/*                                                                         */
-/*    TrueType bytecode interpreter (specification).                       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTINTERP_H_
-#define TTINTERP_H_
-
-#include <ft2build.h>
-#include "ttobjs.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Rounding mode constants.                                              */
-  /*                                                                       */
-#define TT_Round_Off             5
-#define TT_Round_To_Half_Grid    0
-#define TT_Round_To_Grid         1
-#define TT_Round_To_Double_Grid  2
-#define TT_Round_Up_To_Grid      4
-#define TT_Round_Down_To_Grid    3
-#define TT_Round_Super           6
-#define TT_Round_Super_45        7
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Function types used by the interpreter, depending on various modes    */
-  /* (e.g. the rounding mode, whether to render a vertical or horizontal   */
-  /* line etc).                                                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /* Rounding function */
-  typedef FT_F26Dot6
-  (*TT_Round_Func)( TT_ExecContext  exc,
-                    FT_F26Dot6      distance,
-                    FT_F26Dot6      compensation );
-
-  /* Point displacement along the freedom vector routine */
-  typedef void
-  (*TT_Move_Func)( TT_ExecContext  exc,
-                   TT_GlyphZone    zone,
-                   FT_UShort       point,
-                   FT_F26Dot6      distance );
-
-  /* Distance projection along one of the projection vectors */
-  typedef FT_F26Dot6
-  (*TT_Project_Func)( TT_ExecContext  exc,
-                      FT_Pos          dx,
-                      FT_Pos          dy );
-
-  /* getting current ppem.  Take care of non-square pixels if necessary */
-  typedef FT_Long
-  (*TT_Cur_Ppem_Func)( TT_ExecContext  exc );
-
-  /* reading a cvt value.  Take care of non-square pixels if necessary */
-  typedef FT_F26Dot6
-  (*TT_Get_CVT_Func)( TT_ExecContext  exc,
-                      FT_ULong        idx );
-
-  /* setting or moving a cvt value.  Take care of non-square pixels  */
-  /* if necessary                                                    */
-  typedef void
-  (*TT_Set_CVT_Func)( TT_ExecContext  exc,
-                      FT_ULong        idx,
-                      FT_F26Dot6      value );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This structure defines a call record, used to manage function calls.  */
-  /*                                                                       */
-  typedef struct  TT_CallRec_
-  {
-    FT_Int   Caller_Range;
-    FT_Long  Caller_IP;
-    FT_Long  Cur_Count;
-
-    TT_DefRecord  *Def; /* either FDEF or IDEF */
-
-  } TT_CallRec, *TT_CallStack;
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* These structures define rules used to tweak subpixel hinting for      */
-  /* various fonts.  "", 0, "", NULL value indicates to match any value.   */
-  /*                                                                       */
-
-#define SPH_MAX_NAME_SIZE      32
-#define SPH_MAX_CLASS_MEMBERS  100
-
-  typedef struct  SPH_TweakRule_
-  {
-    const char      family[SPH_MAX_NAME_SIZE];
-    const FT_UInt   ppem;
-    const char      style[SPH_MAX_NAME_SIZE];
-    const FT_ULong  glyph;
-
-  } SPH_TweakRule;
-
-
-  typedef struct  SPH_ScaleRule_
-  {
-    const char      family[SPH_MAX_NAME_SIZE];
-    const FT_UInt   ppem;
-    const char      style[SPH_MAX_NAME_SIZE];
-    const FT_ULong  glyph;
-    const FT_ULong  scale;
-
-  } SPH_ScaleRule;
-
-
-  typedef struct  SPH_Font_Class_
-  {
-    const char  name[SPH_MAX_NAME_SIZE];
-    const char  member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE];
-
-  } SPH_Font_Class;
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The main structure for the interpreter which collects all necessary   */
-  /* variables and states.                                                 */
-  /*                                                                       */
-  typedef struct  TT_ExecContextRec_
-  {
-    TT_Face            face;
-    TT_Size            size;
-    FT_Memory          memory;
-
-    /* instructions state */
-
-    FT_Error           error;      /* last execution error */
-
-    FT_Long            top;        /* top of exec. stack   */
-
-    FT_Long            stackSize;  /* size of exec. stack  */
-    FT_Long*           stack;      /* current exec. stack  */
-
-    FT_Long            args;
-    FT_Long            new_top;    /* new top after exec.  */
-
-    TT_GlyphZoneRec    zp0,        /* zone records */
-                       zp1,
-                       zp2,
-                       pts,
-                       twilight;
-
-    FT_Long            pointSize;  /* in 26.6 format */
-    FT_Size_Metrics    metrics;
-    TT_Size_Metrics    tt_metrics; /* size metrics */
-
-    TT_GraphicsState   GS;         /* current graphics state */
-
-    FT_Int             curRange;  /* current code range number   */
-    FT_Byte*           code;      /* current code range          */
-    FT_Long            IP;        /* current instruction pointer */
-    FT_Long            codeSize;  /* size of current range       */
-
-    FT_Byte            opcode;    /* current opcode              */
-    FT_Int             length;    /* length of current opcode    */
-
-    FT_Bool            step_ins;  /* true if the interpreter must */
-                                  /* increment IP after ins. exec */
-    FT_ULong           cvtSize;
-    FT_Long*           cvt;
-
-    FT_UInt            glyphSize; /* glyph instructions buffer size */
-    FT_Byte*           glyphIns;  /* glyph instructions buffer */
-
-    FT_UInt            numFDefs;  /* number of function defs         */
-    FT_UInt            maxFDefs;  /* maximum number of function defs */
-    TT_DefArray        FDefs;     /* table of FDefs entries          */
-
-    FT_UInt            numIDefs;  /* number of instruction defs */
-    FT_UInt            maxIDefs;  /* maximum number of ins defs */
-    TT_DefArray        IDefs;     /* table of IDefs entries     */
-
-    FT_UInt            maxFunc;   /* maximum function index     */
-    FT_UInt            maxIns;    /* maximum instruction index  */
-
-    FT_Int             callTop,    /* top of call stack during execution */
-                       callSize;   /* size of call stack */
-    TT_CallStack       callStack;  /* call stack */
-
-    FT_UShort          maxPoints;    /* capacity of this context's `pts' */
-    FT_Short           maxContours;  /* record, expressed in points and  */
-                                     /* contours.                        */
-
-    TT_CodeRangeTable  codeRangeTable;  /* table of valid code ranges */
-                                        /* useful for the debugger   */
-
-    FT_UShort          storeSize;  /* size of current storage */
-    FT_Long*           storage;    /* storage area            */
-
-    FT_F26Dot6         period;     /* values used for the */
-    FT_F26Dot6         phase;      /* `SuperRounding'     */
-    FT_F26Dot6         threshold;
-
-    FT_Bool            instruction_trap; /* If `True', the interpreter will */
-                                         /* exit after each instruction     */
-
-    TT_GraphicsState   default_GS;       /* graphics state resulting from   */
-                                         /* the prep program                */
-    FT_Bool            is_composite;     /* true if the glyph is composite  */
-    FT_Bool            pedantic_hinting; /* true if pedantic interpretation */
-
-    /* latest interpreter additions */
-
-    FT_Long            F_dot_P;    /* dot product of freedom and projection */
-                                   /* vectors                               */
-    TT_Round_Func      func_round; /* current rounding function             */
-
-    TT_Project_Func    func_project,   /* current projection function */
-                       func_dualproj,  /* current dual proj. function */
-                       func_freeProj;  /* current freedom proj. func  */
-
-    TT_Move_Func       func_move;      /* current point move function */
-    TT_Move_Func       func_move_orig; /* move original position function */
-
-    TT_Cur_Ppem_Func   func_cur_ppem;  /* get current proj. ppem value  */
-
-    TT_Get_CVT_Func    func_read_cvt;  /* read a cvt entry              */
-    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;      /* bi-level hinting and */
-                                       /* grayscale rendering  */
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
-    /*
-     * Modern TrueType fonts are usually rendered through Microsoft's
-     * collection of rendering techniques called ClearType (e.g., subpixel
-     * rendering and subpixel hinting).  When ClearType was introduced, most
-     * fonts were not ready.  Microsoft decided to implement a backwards
-     * compatibility mode that employed several simple to complicated
-     * assumptions and tricks that modified the interpretation of the
-     * bytecode contained in these fonts to make them look ClearType-y
-     * somehow.  Most (web)fonts that were released since then have come to
-     * rely on these hacks to render correctly, even some of Microsoft's
-     * flagship ClearType fonts (Calibri, Cambria, Segoe UI).
-     *
-     * The minimal subpixel hinting code (interpreter version 40) employs a
-     * small list of font-agnostic hacks to bludgeon non-native-ClearType
-     * fonts (except tricky ones[1]) into submission.  It will not try to
-     * toggle hacks for specific fonts for performance and complexity
-     * reasons.  The focus is on modern (web)fonts rather than legacy fonts
-     * that were made for black-and-white rendering.
-     *
-     * 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 backwards 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 backwards 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
-     *     backwards 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.  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 backwards compatibility mode in v40 interpreter.  If  */
-    /* this is false, it implies the interpreter is in v35 or in native */
-    /* ClearType mode.                                                  */
-    FT_Bool            backwards_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?       */
-    FT_Bool            ignore_x_mode;     /* Standard rendering mode for   */
-                                          /* subpixel hinting.  On if gray */
-                                          /* or subpixel hinting is on.    */
-
-    /* The following 6 aren't fully implemented but here for MS rasterizer */
-    /* compatibility.                                                      */
-    FT_Bool            compatible_widths;     /* compatible widths?        */
-    FT_Bool            symmetrical_smoothing; /* symmetrical_smoothing?    */
-    FT_Bool            bgr;                   /* bgr instead of rgb?       */
-    FT_Bool            vertical_lcd;          /* long side of LCD subpixel */
-                                              /* rectangles is horizontal  */
-    FT_Bool            subpixel_positioned;   /* subpixel positioned       */
-                                              /* (DirectWrite ClearType)?  */
-    FT_Bool            gray_cleartype;        /* ClearType hinting but     */
-                                              /* grayscale rendering       */
-
-    FT_Int             rasterizer_version;    /* MS rasterizer version     */
-
-    FT_Bool            iup_called;            /* IUP called for glyph?     */
-
-    FT_ULong           sph_tweak_flags;       /* flags to control          */
-                                              /* hint tweaks               */
-
-    FT_ULong           sph_in_func_flags;     /* flags to indicate if in   */
-                                              /* special functions         */
-
-#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;
-
-
-  extern const TT_GraphicsState  tt_default_graphics_state;
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-  FT_LOCAL( void )
-  TT_Goto_CodeRange( TT_ExecContext  exec,
-                     FT_Int          range,
-                     FT_Long         IP );
-
-  FT_LOCAL( void )
-  TT_Set_CodeRange( TT_ExecContext  exec,
-                    FT_Int          range,
-                    void*           base,
-                    FT_Long         length );
-
-  FT_LOCAL( void )
-  TT_Clear_CodeRange( TT_ExecContext  exec,
-                      FT_Int          range );
-
-
-  FT_LOCAL( FT_Error )
-  Update_Max( FT_Memory  memory,
-              FT_ULong*  size,
-              FT_ULong   multiplier,
-              void*      _pbuff,
-              FT_ULong   new_max );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_New_Context                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Queries the face context for a given font.  Note that there is     */
-  /*    now a _single_ execution context in the TrueType driver which is   */
-  /*    shared among faces.                                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A handle to the source face object.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    A handle to the execution context.  Initialized for `face'.        */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only the glyph loader and debugger should call this function.      */
-  /*    (And right now only the glyph loader uses it.)                     */
-  /*                                                                       */
-  FT_EXPORT( TT_ExecContext )
-  TT_New_Context( TT_Driver  driver );
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-  FT_LOCAL( void )
-  TT_Done_Context( TT_ExecContext  exec );
-
-  FT_LOCAL( FT_Error )
-  TT_Load_Context( TT_ExecContext  exec,
-                   TT_Face         face,
-                   TT_Size         size );
-
-  FT_LOCAL( void )
-  TT_Save_Context( TT_ExecContext  exec,
-                   TT_Size         ins );
-
-  FT_LOCAL( FT_Error )
-  TT_Run_Context( TT_ExecContext  exec );
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_RunIns                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Executes one or more instruction in the execution context.  This   */
-  /*    is the main function of the TrueType opcode interpreter.           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    exec :: A handle to the target execution context.                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only the object manager and debugger should call this function.    */
-  /*                                                                       */
-  /*    This function is publicly exported because it is directly          */
-  /*    invoked by the TrueType debugger.                                  */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  TT_RunIns( TT_ExecContext  exec );
-
-
-FT_END_HEADER
-
-#endif /* TTINTERP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttobjs.c b/third_party/freetype/src/truetype/ttobjs.c
deleted file mode 100644
index 18aa48a..0000000
--- a/third_party/freetype/src/truetype/ttobjs.c
+++ /dev/null
@@ -1,1363 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttobjs.c                                                               */
-/*                                                                         */
-/*    Objects manager (body).                                              */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_INTERNAL_SFNT_H
-#include FT_TRUETYPE_DRIVER_H
-
-#include "ttgload.h"
-#include "ttpload.h"
-
-#include "tterrors.h"
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-#include "ttinterp.h"
-#endif
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include "ttgxvar.h"
-#endif
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_ttobjs
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                       GLYPH ZONE FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_glyphzone_done                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Deallocate a glyph zone.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    zone :: A pointer to the target glyph zone.                        */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_glyphzone_done( TT_GlyphZone  zone )
-  {
-    FT_Memory  memory = zone->memory;
-
-
-    if ( memory )
-    {
-      FT_FREE( zone->contours );
-      FT_FREE( zone->tags );
-      FT_FREE( zone->cur );
-      FT_FREE( zone->org );
-      FT_FREE( zone->orus );
-
-      zone->max_points   = zone->n_points   = 0;
-      zone->max_contours = zone->n_contours = 0;
-      zone->memory       = NULL;
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_glyphzone_new                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Allocate a new glyph zone.                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    memory      :: A handle to the current memory object.              */
-  /*                                                                       */
-  /*    maxPoints   :: The capacity of glyph zone in points.               */
-  /*                                                                       */
-  /*    maxContours :: The capacity of glyph zone in contours.             */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    zone        :: A pointer to the target glyph zone record.          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_glyphzone_new( FT_Memory     memory,
-                    FT_UShort     maxPoints,
-                    FT_Short      maxContours,
-                    TT_GlyphZone  zone )
-  {
-    FT_Error  error;
-
-
-    FT_ZERO( zone );
-    zone->memory = memory;
-
-    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
-         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
-         FT_NEW_ARRAY( zone->orus,     maxPoints   ) ||
-         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
-         FT_NEW_ARRAY( zone->contours, maxContours ) )
-    {
-      tt_glyphzone_done( zone );
-    }
-    else
-    {
-      zone->max_points   = maxPoints;
-      zone->max_contours = maxContours;
-    }
-
-    return error;
-  }
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-  /* Compare the face with a list of well-known `tricky' fonts. */
-  /* This list shall be expanded as we find more of them.       */
-
-  static FT_Bool
-  tt_check_trickyness_family( FT_String*  name )
-  {
-
-#define TRICK_NAMES_MAX_CHARACTERS  19
-#define TRICK_NAMES_COUNT            9
-
-    static const char trick_names[TRICK_NAMES_COUNT]
-                                 [TRICK_NAMES_MAX_CHARACTERS + 1] =
-    {
-      "DFKaiSho-SB",        /* dfkaisb.ttf */
-      "DFKaiShu",
-      "DFKai-SB",           /* kaiu.ttf */
-      "HuaTianKaiTi?",      /* htkt2.ttf */
-      "HuaTianSongTi?",     /* htst3.ttf */
-      "Ming(for ISO10646)", /* hkscsiic.ttf & iicore.ttf */
-      "MingLiU",            /* mingliu.ttf & mingliu.ttc */
-      "PMingLiU",           /* mingliu.ttc */
-      "MingLi43",           /* mingli.ttf */
-    };
-
-    int  nn;
-
-
-    for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
-      if ( ft_strstr( name, trick_names[nn] ) )
-        return TRUE;
-
-    return FALSE;
-  }
-
-
-  /* XXX: This function should be in the `sfnt' module. */
-
-  /* Some PDF generators clear the checksums in the TrueType header table. */
-  /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF     */
-  /* Printer clears the entries for subsetted subtables.  We thus have to  */
-  /* recalculate the checksums  where necessary.                           */
-
-  static FT_UInt32
-  tt_synth_sfnt_checksum( FT_Stream  stream,
-                          FT_ULong   length )
-  {
-    FT_Error   error;
-    FT_UInt32  checksum = 0;
-    FT_UInt    i;
-
-
-    if ( FT_FRAME_ENTER( length ) )
-      return 0;
-
-    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 );
-
-    FT_FRAME_EXIT();
-
-    return checksum;
-  }
-
-
-  /* XXX: This function should be in the `sfnt' module. */
-
-  static FT_ULong
-  tt_get_sfnt_checksum( TT_Face    face,
-                        FT_UShort  i )
-  {
-#if 0 /* if we believe the written value, use following part. */
-    if ( face->dir_tables[i].CheckSum )
-      return face->dir_tables[i].CheckSum;
-#endif
-
-    if ( !face->goto_table )
-      return 0;
-
-    if ( face->goto_table( face,
-                           face->dir_tables[i].Tag,
-                           face->root.stream,
-                           NULL ) )
-      return 0;
-
-    return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
-                                             face->dir_tables[i].Length );
-  }
-
-
-  typedef struct tt_sfnt_id_rec_
-  {
-    FT_ULong  CheckSum;
-    FT_ULong  Length;
-
-  } tt_sfnt_id_rec;
-
-
-  static FT_Bool
-  tt_check_trickyness_sfnt_ids( TT_Face  face )
-  {
-#define TRICK_SFNT_IDS_PER_FACE   3
-#define TRICK_SFNT_IDS_NUM_FACES  18
-
-    static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
-                                       [TRICK_SFNT_IDS_PER_FACE] = {
-
-#define TRICK_SFNT_ID_cvt   0
-#define TRICK_SFNT_ID_fpgm  1
-#define TRICK_SFNT_ID_prep  2
-
-      { /* MingLiU 1995 */
-        { 0x05BCF058UL, 0x000002E4UL }, /* cvt  */
-        { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
-        { 0xA344A1EAUL, 0x000001E1UL }  /* prep */
-      },
-      { /* MingLiU 1996- */
-        { 0x05BCF058UL, 0x000002E4UL }, /* cvt  */
-        { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
-        { 0xA344A1EBUL, 0x000001E1UL }  /* prep */
-      },
-      { /* DFKaiShu */
-        { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
-        { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */
-        { 0x13A42602UL, 0x0000007EUL }  /* prep */
-      },
-      { /* DFKaiShu2 */
-        { 0x11E5EAD4UL, 0x00000350UL }, /* cvt  */
-        { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */
-        { 0x13A42602UL, 0x0000007EUL }  /* prep */
-      },
-      { /* HuaTianKaiTi */
-        { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt  */
-        { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */
-        { 0x70020112UL, 0x00000008UL }  /* prep */
-      },
-      { /* HuaTianSongTi */
-        { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt  */
-        { 0x0A5A0483UL, 0x00017C39UL }, /* fpgm */
-        { 0x70020112UL, 0x00000008UL }  /* prep */
-      },
-      { /* NEC fadpop7.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x40C92555UL, 0x000000E5UL }, /* fpgm */
-        { 0xA39B58E3UL, 0x0000117CUL }  /* prep */
-      },
-      { /* NEC fadrei5.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x33C41652UL, 0x000000E5UL }, /* fpgm */
-        { 0x26D6C52AUL, 0x00000F6AUL }  /* prep */
-      },
-      { /* NEC fangot7.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x6DB1651DUL, 0x0000019DUL }, /* fpgm */
-        { 0x6C6E4B03UL, 0x00002492UL }  /* prep */
-      },
-      { /* NEC fangyo5.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x40C92555UL, 0x000000E5UL }, /* fpgm */
-        { 0xDE51FAD0UL, 0x0000117CUL }  /* prep */
-      },
-      { /* NEC fankyo5.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x85E47664UL, 0x000000E5UL }, /* fpgm */
-        { 0xA6C62831UL, 0x00001CAAUL }  /* prep */
-      },
-      { /* NEC fanrgo5.ttf */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x2D891CFDUL, 0x0000019DUL }, /* fpgm */
-        { 0xA0604633UL, 0x00001DE8UL }  /* prep */
-      },
-      { /* NEC fangot5.ttc */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x40AA774CUL, 0x000001CBUL }, /* fpgm */
-        { 0x9B5CAA96UL, 0x00001F9AUL }  /* prep */
-      },
-      { /* NEC fanmin3.ttc */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x0D3DE9CBUL, 0x00000141UL }, /* fpgm */
-        { 0xD4127766UL, 0x00002280UL }  /* prep */
-      },
-      { /* NEC FA-Gothic, 1996 */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x4A692698UL, 0x000001F0UL }, /* fpgm */
-        { 0x340D4346UL, 0x00001FCAUL }  /* prep */
-      },
-      { /* NEC FA-Minchou, 1996 */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0xCD34C604UL, 0x00000166UL }, /* fpgm */
-        { 0x6CF31046UL, 0x000022B0UL }  /* prep */
-      },
-      { /* NEC FA-RoundGothicB, 1996 */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0x5DA75315UL, 0x0000019DUL }, /* fpgm */
-        { 0x40745A5FUL, 0x000022E0UL }  /* prep */
-      },
-      { /* NEC FA-RoundGothicM, 1996 */
-        { 0x00000000UL, 0x00000000UL }, /* cvt  */
-        { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */
-        { 0x3900DED3UL, 0x00001E18UL }  /* prep */
-      }
-    };
-
-    FT_ULong   checksum;
-    int        num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
-    FT_Bool    has_cvt, has_fpgm, has_prep;
-    FT_UShort  i;
-    int        j, k;
-
-
-    FT_MEM_SET( num_matched_ids, 0,
-                sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
-    has_cvt  = FALSE;
-    has_fpgm = FALSE;
-    has_prep = FALSE;
-
-    for ( i = 0; i < face->num_tables; i++ )
-    {
-      checksum = 0;
-
-      switch( face->dir_tables[i].Tag )
-      {
-      case TTAG_cvt:
-        k = TRICK_SFNT_ID_cvt;
-        has_cvt  = TRUE;
-        break;
-
-      case TTAG_fpgm:
-        k = TRICK_SFNT_ID_fpgm;
-        has_fpgm = TRUE;
-        break;
-
-      case TTAG_prep:
-        k = TRICK_SFNT_ID_prep;
-        has_prep = TRUE;
-        break;
-
-      default:
-        continue;
-      }
-
-      for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
-        if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
-        {
-          if ( !checksum )
-            checksum = tt_get_sfnt_checksum( face, i );
-
-          if ( sfnt_id[j][k].CheckSum == checksum )
-            num_matched_ids[j]++;
-
-          if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
-            return TRUE;
-        }
-    }
-
-    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]++;
-      if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
-        num_matched_ids[j]++;
-      if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
-        num_matched_ids[j]++;
-      if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
-        return TRUE;
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_Bool
-  tt_check_trickyness( FT_Face  face )
-  {
-    if ( !face )
-      return FALSE;
-
-    /* For first, check the face name for quick check. */
-    if ( face->family_name                               &&
-         tt_check_trickyness_family( face->family_name ) )
-      return TRUE;
-
-    /* Type42 fonts may lack `name' tables, we thus try to identify */
-    /* tricky fonts by checking the checksums of Type42-persistent  */
-    /* sfnt tables (`cvt', `fpgm', and `prep').                     */
-    if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
-      return TRUE;
-
-    return FALSE;
-  }
-
-
-  /* Check whether `.notdef' is the only glyph in the `loca' table. */
-  static FT_Bool
-  tt_check_single_notdef( FT_Face  ttface )
-  {
-    FT_Bool   result = FALSE;
-
-    TT_Face   face = (TT_Face)ttface;
-    FT_UInt   asize;
-    FT_ULong  i;
-    FT_ULong  glyph_index = 0;
-    FT_UInt   count       = 0;
-
-
-    for( i = 0; i < face->num_locations; i++ )
-    {
-      tt_face_get_location( face, i, &asize );
-      if ( asize > 0 )
-      {
-        count += 1;
-        if ( count > 1 )
-          break;
-        glyph_index = i;
-      }
-    }
-
-    /* Only have a single outline. */
-    if ( count == 1 )
-    {
-      if ( glyph_index == 0 )
-        result = TRUE;
-      else
-      {
-        /* FIXME: Need to test glyphname == .notdef ? */
-        FT_Error error;
-        char buf[8];
-
-
-        error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
-        if ( !error                                            &&
-             buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
-          result = TRUE;
-      }
-    }
-
-    return result;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_init                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a given TrueType face object.                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream     :: The source font stream.                              */
-  /*                                                                       */
-  /*    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.   */
-  /*                                                                       */
-  /*    params     :: Additional generic parameters.  Ignored.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The newly built face object.                         */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_init( FT_Stream      stream,
-                FT_Face        ttface,      /* TT_Face */
-                FT_Int         face_index,
-                FT_Int         num_params,
-                FT_Parameter*  params )
-  {
-    FT_Error      error;
-    FT_Library    library;
-    SFNT_Service  sfnt;
-    TT_Face       face = (TT_Face)ttface;
-
-
-    FT_TRACE2(( "TTF driver\n" ));
-
-    library = ttface->driver->root.library;
-
-    sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" );
-    if ( !sfnt )
-    {
-      FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
-      error = FT_THROW( Missing_Module );
-      goto Exit;
-    }
-
-    /* create input stream from resource */
-    if ( FT_STREAM_SEEK( 0 ) )
-      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. */
-    stream = face->root.stream;
-
-    if ( error )
-      goto Exit;
-
-    /* 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 */
-    {
-      FT_TRACE2(( "  not a TTF font\n" ));
-      goto Bad_Format;
-    }
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    ttface->face_flags |= FT_FACE_FLAG_HINTER;
-#endif
-
-    /* If we are performing a simple font format check, exit immediately. */
-    if ( face_index < 0 )
-      return FT_Err_Ok;
-
-    /* Load font directory */
-    error = sfnt->load_face( stream, face, face_index, num_params, params );
-    if ( error )
-      goto Exit;
-
-    if ( tt_check_trickyness( ttface ) )
-      ttface->face_flags |= FT_FACE_FLAG_TRICKY;
-
-    error = tt_face_load_hdmx( face, stream );
-    if ( error )
-      goto Exit;
-
-    if ( FT_IS_SCALABLE( ttface ) )
-    {
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-      if ( !ttface->internal->incremental_interface )
-#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;
-        }
-      }
-    }
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-    {
-      FT_Int  instance_index = face_index >> 16;
-
-
-      if ( FT_HAS_MULTIPLE_MASTERS( ttface ) &&
-           instance_index > 0                )
-      {
-        error = TT_Get_MM_Var( face, NULL );
-        if ( error )
-          goto Exit;
-
-        if ( face->blend->mmvar->namedstyle )
-        {
-          FT_Memory  memory = ttface->memory;
-
-          FT_Var_Named_Style*  named_style;
-          FT_String*           style_name;
-
-
-          /* in `face_index', the instance index starts with value 1 */
-          named_style = face->blend->mmvar->namedstyle + instance_index - 1;
-          error = sfnt->get_name( face,
-                                  (FT_UShort)named_style->strid,
-                                  &style_name );
-          if ( error )
-            goto Exit;
-
-          /* set style name; if already set, replace it */
-          if ( face->root.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,
-                                     face->blend->mmvar->num_axis,
-                                     named_style->coords );
-          if ( error )
-            goto Exit;
-
-          tt_apply_mvar( face );
-        }
-      }
-    }
-
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
-
-    /* initialize standard glyph loading routines */
-    TT_Init_Glyph_Loading( face );
-
-  Exit:
-    return error;
-
-  Bad_Format:
-    error = FT_THROW( Unknown_File_Format );
-    goto Exit;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_done                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalize a given face object.                                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A pointer to the face object to destroy.                   */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_face_done( FT_Face  ttface )           /* TT_Face */
-  {
-    TT_Face       face = (TT_Face)ttface;
-    FT_Memory     memory;
-    FT_Stream     stream;
-    SFNT_Service  sfnt;
-
-
-    if ( !face )
-      return;
-
-    memory = ttface->memory;
-    stream = ttface->stream;
-    sfnt   = (SFNT_Service)face->sfnt;
-
-    /* for `extended TrueType formats' (i.e. compressed versions) */
-    if ( face->extra.finalizer )
-      face->extra.finalizer( face->extra.data );
-
-    if ( sfnt )
-      sfnt->done_face( face );
-
-    /* freeing the locations table */
-    tt_face_done_loca( face );
-
-    tt_face_free_hdmx( face );
-
-    /* freeing the CVT */
-    FT_FREE( face->cvt );
-    face->cvt_size = 0;
-
-    /* freeing the programs */
-    FT_FRAME_RELEASE( face->font_program );
-    FT_FRAME_RELEASE( face->cvt_program );
-    face->font_program_size = 0;
-    face->cvt_program_size  = 0;
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    tt_done_blend( face );
-    face->blend = NULL;
-#endif
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                           SIZE  FUNCTIONS                             */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_size_run_fpgm                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Run the font program.                                              */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size     :: A handle to the size object.                           */
-  /*                                                                       */
-  /*    pedantic :: Set if bytecode execution should be pedantic.          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_run_fpgm( TT_Size  size,
-                    FT_Bool  pedantic )
-  {
-    TT_Face         face = (TT_Face)size->root.face;
-    TT_ExecContext  exec;
-    FT_Error        error;
-
-
-    exec = size->context;
-
-    error = TT_Load_Context( exec, face, size );
-    if ( error )
-      return error;
-
-    exec->callTop = 0;
-    exec->top     = 0;
-
-    exec->period    = 64;
-    exec->phase     = 0;
-    exec->threshold = 0;
-
-    exec->instruction_trap = FALSE;
-    exec->F_dot_P          = 0x4000L;
-
-    exec->pedantic_hinting = pedantic;
-
-    {
-      FT_Size_Metrics*  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;
-
-      tt_metrics->ppem  = 0;
-      tt_metrics->scale = 0;
-      tt_metrics->ratio = 0x10000L;
-    }
-
-    /* allow font program execution */
-    TT_Set_CodeRange( exec,
-                      tt_coderange_font,
-                      face->font_program,
-                      (FT_Long)face->font_program_size );
-
-    /* disable CVT and glyph programs coderange */
-    TT_Clear_CodeRange( exec, tt_coderange_cvt );
-    TT_Clear_CodeRange( exec, tt_coderange_glyph );
-
-    if ( face->font_program_size > 0 )
-    {
-      TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
-
-      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;
-
-    size->bytecode_ready = error;
-
-    if ( !error )
-      TT_Save_Context( exec, size );
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_size_run_prep                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Run the control value program.                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size     :: A handle to the size object.                           */
-  /*                                                                       */
-  /*    pedantic :: Set if bytecode execution should be pedantic.          */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_run_prep( TT_Size  size,
-                    FT_Bool  pedantic )
-  {
-    TT_Face         face = (TT_Face)size->root.face;
-    TT_ExecContext  exec;
-    FT_Error        error;
-
-
-    exec = size->context;
-
-    error = TT_Load_Context( exec, face, size );
-    if ( error )
-      return error;
-
-    exec->callTop = 0;
-    exec->top     = 0;
-
-    exec->instruction_trap = FALSE;
-
-    exec->pedantic_hinting = pedantic;
-
-    TT_Set_CodeRange( exec,
-                      tt_coderange_cvt,
-                      face->cvt_program,
-                      (FT_Long)face->cvt_program_size );
-
-    TT_Clear_CodeRange( exec, tt_coderange_glyph );
-
-    if ( face->cvt_program_size > 0 )
-    {
-      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;
-
-    size->cvt_ready = error;
-
-    /* UNDOCUMENTED!  The MS rasterizer doesn't allow the following */
-    /* graphics state variables to be modified by the CVT program.  */
-
-    exec->GS.dualVector.x = 0x4000;
-    exec->GS.dualVector.y = 0;
-    exec->GS.projVector.x = 0x4000;
-    exec->GS.projVector.y = 0x0;
-    exec->GS.freeVector.x = 0x4000;
-    exec->GS.freeVector.y = 0x0;
-
-    exec->GS.rp0 = 0;
-    exec->GS.rp1 = 0;
-    exec->GS.rp2 = 0;
-
-    exec->GS.gep0 = 1;
-    exec->GS.gep1 = 1;
-    exec->GS.gep2 = 1;
-
-    exec->GS.loop = 1;
-
-    /* save as default graphics state */
-    size->GS = exec->GS;
-
-    TT_Save_Context( exec, size );
-
-    return error;
-  }
-
-
-  static void
-  tt_size_done_bytecode( FT_Size  ftsize )
-  {
-    TT_Size    size   = (TT_Size)ftsize;
-    TT_Face    face   = (TT_Face)ftsize->face;
-    FT_Memory  memory = face->root.memory;
-
-    if ( size->context )
-    {
-      TT_Done_Context( size->context );
-      size->context = NULL;
-    }
-
-    FT_FREE( size->cvt );
-    size->cvt_size = 0;
-
-    /* free storage area */
-    FT_FREE( size->storage );
-    size->storage_size = 0;
-
-    /* twilight zone */
-    tt_glyphzone_done( &size->twilight );
-
-    FT_FREE( size->function_defs );
-    FT_FREE( size->instruction_defs );
-
-    size->num_function_defs    = 0;
-    size->max_function_defs    = 0;
-    size->num_instruction_defs = 0;
-    size->max_instruction_defs = 0;
-
-    size->max_func = 0;
-    size->max_ins  = 0;
-
-    size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
-  }
-
-
-  /* Initialize bytecode-related fields in the size object.       */
-  /* We do this only if bytecode interpretation is really needed. */
-  static FT_Error
-  tt_size_init_bytecode( FT_Size  ftsize,
-                         FT_Bool  pedantic )
-  {
-    FT_Error   error;
-    TT_Size    size = (TT_Size)ftsize;
-    TT_Face    face = (TT_Face)ftsize->face;
-    FT_Memory  memory = face->root.memory;
-
-    FT_UShort       n_twilight;
-    TT_MaxProfile*  maxp = &face->max_profile;
-
-
-    /* clean up bytecode related data */
-    FT_FREE( size->function_defs );
-    FT_FREE( size->instruction_defs );
-    FT_FREE( size->cvt );
-    FT_FREE( size->storage );
-
-    if ( size->context )
-      TT_Done_Context( size->context );
-    tt_glyphzone_done( &size->twilight );
-
-    size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
-
-    size->context = TT_New_Context( (TT_Driver)face->root.driver );
-
-    size->max_function_defs    = maxp->maxFunctionDefs;
-    size->max_instruction_defs = maxp->maxInstructionDefs;
-
-    size->num_function_defs    = 0;
-    size->num_instruction_defs = 0;
-
-    size->max_func = 0;
-    size->max_ins  = 0;
-
-    size->cvt_size     = face->cvt_size;
-    size->storage_size = maxp->maxStorage;
-
-    /* Set default metrics */
-    {
-      TT_Size_Metrics*  metrics = &size->ttmetrics;
-
-
-      metrics->rotated   = FALSE;
-      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 */
-    }
-
-    /* allocate function defs, instruction defs, cvt, and storage area */
-    if ( FT_NEW_ARRAY( size->function_defs,    size->max_function_defs    ) ||
-         FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
-         FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
-         FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
-      goto Exit;
-
-    /* reserve twilight zone */
-    n_twilight = maxp->maxTwilightPoints;
-
-    /* there are 4 phantom points (do we need this?) */
-    n_twilight += 4;
-
-    error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
-    if ( error )
-      goto Exit;
-
-    size->twilight.n_points = n_twilight;
-
-    size->GS = tt_default_graphics_state;
-
-    /* set `face->interpreter' according to the debug hook present */
-    {
-      FT_Library  library = face->root.driver->root.library;
-
-
-      face->interpreter = (TT_Interpreter)
-                            library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE];
-      if ( !face->interpreter )
-        face->interpreter = (TT_Interpreter)TT_RunIns;
-    }
-
-    /* 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 )
-      tt_size_done_bytecode( ftsize );
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_ready_bytecode( TT_Size  size,
-                          FT_Bool  pedantic )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( size->bytecode_ready < 0 )
-      error = tt_size_init_bytecode( (FT_Size)size, pedantic );
-    else
-      error = size->bytecode_ready;
-
-    if ( error )
-      goto Exit;
-
-    /* rescale CVT when needed */
-    if ( size->cvt_ready < 0 )
-    {
-      FT_UInt  i;
-      TT_Face  face = (TT_Face)size->root.face;
-
-
-      /* Scale the cvt values to the new ppem.          */
-      /* We use by default the y ppem to scale the CVT. */
-      for ( i = 0; i < size->cvt_size; i++ )
-        size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );
-
-      /* all twilight points are originally zero */
-      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
-      {
-        size->twilight.org[i].x = 0;
-        size->twilight.org[i].y = 0;
-        size->twilight.cur[i].x = 0;
-        size->twilight.cur[i].y = 0;
-      }
-
-      /* clear storage area */
-      for ( i = 0; i < (FT_UInt)size->storage_size; i++ )
-        size->storage[i] = 0;
-
-      size->GS = tt_default_graphics_state;
-
-      error = tt_size_run_prep( size, pedantic );
-    }
-    else
-      error = size->cvt_ready;
-
-  Exit:
-    return error;
-  }
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_size_init                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a new TrueType size object.                             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    size :: A handle to the size object.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_init( FT_Size  ttsize )           /* TT_Size */
-  {
-    TT_Size   size  = (TT_Size)ttsize;
-    FT_Error  error = FT_Err_Ok;
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    size->bytecode_ready = -1;
-    size->cvt_ready      = -1;
-#endif
-
-    size->ttmetrics.valid = FALSE;
-    size->strike_index    = 0xFFFFFFFFUL;
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_size_done                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType size object finalizer.                                */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size :: A handle to the target size object.                        */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_size_done( FT_Size  ttsize )           /* TT_Size */
-  {
-    TT_Size  size = (TT_Size)ttsize;
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    tt_size_done_bytecode( ttsize );
-#endif
-
-    size->ttmetrics.valid = FALSE;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_size_reset                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Reset a TrueType size when resolutions and character dimensions    */
-  /*    have been changed.                                                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    size        :: A handle to the target size object.                 */
-  /*                                                                       */
-  /*    only_height :: Only recompute ascender, descender, and height.     */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_size_reset( TT_Size  size,
-                 FT_Bool  only_height )
-  {
-    TT_Face           face;
-    FT_Size_Metrics*  metrics;
-
-
-    size->ttmetrics.valid = FALSE;
-
-    face = (TT_Face)size->root.face;
-
-    metrics = &size->metrics;
-
-    /* copy the result from base layer */
-    *metrics = size->root.metrics;
-
-    if ( metrics->x_ppem < 1 || metrics->y_ppem < 1 )
-      return FT_THROW( Invalid_PPem );
-
-    /* This bit flag, if set, indicates that the ppems must be       */
-    /* rounded to integers.  Nearly all TrueType fonts have this bit */
-    /* set, as hinting won't work really well otherwise.             */
-    /*                                                               */
-    if ( face->header.Flags & 8 )
-    {
-      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 ) );
-    }
-
-    size->ttmetrics.valid = TRUE;
-
-    if ( only_height )
-      return FT_Err_Ok;
-
-    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 );
-
-      metrics->max_advance =
-        FT_PIX_ROUND( FT_MulFix( face->root.max_advance_width,
-                                 metrics->x_scale ) );
-    }
-
-    /* compute new transformation */
-    if ( metrics->x_ppem >= metrics->y_ppem )
-    {
-      size->ttmetrics.scale   = metrics->x_scale;
-      size->ttmetrics.ppem    = metrics->x_ppem;
-      size->ttmetrics.x_ratio = 0x10000L;
-      size->ttmetrics.y_ratio = FT_DivFix( metrics->y_ppem,
-                                           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.y_ratio = 0x10000L;
-    }
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-    size->cvt_ready = -1;
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_driver_init                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a given TrueType driver object.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target driver object.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_driver_init( FT_Module  ttdriver )     /* TT_Driver */
-  {
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    TT_Driver  driver = (TT_Driver)ttdriver;
-
-    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 */
-
-    FT_UNUSED( ttdriver );
-
-#endif /* !TT_USE_BYTECODE_INTERPRETER */
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_driver_done                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalize a given TrueType driver.                                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target TrueType driver.                  */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_driver_done( FT_Module  ttdriver )     /* TT_Driver */
-  {
-    FT_UNUSED( ttdriver );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_slot_init                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initialize a new slot object.                                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    slot :: A handle to the slot object.                               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_slot_init( FT_GlyphSlot  slot )
-  {
-    return FT_GlyphLoader_CreateExtra( slot->internal->loader );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttobjs.h b/third_party/freetype/src/truetype/ttobjs.h
deleted file mode 100644
index 65929e5..0000000
--- a/third_party/freetype/src/truetype/ttobjs.h
+++ /dev/null
@@ -1,424 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttobjs.h                                                               */
-/*                                                                         */
-/*    Objects manager (specification).                                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTOBJS_H_
-#define TTOBJS_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    TT_Driver                                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a TrueType driver object.                              */
-  /*                                                                       */
-  typedef struct TT_DriverRec_*  TT_Driver;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    TT_GlyphSlot                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a TrueType glyph slot object.                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This is a direct typedef of FT_GlyphSlot, as there is nothing      */
-  /*    specific about the TrueType glyph slot.                            */
-  /*                                                                       */
-  typedef FT_GlyphSlot  TT_GlyphSlot;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    TT_GraphicsState                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The TrueType graphics state used during bytecode interpretation.   */
-  /*                                                                       */
-  typedef struct  TT_GraphicsState_
-  {
-    FT_UShort      rp0;
-    FT_UShort      rp1;
-    FT_UShort      rp2;
-
-    FT_UnitVector  dualVector;
-    FT_UnitVector  projVector;
-    FT_UnitVector  freeVector;
-
-    FT_Long        loop;
-    FT_F26Dot6     minimum_distance;
-    FT_Int         round_state;
-
-    FT_Bool        auto_flip;
-    FT_F26Dot6     control_value_cutin;
-    FT_F26Dot6     single_width_cutin;
-    FT_F26Dot6     single_width_value;
-    FT_UShort      delta_base;
-    FT_UShort      delta_shift;
-
-    FT_Byte        instruct_control;
-    /* According to Greg Hitchcock from Microsoft, the `scan_control'     */
-    /* variable as documented in the TrueType specification is a 32-bit   */
-    /* integer; the high-word part holds the SCANTYPE value, the low-word */
-    /* part the SCANCTRL value.  We separate it into two fields.          */
-    FT_Bool        scan_control;
-    FT_Int         scan_type;
-
-    FT_UShort      gep0;
-    FT_UShort      gep1;
-    FT_UShort      gep2;
-
-  } TT_GraphicsState;
-
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-  FT_LOCAL( void )
-  tt_glyphzone_done( TT_GlyphZone  zone );
-
-  FT_LOCAL( FT_Error )
-  tt_glyphzone_new( FT_Memory     memory,
-                    FT_UShort     maxPoints,
-                    FT_Short      maxContours,
-                    TT_GlyphZone  zone );
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*  EXECUTION SUBTABLES                                                  */
-  /*                                                                       */
-  /*  These sub-tables relate to instruction execution.                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#define TT_MAX_CODE_RANGES  3
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* There can only be 3 active code ranges at once:                       */
-  /*   - the Font Program                                                  */
-  /*   - the CVT Program                                                   */
-  /*   - a glyph's instructions set                                        */
-  /*                                                                       */
-  typedef enum  TT_CodeRange_Tag_
-  {
-    tt_coderange_none = 0,
-    tt_coderange_font,
-    tt_coderange_cvt,
-    tt_coderange_glyph
-
-  } TT_CodeRange_Tag;
-
-
-  typedef struct  TT_CodeRange_
-  {
-    FT_Byte*  base;
-    FT_Long   size;
-
-  } TT_CodeRange;
-
-  typedef TT_CodeRange  TT_CodeRangeTable[TT_MAX_CODE_RANGES];
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Defines a function/instruction definition record.                     */
-  /*                                                                       */
-  typedef struct  TT_DefRecord_
-  {
-    FT_Int    range;          /* in which code range is it located?     */
-    FT_Long   start;          /* where does it start?                   */
-    FT_Long   end;            /* where does it end?                     */
-    FT_UInt   opc;            /* function #, or instruction code        */
-    FT_Bool   active;         /* is it active?                          */
-    FT_Bool   inline_delta;   /* is function that defines inline delta? */
-    FT_ULong  sph_fdef_flags; /* flags to identify special functions    */
-
-  } TT_DefRecord, *TT_DefArray;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Subglyph transformation record.                                       */
-  /*                                                                       */
-  typedef struct  TT_Transform_
-  {
-    FT_Fixed    xx, xy;     /* transformation matrix coefficients */
-    FT_Fixed    yx, yy;
-    FT_F26Dot6  ox, oy;     /* offsets                            */
-
-  } TT_Transform;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* A note regarding non-squared pixels:                                  */
-  /*                                                                       */
-  /* (This text will probably go into some docs at some time; for now, it  */
-  /* is kept here to explain some definitions in the TT_Size_Metrics       */
-  /* record).                                                              */
-  /*                                                                       */
-  /* The CVT is a one-dimensional array containing values that control     */
-  /* certain important characteristics in a font, like the height of all   */
-  /* capitals, all lowercase letter, default spacing or stem width/height. */
-  /*                                                                       */
-  /* These values are found in FUnits in the font file, and must be scaled */
-  /* to pixel coordinates before being used by the CVT and glyph programs. */
-  /* Unfortunately, when using distinct x and y resolutions (or distinct x */
-  /* and y pointsizes), there are two possible scalings.                   */
-  /*                                                                       */
-  /* A first try was to implement a `lazy' scheme where all values were    */
-  /* scaled when first used.  However, while some values are always used   */
-  /* in the same direction, some others are used under many different      */
-  /* circumstances and orientations.                                       */
-  /*                                                                       */
-  /* I have found a simpler way to do the same, and it even seems to work  */
-  /* in most of the cases:                                                 */
-  /*                                                                       */
-  /* - All CVT values are scaled to the maximum ppem size.                 */
-  /*                                                                       */
-  /* - When performing a read or write in the CVT, a ratio factor is used  */
-  /*   to perform adequate scaling.  Example:                              */
-  /*                                                                       */
-  /*     x_ppem = 14                                                       */
-  /*     y_ppem = 10                                                       */
-  /*                                                                       */
-  /*   We choose ppem = x_ppem = 14 as the CVT scaling size.  All cvt      */
-  /*   entries are scaled to it.                                           */
-  /*                                                                       */
-  /*     x_ratio = 1.0                                                     */
-  /*     y_ratio = y_ppem/ppem (< 1.0)                                     */
-  /*                                                                       */
-  /*   We compute the current ratio like:                                  */
-  /*                                                                       */
-  /*   - If projVector is horizontal,                                      */
-  /*       ratio = x_ratio = 1.0                                           */
-  /*                                                                       */
-  /*   - if projVector is vertical,                                        */
-  /*       ratio = y_ratio                                                 */
-  /*                                                                       */
-  /*   - else,                                                             */
-  /*       ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */
-  /*                                                                       */
-  /*   Reading a cvt value returns                                         */
-  /*     ratio * cvt[index]                                                */
-  /*                                                                       */
-  /*   Writing a cvt value in pixels:                                      */
-  /*     cvt[index] / ratio                                                */
-  /*                                                                       */
-  /*   The current ppem is simply                                          */
-  /*     ratio * ppem                                                      */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Metrics used by the TrueType size and context objects.                */
-  /*                                                                       */
-  typedef struct  TT_Size_Metrics_
-  {
-    /* for non-square pixels */
-    FT_Long     x_ratio;
-    FT_Long     y_ratio;
-
-    FT_UShort   ppem;               /* maximum ppem size              */
-    FT_Long     ratio;              /* current ratio                  */
-    FT_Fixed    scale;
-
-    FT_F26Dot6  compensations[4];   /* device-specific compensations  */
-
-    FT_Bool     valid;
-
-    FT_Bool     rotated;            /* `is the glyph rotated?'-flag   */
-    FT_Bool     stretched;          /* `is the glyph stretched?'-flag */
-
-  } TT_Size_Metrics;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TrueType size class.                                                  */
-  /*                                                                       */
-  typedef struct  TT_SizeRec_
-  {
-    FT_SizeRec         root;
-
-    /* we have our own copy of metrics so that we can modify */
-    /* it without affecting auto-hinting (when used)         */
-    FT_Size_Metrics    metrics;
-
-    TT_Size_Metrics    ttmetrics;
-
-    FT_ULong           strike_index;      /* 0xFFFFFFFF to indicate invalid */
-
-#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  */
-
-    FT_UInt            num_instruction_defs;  /* number of ins. definitions */
-    FT_UInt            max_instruction_defs;
-    TT_DefArray        instruction_defs;      /* table of ins. definitions  */
-
-    FT_UInt            max_func;
-    FT_UInt            max_ins;
-
-    TT_CodeRangeTable  codeRangeTable;
-
-    TT_GraphicsState   GS;
-
-    FT_ULong           cvt_size;      /* the scaled control value table */
-    FT_Long*           cvt;
-
-    FT_UShort          storage_size; /* The storage area is now part of */
-    FT_Long*           storage;      /* the instance                    */
-
-    TT_GlyphZoneRec    twilight;     /* The instance's twilight zone    */
-
-    TT_ExecContext     context;
-
-    /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */
-    /* otherwise it is the returned error code                  */
-    FT_Error           bytecode_ready;
-    FT_Error           cvt_ready;
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-  } TT_SizeRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* TrueType driver class.                                                */
-  /*                                                                       */
-  typedef struct  TT_DriverRec_
-  {
-    FT_DriverRec  root;
-
-    TT_GlyphZoneRec  zone;     /* glyph loader points zone */
-
-    FT_UInt  interpreter_version;
-
-  } TT_DriverRec;
-
-
-  /* Note: All of the functions below (except tt_size_reset()) are used    */
-  /* as function pointers in a FT_Driver_ClassRec.  Therefore their        */
-  /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face,  */
-  /* TT_Size, etc., so that the compiler can confirm that the types and    */
-  /* number of parameters are correct.  In all cases the FT_xxx types are  */
-  /* cast to their TT_xxx counterparts inside the functions since FreeType */
-  /* will always use the TT driver to create them.                         */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Face functions                                                        */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  tt_face_init( FT_Stream      stream,
-                FT_Face        ttface,      /* TT_Face */
-                FT_Int         face_index,
-                FT_Int         num_params,
-                FT_Parameter*  params );
-
-  FT_LOCAL( void )
-  tt_face_done( FT_Face  ttface );          /* TT_Face */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Size functions                                                        */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  tt_size_init( FT_Size  ttsize );          /* TT_Size */
-
-  FT_LOCAL( void )
-  tt_size_done( FT_Size  ttsize );          /* TT_Size */
-
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-  FT_LOCAL( FT_Error )
-  tt_size_run_fpgm( TT_Size  size,
-                    FT_Bool  pedantic );
-
-  FT_LOCAL( FT_Error )
-  tt_size_run_prep( TT_Size  size,
-                    FT_Bool  pedantic );
-
-  FT_LOCAL( FT_Error )
-  tt_size_ready_bytecode( TT_Size  size,
-                          FT_Bool  pedantic );
-
-#endif /* TT_USE_BYTECODE_INTERPRETER */
-
-  FT_LOCAL( FT_Error )
-  tt_size_reset( TT_Size  size,
-                 FT_Bool  only_height );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Driver functions                                                      */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  tt_driver_init( FT_Module  ttdriver );    /* TT_Driver */
-
-  FT_LOCAL( void )
-  tt_driver_done( FT_Module  ttdriver );    /* TT_Driver */
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Slot functions                                                        */
-  /*                                                                       */
-  FT_LOCAL( FT_Error )
-  tt_slot_init( FT_GlyphSlot  slot );
-
-
-  /* auxiliary */
-#define IS_HINTED( flags )  ( ( flags & FT_LOAD_NO_HINTING ) == 0 )
-
-
-FT_END_HEADER
-
-#endif /* TTOBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttpic.c b/third_party/freetype/src/truetype/ttpic.c
deleted file mode 100644
index 66bd7e1..0000000
--- a/third_party/freetype/src/truetype/ttpic.c
+++ /dev/null
@@ -1,101 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpic.c                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services for truetype module. */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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_OBJECTS_H
-#include "ttpic.h"
-#include "tterrors.h"
-
-
-#ifdef FT_CONFIG_OPTION_PIC
-
-  /* forward declaration of PIC init functions from ttdriver.c */
-  FT_Error
-  FT_Create_Class_tt_services( FT_Library           library,
-                               FT_ServiceDescRec**  output_class );
-  void
-  FT_Destroy_Class_tt_services( FT_Library          library,
-                                FT_ServiceDescRec*  clazz );
-  void
-  FT_Init_Class_tt_service_gx_multi_masters(
-    FT_Service_MultiMastersRec*  sv_mm );
-  void
-  FT_Init_Class_tt_service_truetype_glyf(
-    FT_Service_TTGlyfRec*  sv_ttglyf );
-
-
-  void
-  tt_driver_class_pic_free( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Memory          memory        = library->memory;
-
-
-    if ( pic_container->truetype )
-    {
-      TTModulePIC*  container = (TTModulePIC*)pic_container->truetype;
-
-
-      if ( container->tt_services )
-        FT_Destroy_Class_tt_services( library, container->tt_services );
-      container->tt_services = NULL;
-      FT_FREE( container );
-      pic_container->truetype = NULL;
-    }
-  }
-
-
-  FT_Error
-  tt_driver_class_pic_init( FT_Library  library )
-  {
-    FT_PIC_Container*  pic_container = &library->pic_container;
-    FT_Error           error         = FT_Err_Ok;
-    TTModulePIC*       container     = NULL;
-    FT_Memory          memory        = library->memory;
-
-
-    /* allocate pointer, clear and set global container pointer */
-    if ( FT_ALLOC( container, sizeof ( *container ) ) )
-      return error;
-    FT_MEM_SET( container, 0, sizeof ( *container ) );
-    pic_container->truetype = container;
-
-    /* initialize pointer table - this is how the module usually */
-    /* expects this data                                         */
-    error = FT_Create_Class_tt_services( library,
-                                         &container->tt_services );
-    if ( error )
-      goto Exit;
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    FT_Init_Class_tt_service_gx_multi_masters(
-      &container->tt_service_gx_multi_masters );
-#endif
-    FT_Init_Class_tt_service_truetype_glyf(
-      &container->tt_service_truetype_glyf );
-
-  Exit:
-    if ( error )
-      tt_driver_class_pic_free( library );
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttpic.h b/third_party/freetype/src/truetype/ttpic.h
deleted file mode 100644
index 1410cd7..0000000
--- a/third_party/freetype/src/truetype/ttpic.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpic.h                                                                */
-/*                                                                         */
-/*    The FreeType position independent code services for truetype module. */
-/*                                                                         */
-/*  Copyright 2009-2017 by                                                 */
-/*  Oran Agra and Mickey Gabel.                                            */
-/*                                                                         */
-/*  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 TTPIC_H_
-#define TTPIC_H_
-
-
-#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_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;
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    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;
-
-  } TTModulePIC;
-
-
-#define GET_PIC( lib )                                      \
-          ( (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                       \
-          ( GET_PIC( library )->tt_service_truetype_glyf )
-#define TT_SERVICE_PROPERTIES_GET                       \
-          ( GET_PIC( library )->tt_service_properties )
-
-
-  /* see ttpic.c for the implementation */
-  void
-  tt_driver_class_pic_free( FT_Library  library );
-
-  FT_Error
-  tt_driver_class_pic_init( FT_Library  library );
-
-FT_END_HEADER
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
- /* */
-
-#endif /* TTPIC_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttpload.c b/third_party/freetype/src/truetype/ttpload.c
deleted file mode 100644
index 70ac15d..0000000
--- a/third_party/freetype/src/truetype/ttpload.c
+++ /dev/null
@@ -1,642 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpload.c                                                              */
-/*                                                                         */
-/*    TrueType-specific tables loader (body).                              */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-
-#include "ttpload.h"
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-#include "ttgxvar.h"
-#endif
-
-#include "tterrors.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_ttpload
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_loca                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the locations table.                                          */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: The input stream.                                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_loca( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error  error;
-    FT_ULong  table_len;
-    FT_Int    shift;
-
-
-    /* we need the size of the `glyf' table for malformed `loca' tables */
-    error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len );
-
-    /* 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_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 );
-    if ( error )
-    {
-      error = FT_THROW( Locations_Missing );
-      goto Exit;
-    }
-
-    if ( face->header.Index_To_Loc_Format != 0 )
-    {
-      shift = 2;
-
-      if ( table_len >= 0x40000L )
-      {
-        FT_TRACE2(( "table too large\n" ));
-        table_len = 0x3FFFFL;
-      }
-      face->num_locations = table_len >> shift;
-    }
-    else
-    {
-      shift = 1;
-
-      if ( table_len >= 0x20000L )
-      {
-        FT_TRACE2(( "table too large\n" ));
-        table_len = 0x1FFFFL;
-      }
-      face->num_locations = table_len >> shift;
-    }
-
-    if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 )
-    {
-      FT_TRACE2(( "glyph count mismatch!  loca: %d, maxp: %d\n",
-                  face->num_locations - 1, face->root.num_glyphs ));
-
-      /* we only handle the case where `maxp' gives a larger value */
-      if ( face->num_locations <= (FT_ULong)face->root.num_glyphs )
-      {
-        FT_ULong  new_loca_len =
-                    ( (FT_ULong)face->root.num_glyphs + 1 ) << shift;
-
-        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_Bool  found = 0;
-
-
-        /* compute the distance to next table in font file */
-        for ( ; entry < limit; entry++ )
-        {
-          FT_Long  diff = (FT_Long)entry->Offset - pos;
-
-
-          if ( diff > 0 && diff < dist )
-          {
-            dist  = diff;
-            found = 1;
-          }
-        }
-
-        if ( !found )
-        {
-          /* `loca' is the last table */
-          dist = (FT_Long)stream->size - pos;
-        }
-
-        if ( new_loca_len <= (FT_ULong)dist )
-        {
-          face->num_locations = (FT_ULong)face->root.num_glyphs + 1;
-          table_len           = new_loca_len;
-
-          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 ));
-        }
-      }
-    }
-
-    /*
-     * Extract the frame.  We don't need to decompress it since
-     * we are able to parse it directly.
-     */
-    if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) )
-      goto Exit;
-
-    FT_TRACE2(( "loaded\n" ));
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_ULong )
-  tt_face_get_location( TT_Face   face,
-                        FT_UInt   gindex,
-                        FT_UInt  *asize )
-  {
-    FT_ULong  pos1, pos2;
-    FT_Byte*  p;
-    FT_Byte*  p_limit;
-
-
-    pos1 = pos2 = 0;
-
-    if ( gindex < face->num_locations )
-    {
-      if ( face->header.Index_To_Loc_Format != 0 )
-      {
-        p       = face->glyph_locations + gindex * 4;
-        p_limit = face->glyph_locations + face->num_locations * 4;
-
-        pos1 = FT_NEXT_ULONG( p );
-        pos2 = pos1;
-
-        if ( p + 4 <= p_limit )
-          pos2 = FT_NEXT_ULONG( p );
-      }
-      else
-      {
-        p       = face->glyph_locations + gindex * 2;
-        p_limit = face->glyph_locations + face->num_locations * 2;
-
-        pos1 = FT_NEXT_USHORT( p );
-        pos2 = pos1;
-
-        if ( p + 2 <= p_limit )
-          pos2 = FT_NEXT_USHORT( p );
-
-        pos1 <<= 1;
-        pos2 <<= 1;
-      }
-    }
-
-    /* Check broken location data. */
-    if ( pos1 > face->glyf_len )
-    {
-      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",
-                  pos1, gindex, face->glyf_len ));
-      *asize = 0;
-      return 0;
-    }
-
-    if ( pos2 > face->glyf_len )
-    {
-      /* We try to sanitize the last `loca' entry. */
-      if ( gindex == face->num_locations - 1 )
-      {
-        FT_TRACE1(( "tt_face_get_location:"
-                    " too large offset (0x%08lx) found for glyph index %ld,\n"
-                    "                     "
-                    " truncating at the end of `glyf' table (0x%08lx)\n",
-                    pos2, gindex + 1, face->glyf_len ));
-        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 */
-    /* an entry as the difference between the current and the next  */
-    /* position.  However, there do exist (malformed) fonts which   */
-    /* don't obey this rule, so we are only able to provide an      */
-    /* upper bound for the size.                                    */
-    /*                                                              */
-    /* We get (intentionally) a wrong, non-zero result in case the  */
-    /* `glyf' table is missing.                                     */
-    if ( pos2 >= pos1 )
-      *asize = (FT_UInt)( pos2 - pos1 );
-    else
-      *asize = (FT_UInt)( face->glyf_len - pos1 );
-
-    return pos1;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_done_loca( TT_Face  face )
-  {
-    FT_Stream  stream = face->root.stream;
-
-
-    FT_FRAME_RELEASE( face->glyph_locations );
-    face->num_locations = 0;
-  }
-
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_cvt                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the control value table into a face object.                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_cvt( TT_Face    face,
-                    FT_Stream  stream )
-  {
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-    FT_ULong   table_len;
-
-
-    FT_TRACE2(( "CVT " ));
-
-    error = face->goto_table( face, TTAG_cvt, stream, &table_len );
-    if ( error )
-    {
-      FT_TRACE2(( "is missing\n" ));
-
-      face->cvt_size = 0;
-      face->cvt      = NULL;
-      error          = FT_Err_Ok;
-
-      goto Exit;
-    }
-
-    face->cvt_size = table_len / 2;
-
-    if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) )
-      goto Exit;
-
-    if ( FT_FRAME_ENTER( face->cvt_size * 2L ) )
-      goto Exit;
-
-    {
-      FT_Short*  cur   = face->cvt;
-      FT_Short*  limit = cur + face->cvt_size;
-
-
-      for ( ; cur < limit; cur++ )
-        *cur = FT_GET_SHORT();
-    }
-
-    FT_FRAME_EXIT();
-    FT_TRACE2(( "loaded\n" ));
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-    if ( face->doblend )
-      error = tt_face_vary_cvt( face, stream );
-#endif
-
-  Exit:
-    return error;
-
-#else /* !TT_USE_BYTECODE_INTERPRETER */
-
-    FT_UNUSED( face   );
-    FT_UNUSED( stream );
-
-    return FT_Err_Ok;
-
-#endif
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_fpgm                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the font program.                                             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_fpgm( TT_Face    face,
-                     FT_Stream  stream )
-  {
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    FT_Error  error;
-    FT_ULong  table_len;
-
-
-    FT_TRACE2(( "Font program " ));
-
-    /* The font program is optional */
-    error = face->goto_table( face, TTAG_fpgm, stream, &table_len );
-    if ( error )
-    {
-      face->font_program      = NULL;
-      face->font_program_size = 0;
-      error                   = FT_Err_Ok;
-
-      FT_TRACE2(( "is missing\n" ));
-    }
-    else
-    {
-      face->font_program_size = table_len;
-      if ( FT_FRAME_EXTRACT( table_len, face->font_program ) )
-        goto Exit;
-
-      FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size ));
-    }
-
-  Exit:
-    return error;
-
-#else /* !TT_USE_BYTECODE_INTERPRETER */
-
-    FT_UNUSED( face   );
-    FT_UNUSED( stream );
-
-    return FT_Err_Ok;
-
-#endif
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_prep                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the cvt program.                                              */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_prep( TT_Face    face,
-                     FT_Stream  stream )
-  {
-#ifdef TT_USE_BYTECODE_INTERPRETER
-
-    FT_Error  error;
-    FT_ULong  table_len;
-
-
-    FT_TRACE2(( "Prep program " ));
-
-    error = face->goto_table( face, TTAG_prep, stream, &table_len );
-    if ( error )
-    {
-      face->cvt_program      = NULL;
-      face->cvt_program_size = 0;
-      error                  = FT_Err_Ok;
-
-      FT_TRACE2(( "is missing\n" ));
-    }
-    else
-    {
-      face->cvt_program_size = table_len;
-      if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) )
-        goto Exit;
-
-      FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size ));
-    }
-
-  Exit:
-    return error;
-
-#else /* !TT_USE_BYTECODE_INTERPRETER */
-
-    FT_UNUSED( face   );
-    FT_UNUSED( stream );
-
-    return FT_Err_Ok;
-
-#endif
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_load_hdmx                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Load the `hdmx' table into the face object.                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_hdmx( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error   error;
-    FT_Memory  memory = stream->memory;
-    FT_UInt    nn, num_records;
-    FT_ULong   table_size, record_size;
-    FT_Byte*   p;
-    FT_Byte*   limit;
-
-
-    /* this table is optional */
-    error = face->goto_table( face, TTAG_hdmx, stream, &table_size );
-    if ( error || table_size < 8 )
-      return FT_Err_Ok;
-
-    if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) )
-      goto Exit;
-
-    p     = face->hdmx_table;
-    limit = p + table_size;
-
-    /* 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 );
-
-    /* The maximum number of bytes in an hdmx device record is the */
-    /* maximum number of glyphs + 2; this is 0xFFFF + 2, thus      */
-    /* explaining why `record_size' is a long (which we read as    */
-    /* unsigned long for convenience).  In practice, two bytes are */
-    /* sufficient to hold the size value.                          */
-    /*                                                             */
-    /* There are at least two fonts, HANNOM-A and HANNOM-B version */
-    /* 2.0 (2005), which get this wrong: The upper two bytes of    */
-    /* the size value are set to 0xFF instead of 0x00.  We catch   */
-    /* and fix this.                                               */
-
-    if ( record_size >= 0xFFFF0000UL )
-      record_size &= 0xFFFFU;
-
-    /* The limit for `num_records' is a heuristic value. */
-    if ( num_records > 255              ||
-         ( num_records > 0            &&
-           ( record_size > 0x10001L ||
-             record_size < 4        ) ) )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto Fail;
-    }
-
-    if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) )
-      goto Fail;
-
-    for ( nn = 0; nn < num_records; nn++ )
-    {
-      if ( p + record_size > limit )
-        break;
-
-      face->hdmx_record_sizes[nn] = p[0];
-      p                          += record_size;
-    }
-
-    face->hdmx_record_count = nn;
-    face->hdmx_table_size   = table_size;
-    face->hdmx_record_size  = record_size;
-
-  Exit:
-    return error;
-
-  Fail:
-    FT_FRAME_RELEASE( face->hdmx_table );
-    face->hdmx_table_size = 0;
-    goto Exit;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_free_hdmx( TT_Face  face )
-  {
-    FT_Stream  stream = face->root.stream;
-    FT_Memory  memory = stream->memory;
-
-
-    FT_FREE( face->hdmx_record_sizes );
-    FT_FRAME_RELEASE( face->hdmx_table );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Return the advance width table for a given pixel size if it is found  */
-  /* in the font's `hdmx' table (if any).                                  */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Byte* )
-  tt_face_get_device_metrics( TT_Face  face,
-                              FT_UInt  ppem,
-                              FT_UInt  gindex )
-  {
-    FT_UInt   nn;
-    FT_Byte*  result      = NULL;
-    FT_ULong  record_size = face->hdmx_record_size;
-    FT_Byte*  record      = face->hdmx_table + 8;
-
-
-    for ( nn = 0; nn < face->hdmx_record_count; nn++ )
-      if ( face->hdmx_record_sizes[nn] == ppem )
-      {
-        gindex += 2;
-        if ( gindex < record_size )
-          result = record + nn * record_size + gindex;
-        break;
-      }
-
-    return result;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttpload.h b/third_party/freetype/src/truetype/ttpload.h
deleted file mode 100644
index 79079f3..0000000
--- a/third_party/freetype/src/truetype/ttpload.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttpload.h                                                              */
-/*                                                                         */
-/*    TrueType-specific tables loader (specification).                     */
-/*                                                                         */
-/*  Copyright 1996-2017 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 TTPLOAD_H_
-#define TTPLOAD_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_loca( TT_Face    face,
-                     FT_Stream  stream );
-
-  FT_LOCAL( FT_ULong )
-  tt_face_get_location( TT_Face   face,
-                        FT_UInt   gindex,
-                        FT_UInt  *asize );
-
-  FT_LOCAL( void )
-  tt_face_done_loca( TT_Face  face );
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_cvt( TT_Face    face,
-                    FT_Stream  stream );
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_fpgm( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_prep( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_hdmx( TT_Face    face,
-                     FT_Stream  stream );
-
-
-  FT_LOCAL( void )
-  tt_face_free_hdmx( TT_Face  face );
-
-
-  FT_LOCAL( FT_Byte* )
-  tt_face_get_device_metrics( TT_Face    face,
-                              FT_UInt    ppem,
-                              FT_UInt    gindex );
-
-FT_END_HEADER
-
-#endif /* TTPLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttsubpix.c b/third_party/freetype/src/truetype/ttsubpix.c
deleted file mode 100644
index 5d803cd..0000000
--- a/third_party/freetype/src/truetype/ttsubpix.c
+++ /dev/null
@@ -1,1011 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttsubpix.c                                                             */
-/*                                                                         */
-/*    TrueType Subpixel Hinting.                                           */
-/*                                                                         */
-/*  Copyright 2010-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_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 "ttsubpix.h"
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* These rules affect how the TT Interpreter does hinting, with the      */
-  /* goal of doing subpixel hinting by (in general) ignoring x moves.      */
-  /* Some of these rules are fixes that go above and beyond the            */
-  /* stated techniques in the MS whitepaper on Cleartype, due to           */
-  /* artifacts in many glyphs.  So, these rules make some glyphs render    */
-  /* better than they do in the MS rasterizer.                             */
-  /*                                                                       */
-  /* "" string or 0 int/char indicates to apply to all glyphs.             */
-  /* "-" used as dummy placeholders, but any non-matching string works.    */
-  /*                                                                       */
-  /* Some of this could arguably be implemented in fontconfig, however:    */
-  /*                                                                       */
-  /*  - Fontconfig can't set things on a glyph-by-glyph basis.             */
-  /*  - The tweaks that happen here are very low-level, from an average    */
-  /*    user's point of view and are best implemented in the hinter.       */
-  /*                                                                       */
-  /* The goal is to make the subpixel hinting techniques as generalized    */
-  /* as possible across all fonts to prevent the need for extra rules such */
-  /* as these.                                                             */
-  /*                                                                       */
-  /* The rule structure is designed so that entirely new rules can easily  */
-  /* be added when a new compatibility feature is discovered.              */
-  /*                                                                       */
-  /* The rule structures could also use some enhancement to handle ranges. */
-  /*                                                                       */
-  /*     ****************** WORK IN PROGRESS *******************           */
-  /*                                                                       */
-
-  /* These are `classes' of fonts that can be grouped together and used in */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define FAMILY_CLASS_RULES_SIZE  7
-
-  static const SPH_Font_Class  FAMILY_CLASS_Rules
-                               [FAMILY_CLASS_RULES_SIZE] =
-  {
-    { "MS Legacy Fonts",
-      { "Aharoni",
-        "Andale Mono",
-        "Andalus",
-        "Angsana New",
-        "AngsanaUPC",
-        "Arabic Transparent",
-        "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Batang",
-        "Browallia New",
-        "BrowalliaUPC",
-        "Comic Sans MS",
-        "Cordia New",
-        "CordiaUPC",
-        "Courier New",
-        "DFKai-SB",
-        "David Transparent",
-        "David",
-        "DilleniaUPC",
-        "Estrangelo Edessa",
-        "EucrosiaUPC",
-        "FangSong_GB2312",
-        "Fixed Miriam Transparent",
-        "FrankRuehl",
-        "Franklin Gothic Medium",
-        "FreesiaUPC",
-        "Garamond",
-        "Gautami",
-        "Georgia",
-        "Gulim",
-        "Impact",
-        "IrisUPC",
-        "JasmineUPC",
-        "KaiTi_GB2312",
-        "KodchiangUPC",
-        "Latha",
-        "Levenim MT",
-        "LilyUPC",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "MS Gothic",
-        "MS Mincho",
-        "MV Boli",
-        "Mangal",
-        "Marlett",
-        "Microsoft Sans Serif",
-        "Mingliu",
-        "Miriam Fixed",
-        "Miriam Transparent",
-        "Miriam",
-        "Narkisim",
-        "Palatino Linotype",
-        "Raavi",
-        "Rod Transparent",
-        "Rod",
-        "Shruti",
-        "SimHei",
-        "Simplified Arabic Fixed",
-        "Simplified Arabic",
-        "Simsun",
-        "Sylfaen",
-        "Symbol",
-        "Tahoma",
-        "Times New Roman",
-        "Traditional Arabic",
-        "Trebuchet MS",
-        "Tunga",
-        "Verdana",
-        "Webdings",
-        "Wingdings",
-        "",
-      },
-    },
-    { "Core MS Legacy Fonts",
-      { "Arial Black",
-        "Arial Narrow",
-        "Arial Unicode MS",
-        "Arial",
-        "Comic Sans MS",
-        "Courier New",
-        "Garamond",
-        "Georgia",
-        "Impact",
-        "Lucida Console",
-        "Lucida Sans Unicode",
-        "Microsoft Sans Serif",
-        "Palatino Linotype",
-        "Tahoma",
-        "Times New Roman",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-    { "Apple Legacy Fonts",
-      { "Geneva",
-        "Times",
-        "Monaco",
-        "Century",
-        "Chalkboard",
-        "Lobster",
-        "Century Gothic",
-        "Optima",
-        "Lucida Grande",
-        "Gill Sans",
-        "Baskerville",
-        "Helvetica",
-        "Helvetica Neue",
-        "",
-      },
-    },
-    { "Legacy Sans Fonts",
-      { "Andale Mono",
-        "Arial Unicode MS",
-        "Arial",
-        "Century Gothic",
-        "Comic Sans MS",
-        "Franklin Gothic Medium",
-        "Geneva",
-        "Lucida Console",
-        "Lucida Grande",
-        "Lucida Sans Unicode",
-        "Lucida Sans Typewriter",
-        "Microsoft Sans Serif",
-        "Monaco",
-        "Tahoma",
-        "Trebuchet MS",
-        "Verdana",
-        "",
-      },
-    },
-
-    { "Misc Legacy Fonts",
-      { "Dark Courier", "", }, },
-    { "Verdana Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans", "", }, },
-    { "Verdana and Clones",
-      { "DejaVu Sans",
-        "Bitstream Vera Sans",
-        "Verdana", "", }, },
-  };
-
-
-  /* Define this to force natural (i.e. not bitmap-compatible) widths.     */
-  /* The default leans strongly towards natural widths except for a few    */
-  /* legacy fonts where a selective combination produces nicer results.    */
-/* #define FORCE_NATURAL_WIDTHS   */
-
-
-  /* Define `classes' of styles that can be grouped together and used in   */
-  /* rules below.  A blank entry "" is required at the end of these!       */
-#define STYLE_CLASS_RULES_SIZE  5
-
-  static const SPH_Font_Class  STYLE_CLASS_Rules
-                               [STYLE_CLASS_RULES_SIZE] =
-  {
-    { "Regular Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Regular/Italic Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Italic",
-        "Oblique",
-        "Roman",
-        "Normal",
-        "",
-      },
-    },
-    { "Bold/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "",
-      },
-    },
-    { "Bold/Italic/BoldItalic Class",
-      { "Bold",
-        "Bold Italic",
-        "Black",
-        "Italic",
-        "Oblique",
-        "",
-      },
-    },
-    { "Regular/Bold Class",
-      { "Regular",
-        "Book",
-        "Medium",
-        "Normal",
-        "Roman",
-        "Bold",
-        "Black",
-        "",
-      },
-    },
-  };
-
-
-  /* Force special legacy fixes for fonts.                                 */
-#define COMPATIBILITY_MODE_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBILITY_MODE_Rules
-                              [COMPATIBILITY_MODE_RULES_SIZE] =
-  {
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-  /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting.         */
-#define PIXEL_HINTING_RULES_SIZE  2
-
-  static const SPH_TweakRule  PIXEL_HINTING_Rules
-                              [PIXEL_HINTING_RULES_SIZE] =
-  {
-    /* these characters are almost always safe */
-    { "Courier New", 12, "Italic", 'z' },
-    { "Courier New", 11, "Italic", 'z' },
-  };
-
-
-  /* Subpixel hinting ignores SHPIX rules on X.  Force SHPIX for these.    */
-#define DO_SHPIX_RULES_SIZE  1
-
-  static const SPH_TweakRule  DO_SHPIX_Rules
-                              [DO_SHPIX_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE  4
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* fix vwxyz thinness*/
-    { "Consolas", 0, "", 0 },
-    /* Fix thin middle stems */
-    { "Core MS Legacy Fonts", 0, "Regular", 0 },
-    /* Cyrillic small letter I */
-    { "Legacy Sans Fonts", 0, "", 0 },
-    /* Fix artifacts with some Regular & Bold */
-    { "Verdana Clones", 0, "", 0 },
-  };
-
-
-#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    /* Fixes < and > */
-    { "Courier New", 0, "Regular", 0 },
-  };
-
-
-  /* Skip Y moves that start with a point that is not on a Y pixel         */
-  /* boundary and don't move that point to a Y pixel boundary.             */
-#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE  2
-
-  static const SPH_TweakRule  SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules
-                              [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] =
-  {
-    /* Maintain thickness of diagonal in 'N' */
-    { "Times New Roman", 0, "Regular/Bold Class", 'N' },
-    { "Georgia", 0, "Regular/Bold Class", 'N' },
-  };
-
-
-  /* Skip Y moves that move a point off a Y pixel boundary.                */
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions
-                              [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Round moves that don't move a point to a Y pixel boundary.            */
-#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE  2
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] =
-  {
-    /* Droid font instructions don't snap Y to pixels */
-    { "Droid Sans", 0, "Regular/Italic Class", 0 },
-    { "Droid Sans Mono", 0, "", 0 },
-  };
-
-
-#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE  1
-
-  static const SPH_TweakRule  ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions
-                              [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Allow a Direct_Move along X freedom vector if matched.                */
-#define ALLOW_X_DMOVE_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALLOW_X_DMOVE_Rules
-                              [ALLOW_X_DMOVE_RULES_SIZE] =
-  {
-    /* Fixes vanishing diagonal in 4 */
-    { "Verdana", 0, "Regular", '4' },
-  };
-
-
-  /* Return MS rasterizer version 35 if matched.                           */
-#define RASTERIZER_35_RULES_SIZE  8
-
-  static const SPH_TweakRule  RASTERIZER_35_Rules
-                              [RASTERIZER_35_RULES_SIZE] =
-  {
-    /* This seems to be the only way to make these look good */
-    { "Times New Roman", 0, "Regular", 'i' },
-    { "Times New Roman", 0, "Regular", 'j' },
-    { "Times New Roman", 0, "Regular", 'm' },
-    { "Times New Roman", 0, "Regular", 'r' },
-    { "Times New Roman", 0, "Regular", 'a' },
-    { "Times New Roman", 0, "Regular", 'n' },
-    { "Times New Roman", 0, "Regular", 'p' },
-    { "Times", 0, "", 0 },
-  };
-
-
-  /* Don't round to the subpixel grid.  Round to pixel grid.               */
-#define NORMAL_ROUND_RULES_SIZE  1
-
-  static const SPH_TweakRule  NORMAL_ROUND_Rules
-                              [NORMAL_ROUND_RULES_SIZE] =
-  {
-    /* Fix serif thickness for certain ppems */
-    /* Can probably be generalized somehow   */
-    { "Courier New", 0, "", 0 },
-  };
-
-
-  /* Skip IUP instructions if matched.                                     */
-#define SKIP_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  SKIP_IUP_Rules
-                              [SKIP_IUP_RULES_SIZE] =
-  {
-    { "Arial", 13, "Regular", 'a' },
-  };
-
-
-  /* Skip MIAP Twilight hack if matched.                                   */
-#define MIAP_HACK_RULES_SIZE  1
-
-  static const SPH_TweakRule  MIAP_HACK_Rules
-                              [MIAP_HACK_RULES_SIZE] =
-  {
-    { "Geneva", 12, "", 0 },
-  };
-
-
-  /* Skip DELTAP instructions if matched.                                  */
-#define ALWAYS_SKIP_DELTAP_RULES_SIZE  23
-
-  static const SPH_TweakRule  ALWAYS_SKIP_DELTAP_Rules
-                              [ALWAYS_SKIP_DELTAP_RULES_SIZE] =
-  {
-    { "Georgia", 0, "Regular", 'k' },
-    /* fix various problems with e in different versions */
-    { "Trebuchet MS", 14, "Regular", 'e' },
-    { "Trebuchet MS", 13, "Regular", 'e' },
-    { "Trebuchet MS", 15, "Regular", 'e' },
-    { "Trebuchet MS", 0, "Italic", 'v' },
-    { "Trebuchet MS", 0, "Italic", 'w' },
-    { "Trebuchet MS", 0, "Regular", 'Y' },
-    { "Arial", 11, "Regular", 's' },
-    /* prevent problems with '3' and others */
-    { "Verdana", 10, "Regular", 0 },
-    { "Verdana", 9, "Regular", 0 },
-    /* Cyrillic small letter short I */
-    { "Legacy Sans Fonts", 0, "", 0x438 },
-    { "Legacy Sans Fonts", 0, "", 0x439 },
-    { "Arial", 10, "Regular", '6' },
-    { "Arial", 0, "Bold/BoldItalic Class", 'a' },
-    /* Make horizontal stems consistent with the rest */
-    { "Arial", 24, "Bold", 'a' },
-    { "Arial", 25, "Bold", 'a' },
-    { "Arial", 24, "Bold", 's' },
-    { "Arial", 25, "Bold", 's' },
-    { "Arial", 34, "Bold", 's' },
-    { "Arial", 35, "Bold", 's' },
-    { "Arial", 36, "Bold", 's' },
-    { "Arial", 25, "Regular", 's' },
-    { "Arial", 26, "Regular", 's' },
-  };
-
-
-  /* Always do DELTAP instructions if matched.                             */
-#define ALWAYS_DO_DELTAP_RULES_SIZE  1
-
-  static const SPH_TweakRule  ALWAYS_DO_DELTAP_Rules
-                              [ALWAYS_DO_DELTAP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow ALIGNRP after IUP.                                        */
-#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_ALIGNRP_AFTER_IUP_Rules
-                              [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow DELTAP after IUP.                                         */
-#define NO_DELTAP_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_DELTAP_AFTER_IUP_Rules
-                              [NO_DELTAP_AFTER_IUP_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-  /* Don't allow CALL after IUP.                                           */
-#define NO_CALL_AFTER_IUP_RULES_SIZE  1
-
-  static const SPH_TweakRule  NO_CALL_AFTER_IUP_Rules
-                              [NO_CALL_AFTER_IUP_RULES_SIZE] =
-  {
-    /* Prevent creation of dents in outline */
-    { "-", 0, "", 0 },
-  };
-
-
-  /* De-embolden these glyphs slightly.                                    */
-#define DEEMBOLDEN_RULES_SIZE  9
-
-  static const SPH_TweakRule  DEEMBOLDEN_Rules
-                              [DEEMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Bold", 'A' },
-    { "Courier New", 0, "Bold", 'W' },
-    { "Courier New", 0, "Bold", 'w' },
-    { "Courier New", 0, "Bold", 'M' },
-    { "Courier New", 0, "Bold", 'X' },
-    { "Courier New", 0, "Bold", 'K' },
-    { "Courier New", 0, "Bold", 'x' },
-    { "Courier New", 0, "Bold", 'z' },
-    { "Courier New", 0, "Bold", 'v' },
-  };
-
-
-  /* Embolden these glyphs slightly.                                       */
-#define EMBOLDEN_RULES_SIZE  2
-
-  static const SPH_TweakRule  EMBOLDEN_Rules
-                              [EMBOLDEN_RULES_SIZE] =
-  {
-    { "Courier New", 0, "Regular", 0 },
-    { "Courier New", 0, "Italic", 0 },
-  };
-
-
-  /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7       */
-  /* similar to Windows XP.                                                */
-#define TIMES_NEW_ROMAN_HACK_RULES_SIZE  12
-
-  static const SPH_TweakRule  TIMES_NEW_ROMAN_HACK_Rules
-                              [TIMES_NEW_ROMAN_HACK_RULES_SIZE] =
-  {
-    { "Times New Roman", 16, "Italic", '2' },
-    { "Times New Roman", 16, "Italic", '5' },
-    { "Times New Roman", 16, "Italic", '7' },
-    { "Times New Roman", 16, "Regular", '2' },
-    { "Times New Roman", 16, "Regular", '5' },
-    { "Times New Roman", 16, "Regular", '7' },
-    { "Times New Roman", 17, "Italic", '2' },
-    { "Times New Roman", 17, "Italic", '5' },
-    { "Times New Roman", 17, "Italic", '7' },
-    { "Times New Roman", 17, "Regular", '2' },
-    { "Times New Roman", 17, "Regular", '5' },
-    { "Times New Roman", 17, "Regular", '7' },
-  };
-
-
-  /* This fudges distance on 2 to get rid of the vanishing stem issue.     */
-  /* A real solution to this is certainly welcome.                         */
-#define COURIER_NEW_2_HACK_RULES_SIZE  15
-
-  static const SPH_TweakRule  COURIER_NEW_2_HACK_Rules
-                              [COURIER_NEW_2_HACK_RULES_SIZE] =
-  {
-    { "Courier New", 10, "Regular", '2' },
-    { "Courier New", 11, "Regular", '2' },
-    { "Courier New", 12, "Regular", '2' },
-    { "Courier New", 13, "Regular", '2' },
-    { "Courier New", 14, "Regular", '2' },
-    { "Courier New", 15, "Regular", '2' },
-    { "Courier New", 16, "Regular", '2' },
-    { "Courier New", 17, "Regular", '2' },
-    { "Courier New", 18, "Regular", '2' },
-    { "Courier New", 19, "Regular", '2' },
-    { "Courier New", 20, "Regular", '2' },
-    { "Courier New", 21, "Regular", '2' },
-    { "Courier New", 22, "Regular", '2' },
-    { "Courier New", 23, "Regular", '2' },
-    { "Courier New", 24, "Regular", '2' },
-  };
-
-
-#ifndef FORCE_NATURAL_WIDTHS
-
-  /* Use compatible widths with these glyphs.  Compatible widths is always */
-  /* on when doing B/W TrueType instructing, but is used selectively here, */
-  /* typically on glyphs with 3 or more vertical stems.                    */
-#define COMPATIBLE_WIDTHS_RULES_SIZE  38
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "Arial Unicode MS", 12, "Regular Class", 'm' },
-    { "Arial Unicode MS", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 10, "Regular Class", 0x448 },
-    { "Arial", 11, "Regular Class", 'm' },
-    { "Arial", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 12, "Regular Class", 0x448 },
-    { "Arial", 13, "Regular Class", 0x448 },
-    { "Arial", 14, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Arial", 14, "Regular Class", 0x448 },
-    { "Arial", 15, "Regular Class", 0x448 },
-    { "Arial", 17, "Regular Class", 'm' },
-    { "DejaVu Sans", 15, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 0 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 0 },
-    { "Segoe UI", 11, "Regular Class", 0 },
-    { "Monaco", 0, "Regular Class", 0 },
-    { "Segoe UI", 12, "Regular Class", 'm' },
-    { "Segoe UI", 14, "Regular Class", 'm' },
-    { "Tahoma", 11, "Regular Class", 0 },
-    { "Times New Roman", 16, "Regular Class", 'c' },
-    { "Times New Roman", 16, "Regular Class", 'm' },
-    { "Times New Roman", 16, "Regular Class", 'o' },
-    { "Times New Roman", 16, "Regular Class", 'w' },
-    { "Trebuchet MS", 11, "Regular Class", 0 },
-    { "Trebuchet MS", 12, "Regular Class", 0 },
-    { "Trebuchet MS", 14, "Regular Class", 0 },
-    { "Trebuchet MS", 15, "Regular Class", 0 },
-    { "Ubuntu", 12, "Regular Class", 'm' },
-    /* Cyrillic small letter sha */
-    { "Verdana", 10, "Regular Class", 0x448 },
-    { "Verdana", 11, "Regular Class", 0x448 },
-    { "Verdana and Clones", 12, "Regular Class", 'i' },
-    { "Verdana and Clones", 12, "Regular Class", 'j' },
-    { "Verdana and Clones", 12, "Regular Class", 'l' },
-    { "Verdana and Clones", 12, "Regular Class", 'm' },
-    { "Verdana and Clones", 13, "Regular Class", 'i' },
-    { "Verdana and Clones", 13, "Regular Class", 'j' },
-    { "Verdana and Clones", 13, "Regular Class", 'l' },
-    { "Verdana and Clones", 14, "Regular Class", 'm' },
-  };
-
-
-  /* Scaling slightly in the x-direction prior to hinting results in       */
-  /* more visually pleasing glyphs in certain cases.                       */
-  /* This sometimes needs to be coordinated with compatible width rules.   */
-  /* A value of 1000 corresponds to a scaled value of 1.0.                 */
-
-#define X_SCALING_RULES_SIZE  50
-
-  static const SPH_ScaleRule  X_SCALING_Rules[X_SCALING_RULES_SIZE] =
-  {
-    { "DejaVu Sans", 12, "Regular Class", 'm', 950 },
-    { "Verdana and Clones", 12, "Regular Class", 'a', 1100 },
-    { "Verdana and Clones", 13, "Regular Class", 'a', 1050 },
-    { "Arial", 11, "Regular Class", 'm', 975 },
-    { "Arial", 12, "Regular Class", 'm', 1050 },
-    /* Cyrillic small letter el */
-    { "Arial", 13, "Regular Class", 0x43B, 950 },
-    { "Arial", 13, "Regular Class", 'o', 950 },
-    { "Arial", 13, "Regular Class", 'e', 950 },
-    { "Arial", 14, "Regular Class", 'm', 950 },
-    /* Cyrillic small letter el */
-    { "Arial", 15, "Regular Class", 0x43B, 925 },
-    { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 },
-    { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 },
-    { "DejaVu Sans", 12, "Regular Class", 'l', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'i', 975 },
-    { "DejaVu Sans", 12, "Regular Class", 'j', 975 },
-    { "DejaVu Sans", 13, "Regular Class", 'l', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'i', 950 },
-    { "DejaVu Sans", 13, "Regular Class", 'j', 950 },
-    { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 },
-    { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 },
-    { "Georgia", 10, "", 0, 1050 },
-    { "Georgia", 11, "", 0, 1100 },
-    { "Georgia", 12, "", 0, 1025 },
-    { "Georgia", 13, "", 0, 1050 },
-    { "Georgia", 16, "", 0, 1050 },
-    { "Georgia", 17, "", 0, 1030 },
-    { "Liberation Sans", 12, "Regular Class", 'm', 1100 },
-    { "Lucida Grande", 11, "Regular Class", 'm', 1100 },
-    { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 },
-    { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'H', 1050 },
-    { "Segoe UI", 12, "Regular Class", 'm', 1050 },
-    { "Segoe UI", 14, "Regular Class", 'm', 1050 },
-    { "Tahoma", 11, "Regular Class", 'i', 975 },
-    { "Tahoma", 11, "Regular Class", 'l', 975 },
-    { "Tahoma", 11, "Regular Class", 'j', 900 },
-    { "Tahoma", 11, "Regular Class", 'm', 918 },
-    { "Verdana", 10, "Regular/Italic Class", 0, 1100 },
-    { "Verdana", 12, "Regular Class", 'm', 975 },
-    { "Verdana", 12, "Regular/Italic Class", 0, 1050 },
-    { "Verdana", 13, "Regular/Italic Class", 'i', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'j', 950 },
-    { "Verdana", 13, "Regular/Italic Class", 'l', 950 },
-    { "Verdana", 16, "Regular Class", 0, 1050 },
-    { "Verdana", 9, "Regular/Italic Class", 0, 1050 },
-    { "Times New Roman", 16, "Regular Class", 'm', 918 },
-    { "Trebuchet MS", 11, "Regular Class", 'm', 800 },
-    { "Trebuchet MS", 12, "Regular Class", 'm', 800 },
-  };
-
-#else
-
-#define COMPATIBLE_WIDTHS_RULES_SIZE  1
-
-  static const SPH_TweakRule  COMPATIBLE_WIDTHS_Rules
-                              [COMPATIBLE_WIDTHS_RULES_SIZE] =
-  {
-    { "-", 0, "", 0 },
-  };
-
-
-#define X_SCALING_RULES_SIZE  1
-
-  static const SPH_ScaleRule  X_SCALING_Rules
-                              [X_SCALING_RULES_SIZE] =
-  {
-    { "-", 0, "", 0, 1000 },
-  };
-
-#endif /* FORCE_NATURAL_WIDTHS */
-
-
-  static FT_Bool
-  is_member_of_family_class( const FT_String*  detected_font_name,
-                             const FT_String*  rule_font_name )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font name match rule family? */
-    if ( strcmp( detected_font_name, rule_font_name ) == 0 )
-      return TRUE;
-
-    /* Is font name a wildcard ""? */
-    if ( 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 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( strcmp( FAMILY_CLASS_Rules[i].member[j],
-                       detected_font_name ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_Bool
-  is_member_of_style_class( const FT_String*  detected_font_style,
-                            const FT_String*  rule_font_style )
-  {
-    FT_UInt  i, j;
-
-
-    /* Does font style match rule style? */
-    if ( strcmp( detected_font_style, rule_font_style ) == 0 )
-      return TRUE;
-
-    /* Is font style a wildcard ""? */
-    if ( 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 )
-      {
-        for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ )
-        {
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 )
-            continue;
-          if ( strcmp( STYLE_CLASS_Rules[i].member[j],
-                       detected_font_style ) == 0 )
-            return TRUE;
-        }
-      }
-    }
-
-    return FALSE;
-  }
-
-
-  FT_LOCAL_DEF( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                             &&
-               is_member_of_style_class ( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return TRUE;
-    }
-
-    return FALSE;
-  }
-
-
-  static FT_UInt
-  scale_test_tweak( TT_Face               face,
-                    const FT_String*      family,
-                    FT_UInt               ppem,
-                    const FT_String*      style,
-                    FT_UInt               glyph_index,
-                    const SPH_ScaleRule*  rule,
-                    FT_UInt               num_rules )
-  {
-    FT_UInt  i;
-
-
-    /* rule checks may be able to be optimized further */
-    for ( i = 0; i < num_rules; i++ )
-    {
-      if ( family                                                   &&
-           ( is_member_of_family_class ( family, rule[i].family ) ) )
-        if ( rule[i].ppem == 0    ||
-             rule[i].ppem == ppem )
-          if ( style                                            &&
-               is_member_of_style_class( style, rule[i].style ) )
-            if ( rule[i].glyph == 0                                ||
-                 FT_Get_Char_Index( (FT_Face)face,
-                                    rule[i].glyph ) == glyph_index )
-        return rule[i].scale;
-    }
-
-    return 1000;
-  }
-
-
-  FT_LOCAL_DEF( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index )
-  {
-    return scale_test_tweak( face, family, ppem, style, glyph_index,
-                             X_SCALING_Rules, X_SCALING_RULES_SIZE );
-  }
-
-
-#define TWEAK_RULES( x )                                       \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index, \
-                       x##_Rules, x##_RULES_SIZE ) )           \
-    loader->exec->sph_tweak_flags |= SPH_TWEAK_##x;
-
-#define TWEAK_RULES_EXCEPTIONS( x )                                        \
-  if ( sph_test_tweak( face, family, ppem, style, glyph_index,             \
-                       x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \
-    loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x;
-
-
-  FT_LOCAL_DEF( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index )
-  {
-    TT_Face     face   = loader->face;
-    FT_String*  family = face->root.family_name;
-    FT_UInt     ppem   = loader->size->metrics.x_ppem;
-    FT_String*  style  = face->root.style_name;
-
-
-    /* don't apply rules if style isn't set */
-    if ( !face->root.style_name )
-      return;
-
-#ifdef SPH_DEBUG_MORE_VERBOSE
-    printf( "%s,%d,%s,%c=%d ",
-            family, ppem, style, glyph_index, glyph_index );
-#endif
-
-    TWEAK_RULES( PIXEL_HINTING );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING )
-    {
-      loader->exec->ignore_x_mode = FALSE;
-      return;
-    }
-
-    TWEAK_RULES( ALLOW_X_DMOVE );
-    TWEAK_RULES( ALWAYS_DO_DELTAP );
-    TWEAK_RULES( ALWAYS_SKIP_DELTAP );
-    TWEAK_RULES( DEEMBOLDEN );
-    TWEAK_RULES( DO_SHPIX );
-    TWEAK_RULES( EMBOLDEN );
-    TWEAK_RULES( MIAP_HACK );
-    TWEAK_RULES( NORMAL_ROUND );
-    TWEAK_RULES( NO_ALIGNRP_AFTER_IUP );
-    TWEAK_RULES( NO_CALL_AFTER_IUP );
-    TWEAK_RULES( NO_DELTAP_AFTER_IUP );
-    TWEAK_RULES( RASTERIZER_35 );
-    TWEAK_RULES( SKIP_IUP );
-
-    TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP );
-
-    TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES );
-
-    TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES );
-    TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES );
-
-    if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 )
-    {
-      if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 )
-      {
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35;
-    }
-    else
-    {
-      if ( loader->exec->rasterizer_version  !=
-           SPH_OPTION_SET_RASTERIZER_VERSION )
-      {
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-        loader->exec->size->cvt_ready    = -1;
-
-        tt_size_ready_bytecode(
-          loader->exec->size,
-          FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) );
-      }
-      else
-        loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION;
-    }
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      TWEAK_RULES( TIMES_NEW_ROMAN_HACK );
-      TWEAK_RULES( COURIER_NEW_2_HACK );
-    }
-
-    if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-           COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) )
-      loader->exec->face->sph_compatibility_mode = TRUE;
-
-
-    if ( IS_HINTED( loader->load_flags ) )
-    {
-      if ( sph_test_tweak( face, family, ppem, style, glyph_index,
-             COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) )
-        loader->exec->compatible_widths |= TRUE;
-    }
-  }
-
-#else /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-  /* ANSI C doesn't like empty source files */
-  typedef int  _tt_subpix_dummy;
-
-#endif /* !TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttsubpix.h b/third_party/freetype/src/truetype/ttsubpix.h
deleted file mode 100644
index c68f97f..0000000
--- a/third_party/freetype/src/truetype/ttsubpix.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttsubpix.h                                                             */
-/*                                                                         */
-/*    TrueType Subpixel Hinting.                                           */
-/*                                                                         */
-/*  Copyright 2010-2017 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 TTSUBPIX_H_
-#define TTSUBPIX_H_
-
-#include <ft2build.h>
-#include "ttobjs.h"
-#include "ttinterp.h"
-
-
-FT_BEGIN_HEADER
-
-
-#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* ID flags to identify special functions at FDEF and runtime.           */
-  /*                                                                       */
-  /*                                                                       */
-#define SPH_FDEF_INLINE_DELTA_1       0x0000001
-#define SPH_FDEF_INLINE_DELTA_2       0x0000002
-#define SPH_FDEF_DIAGONAL_STROKE      0x0000004
-#define SPH_FDEF_VACUFORM_ROUND_1     0x0000008
-#define SPH_FDEF_TTFAUTOHINT_1        0x0000010
-#define SPH_FDEF_SPACING_1            0x0000020
-#define SPH_FDEF_SPACING_2            0x0000040
-#define SPH_FDEF_TYPEMAN_STROKES      0x0000080
-#define SPH_FDEF_TYPEMAN_DIAGENDCTRL  0x0000100
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Tweak flags that are set for each glyph by the below rules.           */
-  /*                                                                       */
-  /*                                                                       */
-#define SPH_TWEAK_ALLOW_X_DMOVE                   0x0000001UL
-#define SPH_TWEAK_ALWAYS_DO_DELTAP                0x0000002UL
-#define SPH_TWEAK_ALWAYS_SKIP_DELTAP              0x0000004UL
-#define SPH_TWEAK_COURIER_NEW_2_HACK              0x0000008UL
-#define SPH_TWEAK_DEEMBOLDEN                      0x0000010UL
-#define SPH_TWEAK_DO_SHPIX                        0x0000020UL
-#define SPH_TWEAK_EMBOLDEN                        0x0000040UL
-#define SPH_TWEAK_MIAP_HACK                       0x0000080UL
-#define SPH_TWEAK_NORMAL_ROUND                    0x0000100UL
-#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP            0x0000200UL
-#define SPH_TWEAK_NO_CALL_AFTER_IUP               0x0000400UL
-#define SPH_TWEAK_NO_DELTAP_AFTER_IUP             0x0000800UL
-#define SPH_TWEAK_PIXEL_HINTING                   0x0001000UL
-#define SPH_TWEAK_RASTERIZER_35                   0x0002000UL
-#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES          0x0004000UL
-#define SPH_TWEAK_SKIP_IUP                        0x0008000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES           0x0010000UL
-#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES           0x0020000UL
-#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK            0x0040000UL
-#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP    0x0080000UL
-
-
-  FT_LOCAL( FT_Bool )
-  sph_test_tweak( TT_Face               face,
-                  const FT_String*      family,
-                  FT_UInt               ppem,
-                  const FT_String*      style,
-                  FT_UInt               glyph_index,
-                  const SPH_TweakRule*  rule,
-                  FT_UInt               num_rules );
-
-  FT_LOCAL( FT_UInt )
-  sph_test_tweak_x_scaling( TT_Face           face,
-                            const FT_String*  family,
-                            FT_UInt           ppem,
-                            const FT_String*  style,
-                            FT_UInt           glyph_index );
-
-  FT_LOCAL( void )
-  sph_set_tweaks( TT_Loader  loader,
-                  FT_UInt    glyph_index );
-
-
-  /* These macros are defined absent a method for setting them */
-#define SPH_OPTION_BITMAP_WIDTHS           FALSE
-#define SPH_OPTION_SET_SUBPIXEL            TRUE
-#define SPH_OPTION_SET_GRAYSCALE           FALSE
-#define SPH_OPTION_SET_COMPATIBLE_WIDTHS   FALSE
-#define SPH_OPTION_SET_RASTERIZER_VERSION  38
-
-#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */
-
-
-FT_END_HEADER
-
-#endif /* TTSUBPIX_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1afm.c b/third_party/freetype/src/type1/t1afm.c
deleted file mode 100644
index 792ea2f..0000000
--- a/third_party/freetype/src/type1/t1afm.c
+++ /dev/null
@@ -1,406 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1afm.c                                                                */
-/*                                                                         */
-/*    AFM support for Type 1 fonts (body).                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "t1afm.h"
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include "t1errors.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_t1afm
-
-
-  FT_LOCAL_DEF( void )
-  T1_Done_Metrics( FT_Memory     memory,
-                   AFM_FontInfo  fi )
-  {
-    FT_FREE( fi->KernPairs );
-    fi->NumKernPair = 0;
-
-    FT_FREE( fi->TrackKerns );
-    fi->NumTrackKern = 0;
-
-    FT_FREE( fi );
-  }
-
-
-  /* read a glyph name and return the equivalent glyph index */
-  static FT_Int
-  t1_get_index( const char*  name,
-                FT_Offset    len,
-                void*        user_data )
-  {
-    T1_Font  type1 = (T1_Font)user_data;
-    FT_Int   n;
-
-
-    /* PS string/name length must be < 16-bit */
-    if ( len > 0xFFFFU )
-      return 0;
-
-    for ( n = 0; n < type1->num_glyphs; n++ )
-    {
-      char*  gname = (char*)type1->glyph_names[n];
-
-
-      if ( gname && gname[0] == name[0]        &&
-           ft_strlen( gname ) == len           &&
-           ft_strncmp( gname, name, len ) == 0 )
-        return n;
-    }
-
-    return 0;
-  }
-
-
-#undef  KERN_INDEX
-#define KERN_INDEX( g1, g2 )  ( ( (FT_ULong)(g1) << 16 ) | (g2) )
-
-
-  /* compare two kerning pairs */
-  FT_CALLBACK_DEF( int )
-  compare_kern_pairs( const void*  a,
-                      const void*  b )
-  {
-    AFM_KernPair  pair1 = (AFM_KernPair)a;
-    AFM_KernPair  pair2 = (AFM_KernPair)b;
-
-    FT_ULong  index1 = KERN_INDEX( pair1->index1, pair1->index2 );
-    FT_ULong  index2 = KERN_INDEX( pair2->index1, pair2->index2 );
-
-
-    if ( index1 > index2 )
-      return 1;
-    else if ( index1 < index2 )
-      return -1;
-    else
-      return 0;
-  }
-
-
-  /* parse a PFM file -- for now, only read the kerning pairs */
-  static FT_Error
-  T1_Read_PFM( FT_Face       t1_face,
-               FT_Stream     stream,
-               AFM_FontInfo  fi )
-  {
-    FT_Error      error  = FT_Err_Ok;
-    FT_Memory     memory = stream->memory;
-    FT_Byte*      start;
-    FT_Byte*      limit;
-    FT_Byte*      p;
-    AFM_KernPair  kp;
-    FT_Int        width_table_length;
-    FT_CharMap    oldcharmap;
-    FT_CharMap    charmap;
-    FT_Int        n;
-
-
-    start = (FT_Byte*)stream->cursor;
-    limit = (FT_Byte*)stream->limit;
-
-    /* Figure out how long the width table is.          */
-    /* This info is a little-endian short at offset 99. */
-    p = start + 99;
-    if ( p + 2 > limit )
-    {
-      error = FT_THROW( Unknown_File_Format );
-      goto Exit;
-    }
-    width_table_length = FT_PEEK_USHORT_LE( p );
-
-    p += 18 + width_table_length;
-    if ( p + 0x12 > limit || FT_PEEK_USHORT_LE( p ) < 0x12 )
-      /* extension table is probably optional */
-      goto Exit;
-
-    /* Kerning offset is 14 bytes from start of extensions table. */
-    p += 14;
-    p = start + FT_PEEK_ULONG_LE( p );
-
-    if ( p == start )
-      /* zero offset means no table */
-      goto Exit;
-
-    if ( p + 2 > limit )
-    {
-      error = FT_THROW( Unknown_File_Format );
-      goto Exit;
-    }
-
-    fi->NumKernPair = FT_PEEK_USHORT_LE( p );
-    p += 2;
-    if ( p + 4 * fi->NumKernPair > limit )
-    {
-      error = FT_THROW( Unknown_File_Format );
-      goto Exit;
-    }
-
-    /* Actually, kerning pairs are simply optional! */
-    if ( fi->NumKernPair == 0 )
-      goto Exit;
-
-    /* allocate the pairs */
-    if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) )
-      goto Exit;
-
-    /* now, read each kern pair */
-    kp    = fi->KernPairs;
-    limit = p + 4 * fi->NumKernPair;
-
-    /* PFM kerning data are stored by encoding rather than glyph index, */
-    /* so find the PostScript charmap of this font and install it       */
-    /* temporarily.  If we find no PostScript charmap, then just use    */
-    /* the default and hope it is the right one.                        */
-    oldcharmap = t1_face->charmap;
-    charmap    = NULL;
-
-    for ( n = 0; n < t1_face->num_charmaps; n++ )
-    {
-      charmap = t1_face->charmaps[n];
-      /* check against PostScript pseudo platform */
-      if ( charmap->platform_id == 7 )
-      {
-        error = FT_Set_Charmap( t1_face, charmap );
-        if ( error )
-          goto Exit;
-        break;
-      }
-    }
-
-    /* Kerning info is stored as:             */
-    /*                                        */
-    /*   encoding of first glyph (1 byte)     */
-    /*   encoding of second glyph (1 byte)    */
-    /*   offset (little-endian short)         */
-    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] );
-
-      kp->x = (FT_Int)FT_PEEK_SHORT_LE(p + 2);
-      kp->y = 0;
-
-      kp++;
-    }
-
-    if ( oldcharmap )
-      error = FT_Set_Charmap( t1_face, oldcharmap );
-    if ( error )
-      goto Exit;
-
-    /* now, sort the kern pairs according to their glyph indices */
-    ft_qsort( fi->KernPairs, fi->NumKernPair, sizeof ( AFM_KernPairRec ),
-              compare_kern_pairs );
-
-  Exit:
-    if ( error )
-    {
-      FT_FREE( fi->KernPairs );
-      fi->NumKernPair = 0;
-    }
-
-    return error;
-  }
-
-
-  /* parse a metrics file -- either AFM or PFM depending on what */
-  /* it turns out to be                                          */
-  FT_LOCAL_DEF( FT_Error )
-  T1_Read_Metrics( FT_Face    t1_face,
-                   FT_Stream  stream )
-  {
-    PSAux_Service  psaux;
-    FT_Memory      memory  = stream->memory;
-    AFM_ParserRec  parser;
-    AFM_FontInfo   fi      = NULL;
-    FT_Error       error   = FT_ERR( Unknown_File_Format );
-    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;
-
-    fi->FontBBox  = t1_font->font_bbox;
-    fi->Ascender  = t1_font->font_bbox.yMax;
-    fi->Descender = t1_font->font_bbox.yMin;
-
-    psaux = (PSAux_Service)face->psaux;
-    if ( psaux->afm_parser_funcs )
-    {
-      error = psaux->afm_parser_funcs->init( &parser,
-                                             stream->memory,
-                                             stream->cursor,
-                                             stream->limit );
-
-      if ( !error )
-      {
-        parser.FontInfo  = fi;
-        parser.get_index = t1_get_index;
-        parser.user_data = t1_font;
-
-        error = psaux->afm_parser_funcs->parse( &parser );
-        psaux->afm_parser_funcs->done( &parser );
-      }
-    }
-
-    if ( FT_ERR_EQ( error, Unknown_File_Format ) )
-    {
-      FT_Byte*  start = stream->cursor;
-
-
-      /* MS Windows allows versions up to 0x3FF without complaining */
-      if ( stream->size > 6                              &&
-           start[1] < 4                                  &&
-           FT_PEEK_ULONG_LE( start + 2 ) == stream->size )
-        error = T1_Read_PFM( t1_face, stream, fi );
-    }
-
-    if ( !error )
-    {
-      t1_font->font_bbox = fi->FontBBox;
-
-      t1_face->bbox.xMin =   fi->FontBBox.xMin            >> 16;
-      t1_face->bbox.yMin =   fi->FontBBox.yMin            >> 16;
-      /* no `U' suffix here to 0xFFFF! */
-      t1_face->bbox.xMax = ( fi->FontBBox.xMax + 0xFFFF ) >> 16;
-      t1_face->bbox.yMax = ( fi->FontBBox.yMax + 0xFFFF ) >> 16;
-
-      /* no `U' suffix here to 0x8000! */
-      t1_face->ascender  = (FT_Short)( ( fi->Ascender  + 0x8000 ) >> 16 );
-      t1_face->descender = (FT_Short)( ( fi->Descender + 0x8000 ) >> 16 );
-
-      if ( fi->NumKernPair )
-      {
-        t1_face->face_flags |= FT_FACE_FLAG_KERNING;
-        face->afm_data       = fi;
-        fi                   = NULL;
-      }
-    }
-
-    FT_FRAME_EXIT();
-
-  Exit:
-    if ( fi )
-      T1_Done_Metrics( memory, fi );
-
-    return error;
-  }
-
-
-  /* find the kerning for a given glyph pair */
-  FT_LOCAL_DEF( void )
-  T1_Get_Kerning( AFM_FontInfo  fi,
-                  FT_UInt       glyph1,
-                  FT_UInt       glyph2,
-                  FT_Vector*    kerning )
-  {
-    AFM_KernPair  min, mid, max;
-    FT_ULong      idx = KERN_INDEX( glyph1, glyph2 );
-
-
-    /* simple binary search */
-    min = fi->KernPairs;
-    max = min + fi->NumKernPair - 1;
-
-    while ( min <= max )
-    {
-      FT_ULong  midi;
-
-
-      mid  = min + ( max - min ) / 2;
-      midi = KERN_INDEX( mid->index1, mid->index2 );
-
-      if ( midi == idx )
-      {
-        kerning->x = mid->x;
-        kerning->y = mid->y;
-
-        return;
-      }
-
-      if ( midi < idx )
-        min = mid + 1;
-      else
-        max = mid - 1;
-    }
-
-    kerning->x = 0;
-    kerning->y = 0;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Get_Track_Kerning( FT_Face    face,
-                        FT_Fixed   ptsize,
-                        FT_Int     degree,
-                        FT_Fixed*  kerning )
-  {
-    AFM_FontInfo  fi = (AFM_FontInfo)( (T1_Face)face )->afm_data;
-    FT_UInt       i;
-
-
-    if ( !fi )
-      return FT_THROW( Invalid_Argument );
-
-    for ( i = 0; i < fi->NumTrackKern; i++ )
-    {
-      AFM_TrackKern  tk = fi->TrackKerns + i;
-
-
-      if ( tk->degree != degree )
-        continue;
-
-      if ( ptsize < tk->min_ptsize )
-        *kerning = tk->min_kern;
-      else if ( ptsize > tk->max_ptsize )
-        *kerning = tk->max_kern;
-      else
-      {
-        *kerning = FT_MulDiv( ptsize - tk->min_ptsize,
-                              tk->max_kern - tk->min_kern,
-                              tk->max_ptsize - tk->min_ptsize ) +
-                   tk->min_kern;
-      }
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1afm.h b/third_party/freetype/src/type1/t1afm.h
deleted file mode 100644
index 9f62cd0..0000000
--- a/third_party/freetype/src/type1/t1afm.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1afm.h                                                                */
-/*                                                                         */
-/*    AFM support for Type 1 fonts (specification).                        */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1AFM_H_
-#define T1AFM_H_
-
-#include <ft2build.h>
-#include "t1objs.h"
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  T1_Read_Metrics( FT_Face    face,
-                   FT_Stream  stream );
-
-  FT_LOCAL( void )
-  T1_Done_Metrics( FT_Memory     memory,
-                   AFM_FontInfo  fi );
-
-  FT_LOCAL( void )
-  T1_Get_Kerning( AFM_FontInfo  fi,
-                  FT_UInt       glyph1,
-                  FT_UInt       glyph2,
-                  FT_Vector*    kerning );
-
-  FT_LOCAL( FT_Error )
-  T1_Get_Track_Kerning( FT_Face    face,
-                        FT_Fixed   ptsize,
-                        FT_Int     degree,
-                        FT_Fixed*  kerning );
-
-FT_END_HEADER
-
-#endif /* T1AFM_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1driver.c b/third_party/freetype/src/type1/t1driver.c
deleted file mode 100644
index c208994..0000000
--- a/third_party/freetype/src/type1/t1driver.c
+++ /dev/null
@@ -1,756 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1driver.c                                                             */
-/*                                                                         */
-/*    Type 1 driver interface (body).                                      */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "t1driver.h"
-#include "t1gload.h"
-#include "t1load.h"
-
-#include "t1errors.h"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "t1afm.h"
-#endif
-
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_HASH_H
-
-#include FT_SERVICE_MULTIPLE_MASTERS_H
-#include FT_SERVICE_GLYPH_DICT_H
-#include FT_SERVICE_FONT_FORMAT_H
-#include FT_SERVICE_POSTSCRIPT_NAME_H
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-#include FT_SERVICE_POSTSCRIPT_INFO_H
-#include FT_SERVICE_KERNING_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_t1driver
-
- /*
-  *  GLYPH DICT SERVICE
-  *
-  */
-
-  static FT_Error
-  t1_get_glyph_name( T1_Face     face,
-                     FT_UInt     glyph_index,
-                     FT_Pointer  buffer,
-                     FT_UInt     buffer_max )
-  {
-    FT_STRCPYN( buffer, face->type1.glyph_names[glyph_index], buffer_max );
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_UInt
-  t1_get_name_index( T1_Face     face,
-                     FT_String*  glyph_name )
-  {
-    FT_Int  i;
-
-
-    for ( i = 0; i < face->type1.num_glyphs; i++ )
-    {
-      FT_String*  gname = face->type1.glyph_names[i];
-
-
-      if ( !ft_strcmp( glyph_name, gname ) )
-        return (FT_UInt)i;
-    }
-
-    return 0;
-  }
-
-
-  static const FT_Service_GlyphDictRec  t1_service_glyph_dict =
-  {
-    (FT_GlyphDict_GetNameFunc)  t1_get_glyph_name,    /* get_name   */
-    (FT_GlyphDict_NameIndexFunc)t1_get_name_index     /* name_index */
-  };
-
-
-  /*
-   *  POSTSCRIPT NAME SERVICE
-   *
-   */
-
-  static const char*
-  t1_get_ps_name( T1_Face  face )
-  {
-    return (const char*) face->type1.font_name;
-  }
-
-
-  static const FT_Service_PsFontNameRec  t1_service_ps_name =
-  {
-    (FT_PsName_GetFunc)t1_get_ps_name     /* get_ps_font_name */
-  };
-
-
-  /*
-   *  MULTIPLE MASTERS SERVICE
-   *
-   */
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-  static const FT_Service_MultiMastersRec  t1_service_multi_masters =
-  {
-    (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_Get_Var_Blend_Func) NULL,                  /* get_var_blend  */
-    (FT_Done_Blend_Func)    T1_Done_Blend          /* done_blend     */
-  };
-#endif
-
-
-  /*
-   *  POSTSCRIPT INFO SERVICE
-   *
-   */
-
-  static FT_Error
-  t1_ps_get_font_info( FT_Face          face,
-                       PS_FontInfoRec*  afont_info )
-  {
-    *afont_info = ((T1_Face)face)->type1.font_info;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  t1_ps_get_font_extra( FT_Face           face,
-                        PS_FontExtraRec*  afont_extra )
-  {
-    *afont_extra = ((T1_Face)face)->type1.font_extra;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Int
-  t1_ps_has_glyph_names( FT_Face  face )
-  {
-    FT_UNUSED( face );
-
-    return 1;
-  }
-
-
-  static FT_Error
-  t1_ps_get_font_private( FT_Face         face,
-                          PS_PrivateRec*  afont_private )
-  {
-    *afont_private = ((T1_Face)face)->type1.private_dict;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Long
-  t1_ps_get_font_value( FT_Face       face,
-                        PS_Dict_Keys  key,
-                        FT_UInt       idx,
-                        void         *value,
-                        FT_Long       value_len_ )
-  {
-    FT_ULong  retval    = 0; /* always >= 1 if valid */
-    FT_ULong  value_len = value_len_ < 0 ? 0 : (FT_ULong)value_len_;
-
-    T1_Face  t1face = (T1_Face)face;
-    T1_Font  type1  = &t1face->type1;
-
-
-    switch ( key )
-    {
-    case PS_DICT_FONT_TYPE:
-      retval = sizeof ( type1->font_type );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->font_type;
-      break;
-
-    case PS_DICT_FONT_MATRIX:
-      if ( idx < sizeof ( type1->font_matrix ) /
-                   sizeof ( type1->font_matrix.xx ) )
-      {
-        FT_Fixed  val = 0;
-
-
-        retval = sizeof ( val );
-        if ( value && value_len >= retval )
-        {
-          switch ( idx )
-          {
-          case 0:
-            val = type1->font_matrix.xx;
-            break;
-          case 1:
-            val = type1->font_matrix.xy;
-            break;
-          case 2:
-            val = type1->font_matrix.yx;
-            break;
-          case 3:
-            val = type1->font_matrix.yy;
-            break;
-          }
-          *((FT_Fixed *)value) = val;
-        }
-      }
-      break;
-
-    case PS_DICT_FONT_BBOX:
-      if ( idx < sizeof ( type1->font_bbox ) /
-                   sizeof ( type1->font_bbox.xMin ) )
-      {
-        FT_Fixed  val = 0;
-
-
-        retval = sizeof ( val );
-        if ( value && value_len >= retval )
-        {
-          switch ( idx )
-          {
-          case 0:
-            val = type1->font_bbox.xMin;
-            break;
-          case 1:
-            val = type1->font_bbox.yMin;
-            break;
-          case 2:
-            val = type1->font_bbox.xMax;
-            break;
-          case 3:
-            val = type1->font_bbox.yMax;
-            break;
-          }
-          *((FT_Fixed *)value) = val;
-        }
-      }
-      break;
-
-    case PS_DICT_PAINT_TYPE:
-      retval = sizeof ( type1->paint_type );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->paint_type;
-      break;
-
-    case PS_DICT_FONT_NAME:
-      retval = ft_strlen( type1->font_name ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_name ), retval );
-      break;
-
-    case PS_DICT_UNIQUE_ID:
-      retval = sizeof ( type1->private_dict.unique_id );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->private_dict.unique_id;
-      break;
-
-    case PS_DICT_NUM_CHAR_STRINGS:
-      retval = sizeof ( type1->num_glyphs );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->num_glyphs;
-      break;
-
-    case PS_DICT_CHAR_STRING_KEY:
-      if ( idx < (FT_UInt)type1->num_glyphs )
-      {
-        retval = ft_strlen( type1->glyph_names[idx] ) + 1;
-        if ( value && value_len >= retval )
-        {
-          ft_memcpy( value, (void *)( type1->glyph_names[idx] ), retval );
-          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
-        }
-      }
-      break;
-
-    case PS_DICT_CHAR_STRING:
-      if ( idx < (FT_UInt)type1->num_glyphs )
-      {
-        retval = type1->charstrings_len[idx] + 1;
-        if ( value && value_len >= retval )
-        {
-          ft_memcpy( value, (void *)( type1->charstrings[idx] ),
-                     retval - 1 );
-          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
-        }
-      }
-      break;
-
-    case PS_DICT_ENCODING_TYPE:
-      retval = sizeof ( type1->encoding_type );
-      if ( value && value_len >= retval )
-        *((T1_EncodingType *)value) = type1->encoding_type;
-      break;
-
-    case PS_DICT_ENCODING_ENTRY:
-      if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY &&
-           idx < (FT_UInt)type1->encoding.num_chars       )
-      {
-        retval = ft_strlen( type1->encoding.char_name[idx] ) + 1;
-        if ( value && value_len >= retval )
-        {
-          ft_memcpy( value, (void *)( type1->encoding.char_name[idx] ),
-                     retval - 1 );
-          ((FT_Char *)value)[retval - 1] = (FT_Char)'\0';
-        }
-      }
-      break;
-
-    case PS_DICT_NUM_SUBRS:
-      retval = sizeof ( type1->num_subrs );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->num_subrs;
-      break;
-
-    case PS_DICT_SUBR:
-      {
-        FT_Bool  ok = 0;
-
-
-        if ( type1->subrs_hash )
-        {
-          /* 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;
-
-    case PS_DICT_STD_HW:
-      retval = sizeof ( type1->private_dict.standard_width[0] );
-      if ( value && value_len >= retval )
-        *((FT_UShort *)value) = type1->private_dict.standard_width[0];
-      break;
-
-    case PS_DICT_STD_VW:
-      retval = sizeof ( type1->private_dict.standard_height[0] );
-      if ( value && value_len >= retval )
-        *((FT_UShort *)value) = type1->private_dict.standard_height[0];
-      break;
-
-    case PS_DICT_NUM_BLUE_VALUES:
-      retval = sizeof ( type1->private_dict.num_blue_values );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_blue_values;
-      break;
-
-    case PS_DICT_BLUE_VALUE:
-      if ( idx < type1->private_dict.num_blue_values )
-      {
-        retval = sizeof ( type1->private_dict.blue_values[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.blue_values[idx];
-      }
-      break;
-
-    case PS_DICT_BLUE_SCALE:
-      retval = sizeof ( type1->private_dict.blue_scale );
-      if ( value && value_len >= retval )
-        *((FT_Fixed *)value) = type1->private_dict.blue_scale;
-      break;
-
-    case PS_DICT_BLUE_FUZZ:
-      retval = sizeof ( type1->private_dict.blue_fuzz );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->private_dict.blue_fuzz;
-      break;
-
-    case PS_DICT_BLUE_SHIFT:
-      retval = sizeof ( type1->private_dict.blue_shift );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->private_dict.blue_shift;
-      break;
-
-    case PS_DICT_NUM_OTHER_BLUES:
-      retval = sizeof ( type1->private_dict.num_other_blues );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_other_blues;
-      break;
-
-    case PS_DICT_OTHER_BLUE:
-      if ( idx < type1->private_dict.num_other_blues )
-      {
-        retval = sizeof ( type1->private_dict.other_blues[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.other_blues[idx];
-      }
-      break;
-
-    case PS_DICT_NUM_FAMILY_BLUES:
-      retval = sizeof ( type1->private_dict.num_family_blues );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_family_blues;
-      break;
-
-    case PS_DICT_FAMILY_BLUE:
-      if ( idx < type1->private_dict.num_family_blues )
-      {
-        retval = sizeof ( type1->private_dict.family_blues[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.family_blues[idx];
-      }
-      break;
-
-    case PS_DICT_NUM_FAMILY_OTHER_BLUES:
-      retval = sizeof ( type1->private_dict.num_family_other_blues );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_family_other_blues;
-      break;
-
-    case PS_DICT_FAMILY_OTHER_BLUE:
-      if ( idx < type1->private_dict.num_family_other_blues )
-      {
-        retval = sizeof ( type1->private_dict.family_other_blues[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.family_other_blues[idx];
-      }
-      break;
-
-    case PS_DICT_NUM_STEM_SNAP_H:
-      retval = sizeof ( type1->private_dict.num_snap_widths );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_snap_widths;
-      break;
-
-    case PS_DICT_STEM_SNAP_H:
-      if ( idx < type1->private_dict.num_snap_widths )
-      {
-        retval = sizeof ( type1->private_dict.snap_widths[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.snap_widths[idx];
-      }
-      break;
-
-    case PS_DICT_NUM_STEM_SNAP_V:
-      retval = sizeof ( type1->private_dict.num_snap_heights );
-      if ( value && value_len >= retval )
-        *((FT_Byte *)value) = type1->private_dict.num_snap_heights;
-      break;
-
-    case PS_DICT_STEM_SNAP_V:
-      if ( idx < type1->private_dict.num_snap_heights )
-      {
-        retval = sizeof ( type1->private_dict.snap_heights[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.snap_heights[idx];
-      }
-      break;
-
-    case PS_DICT_RND_STEM_UP:
-      retval = sizeof ( type1->private_dict.round_stem_up );
-      if ( value && value_len >= retval )
-        *((FT_Bool *)value) = type1->private_dict.round_stem_up;
-      break;
-
-    case PS_DICT_FORCE_BOLD:
-      retval = sizeof ( type1->private_dict.force_bold );
-      if ( value && value_len >= retval )
-        *((FT_Bool *)value) = type1->private_dict.force_bold;
-      break;
-
-    case PS_DICT_MIN_FEATURE:
-      if ( idx < sizeof ( type1->private_dict.min_feature ) /
-                   sizeof ( type1->private_dict.min_feature[0] ) )
-      {
-        retval = sizeof ( type1->private_dict.min_feature[idx] );
-        if ( value && value_len >= retval )
-          *((FT_Short *)value) = type1->private_dict.min_feature[idx];
-      }
-      break;
-
-    case PS_DICT_LEN_IV:
-      retval = sizeof ( type1->private_dict.lenIV );
-      if ( value && value_len >= retval )
-        *((FT_Int *)value) = type1->private_dict.lenIV;
-      break;
-
-    case PS_DICT_PASSWORD:
-      retval = sizeof ( type1->private_dict.password );
-      if ( value && value_len >= retval )
-        *((FT_Long *)value) = type1->private_dict.password;
-      break;
-
-    case PS_DICT_LANGUAGE_GROUP:
-      retval = sizeof ( type1->private_dict.language_group );
-      if ( value && value_len >= retval )
-        *((FT_Long *)value) = type1->private_dict.language_group;
-      break;
-
-    case PS_DICT_IS_FIXED_PITCH:
-      retval = sizeof ( type1->font_info.is_fixed_pitch );
-      if ( value && value_len >= retval )
-        *((FT_Bool *)value) = type1->font_info.is_fixed_pitch;
-      break;
-
-    case PS_DICT_UNDERLINE_POSITION:
-      retval = sizeof ( type1->font_info.underline_position );
-      if ( value && value_len >= retval )
-        *((FT_Short *)value) = type1->font_info.underline_position;
-      break;
-
-    case PS_DICT_UNDERLINE_THICKNESS:
-      retval = sizeof ( type1->font_info.underline_thickness );
-      if ( value && value_len >= retval )
-        *((FT_UShort *)value) = type1->font_info.underline_thickness;
-      break;
-
-    case PS_DICT_FS_TYPE:
-      retval = sizeof ( type1->font_extra.fs_type );
-      if ( value && value_len >= retval )
-        *((FT_UShort *)value) = type1->font_extra.fs_type;
-      break;
-
-    case PS_DICT_VERSION:
-      retval = ft_strlen( type1->font_info.version ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_info.version ), retval );
-      break;
-
-    case PS_DICT_NOTICE:
-      retval = ft_strlen( type1->font_info.notice ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_info.notice ), retval );
-      break;
-
-    case PS_DICT_FULL_NAME:
-      retval = ft_strlen( type1->font_info.full_name ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_info.full_name ), retval );
-      break;
-
-    case PS_DICT_FAMILY_NAME:
-      retval = ft_strlen( type1->font_info.family_name ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_info.family_name ), retval );
-      break;
-
-    case PS_DICT_WEIGHT:
-      retval = ft_strlen( type1->font_info.weight ) + 1;
-      if ( value && value_len >= retval )
-        ft_memcpy( value, (void *)( type1->font_info.weight ), retval );
-      break;
-
-    case PS_DICT_ITALIC_ANGLE:
-      retval = sizeof ( type1->font_info.italic_angle );
-      if ( value && value_len >= retval )
-        *((FT_Long *)value) = type1->font_info.italic_angle;
-      break;
-    }
-
-    return retval == 0 ? -1 : (FT_Long)retval;
-  }
-
-
-  static const FT_Service_PsInfoRec  t1_service_ps_info =
-  {
-    (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,       /* get_track */
-  };
-#endif
-
-
-  /*
-   *  SERVICE LIST
-   *
-   */
-
-  static const FT_ServiceDescRec  t1_services[] =
-  {
-    { FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &t1_service_ps_name },
-    { 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 },
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-    { FT_SERVICE_ID_KERNING,              &t1_service_kerning },
-#endif
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-    { FT_SERVICE_ID_MULTI_MASTERS,        &t1_service_multi_masters },
-#endif
-    { NULL, NULL }
-  };
-
-
-  FT_CALLBACK_DEF( FT_Module_Interface )
-  Get_Interface( FT_Module         module,
-                 const FT_String*  t1_interface )
-  {
-    FT_UNUSED( module );
-
-    return ft_service_list_lookup( t1_services, t1_interface );
-  }
-
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    Get_Kerning                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A driver method used to return the kerning vector between two      */
-  /*    glyphs of the same face.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to the source face object.                 */
-  /*                                                                       */
-  /*    left_glyph  :: The index of the left glyph in the kern pair.       */
-  /*                                                                       */
-  /*    right_glyph :: The index of the right glyph in the kern pair.      */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    kerning     :: The kerning vector.  This is in font units for      */
-  /*                   scalable formats, and in pixels for fixed-sizes     */
-  /*                   formats.                                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    Only horizontal layouts (left-to-right & right-to-left) are        */
-  /*    supported by this function.  Other layouts, or more sophisticated  */
-  /*    kernings are out of scope of this method (the basic driver         */
-  /*    interface is meant to be simple).                                  */
-  /*                                                                       */
-  /*    They can be implemented by format-specific interfaces.             */
-  /*                                                                       */
-  static FT_Error
-  Get_Kerning( FT_Face     t1face,        /* T1_Face */
-               FT_UInt     left_glyph,
-               FT_UInt     right_glyph,
-               FT_Vector*  kerning )
-  {
-    T1_Face  face = (T1_Face)t1face;
-
-
-    kerning->x = 0;
-    kerning->y = 0;
-
-    if ( face->afm_data )
-      T1_Get_Kerning( (AFM_FontInfo)face->afm_data,
-                      left_glyph,
-                      right_glyph,
-                      kerning );
-
-    return FT_Err_Ok;
-  }
-
-
-#endif /* T1_CONFIG_OPTION_NO_AFM */
-
-
-  FT_CALLBACK_TABLE_DEF
-  const FT_Driver_ClassRec  t1_driver_class =
-  {
-    {
-      FT_MODULE_FONT_DRIVER       |
-      FT_MODULE_DRIVER_SCALABLE   |
-      FT_MODULE_DRIVER_HAS_HINTER,
-
-      sizeof ( FT_DriverRec ),
-
-      "type1",
-      0x10000L,
-      0x20000L,
-
-      NULL,    /* module-specific 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,               /* 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,              /* FT_Slot_LoadFunc  load_glyph */
-
-#ifdef T1_CONFIG_OPTION_NO_AFM
-    NULL,                       /* FT_Face_GetKerningFunc   get_kerning  */
-    NULL,                       /* FT_Face_AttachFunc       attach_file  */
-#else
-    Get_Kerning,                /* FT_Face_GetKerningFunc   get_kerning  */
-    T1_Read_Metrics,            /* FT_Face_AttachFunc       attach_file  */
-#endif
-    T1_Get_Advances,            /* FT_Face_GetAdvancesFunc  get_advances */
-
-    T1_Size_Request,            /* FT_Size_RequestFunc  request_size */
-    NULL                        /* FT_Size_SelectFunc   select_size  */
-  };
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1driver.h b/third_party/freetype/src/type1/t1driver.h
deleted file mode 100644
index 2927864..0000000
--- a/third_party/freetype/src/type1/t1driver.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1driver.h                                                             */
-/*                                                                         */
-/*    High-level Type 1 driver interface (specification).                  */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1DRIVER_H_
-#define T1DRIVER_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-
-
-FT_BEGIN_HEADER
-
-#ifdef FT_CONFIG_OPTION_PIC
-#error "this module does not support PIC yet"
-#endif
-
-
-  FT_EXPORT_VAR( const FT_Driver_ClassRec )  t1_driver_class;
-
-
-FT_END_HEADER
-
-#endif /* T1DRIVER_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1errors.h b/third_party/freetype/src/type1/t1errors.h
deleted file mode 100644
index 492dbb4..0000000
--- a/third_party/freetype/src/type1/t1errors.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1errors.h                                                             */
-/*                                                                         */
-/*    Type 1 error codes (specification only).                             */
-/*                                                                         */
-/*  Copyright 2001-2017 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 used to define the Type 1 error enumeration constants.   */
-  /*                                                                       */
-  /*************************************************************************/
-
-#ifndef T1ERRORS_H_
-#define T1ERRORS_H_
-
-#include FT_MODULE_ERRORS_H
-
-#undef FTERRORS_H_
-
-#undef  FT_ERR_PREFIX
-#define FT_ERR_PREFIX  T1_Err_
-#define FT_ERR_BASE    FT_Mod_Err_Type1
-
-#include FT_ERRORS_H
-
-#endif /* T1ERRORS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1gload.c b/third_party/freetype/src/type1/t1gload.c
deleted file mode 100644
index aaf19b6..0000000
--- a/third_party/freetype/src/type1/t1gload.c
+++ /dev/null
@@ -1,524 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1gload.c                                                              */
-/*                                                                         */
-/*    Type 1 Glyph Loader (body).                                          */
-/*                                                                         */
-/*  Copyright 1996-2017 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 "t1gload.h"
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_OUTLINE_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-#include "t1errors.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_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 )
-  {
-    T1_Face   face  = (T1_Face)decoder->builder.face;
-    T1_Font   type1 = &face->type1;
-    FT_Error  error = FT_Err_Ok;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Incremental_InterfaceRec *inc =
-                      face->root.internal->incremental_interface;
-#endif
-
-
-    decoder->font_matrix = type1->font_matrix;
-    decoder->font_offset = type1->font_offset;
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* For incremental fonts get the character data using the */
-    /* callback function.                                     */
-    if ( inc )
-      error = inc->funcs->get_glyph_data( inc->object,
-                                          glyph_index, char_string );
-    else
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    /* For ordinary fonts get the character data stored in the face record. */
-    {
-      char_string->pointer = type1->charstrings[glyph_index];
-      char_string->length  = (FT_Int)type1->charstrings_len[glyph_index];
-    }
-
-    if ( !error )
-      error = decoder->funcs.parse_charstrings(
-                decoder, (FT_Byte*)char_string->pointer,
-                (FT_UInt)char_string->length );
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    /* Incremental fonts can optionally override the metrics. */
-    if ( !error && inc && inc->funcs->get_glyph_metrics )
-    {
-      FT_Incremental_MetricsRec  metrics;
-
-
-      metrics.bearing_x = FIXED_TO_INT( decoder->builder.left_bearing.x );
-      metrics.bearing_y = 0;
-      metrics.advance   = FIXED_TO_INT( decoder->builder.advance.x );
-      metrics.advance_v = FIXED_TO_INT( decoder->builder.advance.y );
-
-      error = inc->funcs->get_glyph_metrics( inc->object,
-                                             glyph_index, FALSE, &metrics );
-
-      decoder->builder.left_bearing.x = INT_TO_FIXED( metrics.bearing_x );
-      decoder->builder.advance.x      = INT_TO_FIXED( metrics.advance );
-      decoder->builder.advance.y      = INT_TO_FIXED( metrics.advance_v );
-    }
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    return error;
-  }
-
-
-  FT_CALLBACK_DEF( FT_Error )
-  T1_Parse_Glyph( T1_Decoder  decoder,
-                  FT_UInt     glyph_index )
-  {
-    FT_Data   glyph_data;
-    FT_Error  error = T1_Parse_Glyph_And_Get_Char_String(
-                        decoder, glyph_index, &glyph_data );
-
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-
-    if ( !error )
-    {
-      T1_Face  face = (T1_Face)decoder->builder.face;
-
-
-      if ( face->root.internal->incremental_interface )
-        face->root.internal->incremental_interface->funcs->free_glyph_data(
-          face->root.internal->incremental_interface->object,
-          &glyph_data );
-    }
-
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Compute_Max_Advance( T1_Face  face,
-                          FT_Pos*  max_advance )
-  {
-    FT_Error       error;
-    T1_DecoderRec  decoder;
-    FT_Int         glyph_index;
-    T1_Font        type1 = &face->type1;
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
-
-    *max_advance = 0;
-
-    /* initialize load decoder */
-    error = psaux->t1_decoder_funcs->init( &decoder,
-                                           (FT_Face)face,
-                                           0, /* size       */
-                                           0, /* glyph slot */
-                                           (FT_Byte**)type1->glyph_names,
-                                           face->blend,
-                                           0,
-                                           FT_RENDER_MODE_NORMAL,
-                                           T1_Parse_Glyph );
-    if ( error )
-      return error;
-
-    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.subrs_hash    = type1->subrs_hash;
-
-    decoder.buildchar     = face->buildchar;
-    decoder.len_buildchar = face->len_buildchar;
-
-    *max_advance = 0;
-
-    /* for each glyph, parse the glyph charstring and extract */
-    /* the advance width                                      */
-    for ( glyph_index = 0; glyph_index < type1->num_glyphs; glyph_index++ )
-    {
-      /* now get load the unscaled outline */
-      (void)T1_Parse_Glyph( &decoder, (FT_UInt)glyph_index );
-      if ( glyph_index == 0 || decoder.builder.advance.x > *max_advance )
-        *max_advance = decoder.builder.advance.x;
-
-      /* ignore the error if one occurred - skip to next glyph */
-    }
-
-    psaux->t1_decoder_funcs->done( &decoder );
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Get_Advances( FT_Face    t1face,        /* T1_Face */
-                   FT_UInt    first,
-                   FT_UInt    count,
-                   FT_Int32   load_flags,
-                   FT_Fixed*  advances )
-  {
-    T1_Face        face  = (T1_Face)t1face;
-    T1_DecoderRec  decoder;
-    T1_Font        type1 = &face->type1;
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-    FT_UInt        nn;
-    FT_Error       error;
-
-
-    if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-    {
-      for ( nn = 0; nn < count; nn++ )
-        advances[nn] = 0;
-
-      return FT_Err_Ok;
-    }
-
-    error = psaux->t1_decoder_funcs->init( &decoder,
-                                           (FT_Face)face,
-                                           0, /* size       */
-                                           0, /* glyph slot */
-                                           (FT_Byte**)type1->glyph_names,
-                                           face->blend,
-                                           0,
-                                           FT_RENDER_MODE_NORMAL,
-                                           T1_Parse_Glyph );
-    if ( error )
-      return error;
-
-    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.subrs_hash = type1->subrs_hash;
-
-    decoder.buildchar     = face->buildchar;
-    decoder.len_buildchar = face->len_buildchar;
-
-    for ( nn = 0; nn < count; nn++ )
-    {
-      error = T1_Parse_Glyph( &decoder, first + nn );
-      if ( !error )
-        advances[nn] = FIXED_TO_INT( decoder.builder.advance.x );
-      else
-        advances[nn] = 0;
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Load_Glyph( FT_GlyphSlot  t1glyph,          /* T1_GlyphSlot */
-                 FT_Size       t1size,           /* T1_Size      */
-                 FT_UInt       glyph_index,
-                 FT_Int32      load_flags )
-  {
-    T1_GlyphSlot            glyph = (T1_GlyphSlot)t1glyph;
-    FT_Error                error;
-    T1_DecoderRec           decoder;
-    T1_Face                 face = (T1_Face)t1glyph->face;
-    FT_Bool                 hinting;
-    T1_Font                 type1         = &face->type1;
-    PSAux_Service           psaux         = (PSAux_Service)face->psaux;
-    const T1_Decoder_Funcs  decoder_funcs = psaux->t1_decoder_funcs;
-
-    FT_Matrix               font_matrix;
-    FT_Vector               font_offset;
-    FT_Data                 glyph_data;
-    FT_Bool                 must_finish_decoder = FALSE;
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    FT_Bool                 glyph_data_loaded = 0;
-#endif
-
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    if ( glyph_index >= (FT_UInt)face->root.num_glyphs &&
-         !face->root.internal->incremental_interface   )
-#else
-    if ( glyph_index >= (FT_UInt)face->root.num_glyphs )
-#endif /* FT_CONFIG_OPTION_INCREMENTAL */
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_TRACE1(( "T1_Load_Glyph: glyph index %d\n", glyph_index ));
-
-    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
-
-    if ( load_flags & FT_LOAD_NO_RECURSE )
-      load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING;
-
-    if ( t1size )
-    {
-      glyph->x_scale = t1size->metrics.x_scale;
-      glyph->y_scale = t1size->metrics.y_scale;
-    }
-    else
-    {
-      glyph->x_scale = 0x10000L;
-      glyph->y_scale = 0x10000L;
-    }
-
-    t1glyph->outline.n_points   = 0;
-    t1glyph->outline.n_contours = 0;
-
-    hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE   ) == 0 &&
-                       ( load_flags & FT_LOAD_NO_HINTING ) == 0 );
-
-    t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
-    error = decoder_funcs->init( &decoder,
-                                 t1glyph->face,
-                                 t1size,
-                                 t1glyph,
-                                 (FT_Byte**)type1->glyph_names,
-                                 face->blend,
-                                 FT_BOOL( hinting ),
-                                 FT_LOAD_TARGET_MODE( load_flags ),
-                                 T1_Parse_Glyph );
-    if ( error )
-      goto Exit;
-
-    must_finish_decoder = TRUE;
-
-    decoder.builder.no_recurse = FT_BOOL(
-                                   ( load_flags & FT_LOAD_NO_RECURSE ) != 0 );
-
-    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 );
-    if ( error )
-      goto Exit;
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    glyph_data_loaded = 1;
-#endif
-
-    font_matrix = decoder.font_matrix;
-    font_offset = decoder.font_offset;
-
-    /* save new glyph tables */
-    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                                    */
-    if ( !error )
-    {
-      t1glyph->outline.flags &= FT_OUTLINE_OWNER;
-      t1glyph->outline.flags |= FT_OUTLINE_REVERSE_FILL;
-
-      /* for composite glyphs, return only left side bearing and */
-      /* advance width                                           */
-      if ( load_flags & FT_LOAD_NO_RECURSE )
-      {
-        FT_Slot_Internal  internal = t1glyph->internal;
-
-
-        t1glyph->metrics.horiBearingX =
-          FIXED_TO_INT( decoder.builder.left_bearing.x );
-        t1glyph->metrics.horiAdvance  =
-          FIXED_TO_INT( decoder.builder.advance.x );
-
-        internal->glyph_matrix      = font_matrix;
-        internal->glyph_delta       = font_offset;
-        internal->glyph_transformed = 1;
-      }
-      else
-      {
-        FT_BBox            cbox;
-        FT_Glyph_Metrics*  metrics = &t1glyph->metrics;
-
-
-        /* copy the _unscaled_ advance width */
-        metrics->horiAdvance =
-          FIXED_TO_INT( decoder.builder.advance.x );
-        t1glyph->linearHoriAdvance =
-          FIXED_TO_INT( decoder.builder.advance.x );
-        t1glyph->internal->glyph_transformed = 0;
-
-        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-        {
-          /* make up vertical ones */
-          metrics->vertAdvance = ( face->type1.font_bbox.yMax -
-                                   face->type1.font_bbox.yMin ) >> 16;
-          t1glyph->linearVertAdvance = metrics->vertAdvance;
-        }
-        else
-        {
-          metrics->vertAdvance =
-            FIXED_TO_INT( decoder.builder.advance.y );
-          t1glyph->linearVertAdvance =
-            FIXED_TO_INT( decoder.builder.advance.y );
-        }
-
-        t1glyph->format = FT_GLYPH_FORMAT_OUTLINE;
-
-        if ( t1size && t1size->metrics.y_ppem < 24 )
-          t1glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION;
-
-#if 1
-        /* 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( &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 );
-
-          metrics->horiAdvance += font_offset.x;
-          metrics->vertAdvance += font_offset.y;
-        }
-#endif
-
-        if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 )
-        {
-          /* scale the outline and the metrics */
-          FT_Int       n;
-          FT_Outline*  cur = decoder.builder.base;
-          FT_Vector*   vec = cur->points;
-          FT_Fixed     x_scale = glyph->x_scale;
-          FT_Fixed     y_scale = glyph->y_scale;
-
-
-          /* First of all, scale the points, if we are not hinting */
-          if ( !hinting || ! decoder.builder.hints_funcs )
-            for ( n = cur->n_points; n > 0; n--, vec++ )
-            {
-              vec->x = FT_MulFix( vec->x, x_scale );
-              vec->y = FT_MulFix( vec->y, y_scale );
-            }
-
-          /* Then scale the metrics */
-          metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale );
-          metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale );
-        }
-
-        /* compute the other metrics */
-        FT_Outline_Get_CBox( &t1glyph->outline, &cbox );
-
-        metrics->width  = cbox.xMax - cbox.xMin;
-        metrics->height = cbox.yMax - cbox.yMin;
-
-        metrics->horiBearingX = cbox.xMin;
-        metrics->horiBearingY = cbox.yMax;
-
-        if ( load_flags & FT_LOAD_VERTICAL_LAYOUT )
-        {
-          /* make up vertical ones */
-          ft_synthesize_vertical_metrics( metrics,
-                                          metrics->vertAdvance );
-        }
-      }
-
-      /* Set control data to the glyph charstrings.  Note that this is */
-      /* _not_ zero-terminated.                                        */
-      t1glyph->control_data = (FT_Byte*)glyph_data.pointer;
-      t1glyph->control_len  = glyph_data.length;
-    }
-
-
-  Exit:
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-    if ( glyph_data_loaded && face->root.internal->incremental_interface )
-    {
-      face->root.internal->incremental_interface->funcs->free_glyph_data(
-        face->root.internal->incremental_interface->object,
-        &glyph_data );
-
-      /* Set the control data to null - it is no longer available if   */
-      /* loaded incrementally.                                         */
-      t1glyph->control_data = NULL;
-      t1glyph->control_len  = 0;
-    }
-#endif
-
-    if ( must_finish_decoder )
-      decoder_funcs->done( &decoder );
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1gload.h b/third_party/freetype/src/type1/t1gload.h
deleted file mode 100644
index cc4d5e7..0000000
--- a/third_party/freetype/src/type1/t1gload.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1gload.h                                                              */
-/*                                                                         */
-/*    Type 1 Glyph Loader (specification).                                 */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1GLOAD_H_
-#define T1GLOAD_H_
-
-
-#include <ft2build.h>
-#include "t1objs.h"
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  T1_Compute_Max_Advance( T1_Face  face,
-                          FT_Pos*  max_advance );
-
-  FT_LOCAL( FT_Error )
-  T1_Get_Advances( FT_Face    face,
-                   FT_UInt    first,
-                   FT_UInt    count,
-                   FT_Int32   load_flags,
-                   FT_Fixed*  advances );
-
-  FT_LOCAL( FT_Error )
-  T1_Load_Glyph( FT_GlyphSlot  glyph,
-                 FT_Size       size,
-                 FT_UInt       glyph_index,
-                 FT_Int32      load_flags );
-
-
-FT_END_HEADER
-
-#endif /* T1GLOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1load.c b/third_party/freetype/src/type1/t1load.c
deleted file mode 100644
index f5c661f..0000000
--- a/third_party/freetype/src/type1/t1load.c
+++ /dev/null
@@ -1,2449 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1load.c                                                               */
-/*                                                                         */
-/*    Type 1 font loader (body).                                           */
-/*                                                                         */
-/*  Copyright 1996-2017 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 is the new and improved Type 1 data loader for FreeType 2.  The  */
-  /* old loader has several problems: it is slow, complex, difficult to    */
-  /* maintain, and contains incredible hacks to make it accept some        */
-  /* ill-formed Type 1 fonts without hiccup-ing.  Moreover, about 5% of    */
-  /* the Type 1 fonts on my machine still aren't loaded correctly by it.   */
-  /*                                                                       */
-  /* This version is much simpler, much faster and also easier to read and */
-  /* maintain by a great order of magnitude.  The idea behind it is to     */
-  /* _not_ try to read the Type 1 token stream with a state machine (i.e.  */
-  /* a Postscript-like interpreter) but rather to perform simple pattern   */
-  /* matching.                                                             */
-  /*                                                                       */
-  /* Indeed, nearly all data definitions follow a simple pattern like      */
-  /*                                                                       */
-  /*  ... /Field <data> ...                                                */
-  /*                                                                       */
-  /* where <data> can be a number, a boolean, a string, or an array of     */
-  /* numbers.  There are a few exceptions, namely the encoding, font name, */
-  /* charstrings, and subrs; they are handled with a special pattern       */
-  /* matching routine.                                                     */
-  /*                                                                       */
-  /* All other common cases are handled very simply.  The matching rules   */
-  /* are defined in the file `t1tokens.h' through the use of several       */
-  /* macros calls PARSE_XXX.  This file is included twice here; the first  */
-  /* time to generate parsing callback functions, the second time to       */
-  /* generate a table of keywords (with pointers to the associated         */
-  /* callback functions).                                                  */
-  /*                                                                       */
-  /* The function `parse_dict' simply scans *linearly* a given dictionary  */
-  /* (either the top-level or private one) and calls the appropriate       */
-  /* callback when it encounters an immediate keyword.                     */
-  /*                                                                       */
-  /* This is by far the fastest way one can find to parse and read all     */
-  /* data.                                                                 */
-  /*                                                                       */
-  /* This led to tremendous code size reduction.  Note that later, the     */
-  /* glyph loader will also be _greatly_ simplified, and the automatic     */
-  /* hinter will replace the clumsy `t1hinter'.                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_CONFIG_CONFIG_H
-#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"
-
-
-#ifdef FT_CONFIG_OPTION_INCREMENTAL
-#define IS_INCREMENTAL  (FT_Bool)( face->root.internal->incremental_interface != 0 )
-#else
-#define IS_INCREMENTAL  0
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_t1load
-
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    MULTIPLE MASTERS SUPPORT                   *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static FT_Error
-  t1_allocate_blend( T1_Face  face,
-                     FT_UInt  num_designs,
-                     FT_UInt  num_axis )
-  {
-    PS_Blend   blend;
-    FT_Memory  memory = face->root.memory;
-    FT_Error   error  = FT_Err_Ok;
-
-
-    blend = face->blend;
-    if ( !blend )
-    {
-      if ( FT_NEW( blend ) )
-        goto Exit;
-
-      blend->num_default_design_vector = 0;
-
-      face->blend = blend;
-    }
-
-    /* allocate design data if needed */
-    if ( num_designs > 0 )
-    {
-      if ( blend->num_designs == 0 )
-      {
-        FT_UInt  nn;
-
-
-        /* allocate the blend `private' and `font_info' dictionaries */
-        if ( FT_NEW_ARRAY( blend->font_infos[1], num_designs     ) ||
-             FT_NEW_ARRAY( blend->privates  [1], num_designs     ) ||
-             FT_NEW_ARRAY( blend->bboxes    [1], num_designs     ) ||
-             FT_NEW_ARRAY( blend->weight_vector, num_designs * 2 ) )
-          goto Exit;
-
-        blend->default_weight_vector = blend->weight_vector + num_designs;
-
-        blend->font_infos[0] = &face->type1.font_info;
-        blend->privates  [0] = &face->type1.private_dict;
-        blend->bboxes    [0] = &face->type1.font_bbox;
-
-        for ( nn = 2; nn <= num_designs; nn++ )
-        {
-          blend->font_infos[nn] = blend->font_infos[nn - 1] + 1;
-          blend->privates  [nn] = blend->privates  [nn - 1] + 1;
-          blend->bboxes    [nn] = blend->bboxes    [nn - 1] + 1;
-        }
-
-        blend->num_designs = num_designs;
-      }
-      else if ( blend->num_designs != num_designs )
-        goto Fail;
-    }
-
-    /* allocate axis data if needed */
-    if ( num_axis > 0 )
-    {
-      if ( blend->num_axis != 0 && blend->num_axis != num_axis )
-        goto Fail;
-
-      blend->num_axis = num_axis;
-    }
-
-    /* allocate the blend design pos table if needed */
-    num_designs = blend->num_designs;
-    num_axis    = blend->num_axis;
-    if ( num_designs && num_axis && blend->design_pos[0] == 0 )
-    {
-      FT_UInt  n;
-
-
-      if ( FT_NEW_ARRAY( blend->design_pos[0], num_designs * num_axis ) )
-        goto Exit;
-
-      for ( n = 1; n < num_designs; n++ )
-        blend->design_pos[n] = blend->design_pos[0] + num_axis * n;
-    }
-
-  Exit:
-    return error;
-
-  Fail:
-    error = FT_THROW( Invalid_File_Format );
-    goto Exit;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Get_Multi_Master( T1_Face           face,
-                       FT_Multi_Master*  master )
-  {
-    PS_Blend  blend = face->blend;
-    FT_UInt   n;
-    FT_Error  error;
-
-
-    error = FT_THROW( Invalid_Argument );
-
-    if ( blend )
-    {
-      master->num_axis    = blend->num_axis;
-      master->num_designs = blend->num_designs;
-
-      for ( n = 0; n < blend->num_axis; n++ )
-      {
-        FT_MM_Axis*   axis = master->axis + n;
-        PS_DesignMap  map = blend->design_map + n;
-
-
-        axis->name    = blend->axis_names[n];
-        axis->minimum = map->design_points[0];
-        axis->maximum = map->design_points[map->num_points - 1];
-      }
-
-      error = FT_Err_Ok;
-    }
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Given a normalized (blend) coordinate, figure out the design          */
-  /* coordinate appropriate for that value.                                */
-  /*                                                                       */
-  static FT_Fixed
-  mm_axis_unmap( PS_DesignMap  axismap,
-                 FT_Fixed      ncv )
-  {
-    int  j;
-
-
-    if ( ncv <= axismap->blend_points[0] )
-      return INT_TO_FIXED( axismap->design_points[0] );
-
-    for ( j = 1; j < axismap->num_points; j++ )
-    {
-      if ( ncv <= axismap->blend_points[j] )
-        return INT_TO_FIXED( axismap->design_points[j - 1] ) +
-               ( axismap->design_points[j] - axismap->design_points[j - 1] ) *
-               FT_DivFix( ncv - axismap->blend_points[j - 1],
-                          axismap->blend_points[j] -
-                            axismap->blend_points[j - 1] );
-    }
-
-    return INT_TO_FIXED( axismap->design_points[axismap->num_points - 1] );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Given a vector of weights, one for each design, figure out the        */
-  /* normalized axis coordinates which gave rise to those weights.         */
-  /*                                                                       */
-  static void
-  mm_weights_unmap( FT_Fixed*  weights,
-                    FT_Fixed*  axiscoords,
-                    FT_UInt    axis_count )
-  {
-    FT_ASSERT( axis_count <= T1_MAX_MM_AXIS );
-
-    if ( axis_count == 1 )
-      axiscoords[0] = weights[1];
-
-    else if ( axis_count == 2 )
-    {
-      axiscoords[0] = weights[3] + weights[1];
-      axiscoords[1] = weights[3] + weights[2];
-    }
-
-    else if ( axis_count == 3 )
-    {
-      axiscoords[0] = weights[7] + weights[5] + weights[3] + weights[1];
-      axiscoords[1] = weights[7] + weights[6] + weights[3] + weights[2];
-      axiscoords[2] = weights[7] + weights[6] + weights[5] + weights[4];
-    }
-
-    else
-    {
-      axiscoords[0] = weights[15] + weights[13] + weights[11] + weights[9] +
-                        weights[7] + weights[5] + weights[3] + weights[1];
-      axiscoords[1] = weights[15] + weights[14] + weights[11] + weights[10] +
-                        weights[7] + weights[6] + weights[3] + weights[2];
-      axiscoords[2] = weights[15] + weights[14] + weights[13] + weights[12] +
-                        weights[7] + weights[6] + weights[5] + weights[4];
-      axiscoords[3] = weights[15] + weights[14] + weights[13] + weights[12] +
-                        weights[11] + weights[10] + weights[9] + weights[8];
-    }
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Just a wrapper around T1_Get_Multi_Master to support the different    */
-  /*  arguments needed by the GX var distortable fonts.                    */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  T1_Get_MM_Var( T1_Face      face,
-                 FT_MM_Var*  *master )
-  {
-    FT_Memory        memory = face->root.memory;
-    FT_MM_Var       *mmvar = NULL;
-    FT_Multi_Master  mmaster;
-    FT_Error         error;
-    FT_UInt          i;
-    FT_Fixed         axiscoords[T1_MAX_MM_AXIS];
-    PS_Blend         blend = face->blend;
-
-
-    error = T1_Get_Multi_Master( face, &mmaster );
-    if ( error )
-      goto Exit;
-    if ( FT_ALLOC( mmvar,
-                   sizeof ( FT_MM_Var ) +
-                     mmaster.num_axis * sizeof ( FT_Var_Axis ) ) )
-      goto Exit;
-
-    mmvar->num_axis        = mmaster.num_axis;
-    mmvar->num_designs     = mmaster.num_designs;
-    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++ )
-    {
-      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].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 )
-        mmvar->axis[i].tag = FT_MAKE_TAG( 'w', 'd', 't', 'h' );
-      else if ( ft_strcmp( mmvar->axis[i].name, "OpticalSize" ) == 0 )
-        mmvar->axis[i].tag = FT_MAKE_TAG( 'o', 'p', 's', 'z' );
-    }
-
-    if ( blend->num_designs == ( 1U << blend->num_axis ) )
-    {
-      mm_weights_unmap( blend->default_weight_vector,
-                        axiscoords,
-                        blend->num_axis );
-
-      for ( i = 0; i < mmaster.num_axis; i++ )
-        mmvar->axis[i].def = mm_axis_unmap( &blend->design_map[i],
-                                            axiscoords[i] );
-    }
-
-    *master = mmvar;
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( 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;
-
-
-    if ( !blend )
-      return FT_THROW( Invalid_Argument );
-
-    if ( num_coords > blend->num_axis )
-      num_coords = blend->num_axis;
-
-    /* recompute the weight vector from the blend coordinates */
-    for ( n = 0; n < blend->num_designs; n++ )
-    {
-      FT_Fixed  result = 0x10000L;  /* 1.0 fixed */
-
-
-      for ( m = 0; m < blend->num_axis; m++ )
-      {
-        FT_Fixed  factor;
-
-
-        /* get current blend axis position;                  */
-        /* use a default value if we don't have a coordinate */
-        factor = m < num_coords ? coords[m] : 0x8000;
-        if ( factor < 0 )
-          factor = 0;
-        if ( factor > 0x10000L )
-          factor = 0x10000L;
-
-        if ( ( n & ( 1 << m ) ) == 0 )
-          factor = 0x10000L - factor;
-
-        result = FT_MulFix( result, factor );
-      }
-      blend->weight_vector[n] = result;
-    }
-
-    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;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Set_MM_Design( T1_Face   face,
-                    FT_UInt   num_coords,
-                    FT_Long*  coords )
-  {
-    PS_Blend  blend = face->blend;
-    FT_UInt   n, p;
-    FT_Fixed  final_blends[T1_MAX_MM_DESIGNS];
-
-
-    if ( !blend )
-      return FT_THROW( Invalid_Argument );
-
-    if ( num_coords > blend->num_axis )
-      num_coords = blend->num_axis;
-
-    /* compute the blend coordinates through the blend design map */
-
-    for ( n = 0; n < blend->num_axis; n++ )
-    {
-      FT_Long       design;
-      FT_Fixed      the_blend;
-      PS_DesignMap  map     = blend->design_map + n;
-      FT_Long*      designs = map->design_points;
-      FT_Fixed*     blends  = map->blend_points;
-      FT_Int        before  = -1, after = -1;
-
-
-      /* use a default value if we don't have a coordinate */
-      if ( n < num_coords )
-        design = coords[n];
-      else
-        design = ( designs[map->num_points - 1] - designs[0] ) / 2;
-
-      for ( p = 0; p < (FT_UInt)map->num_points; p++ )
-      {
-        FT_Long  p_design = designs[p];
-
-
-        /* exact match? */
-        if ( design == p_design )
-        {
-          the_blend = blends[p];
-          goto Found;
-        }
-
-        if ( design < p_design )
-        {
-          after = (FT_Int)p;
-          break;
-        }
-
-        before = (FT_Int)p;
-      }
-
-      /* now interpolate if necessary */
-      if ( before < 0 )
-        the_blend = blends[0];
-
-      else if ( after < 0 )
-        the_blend = blends[map->num_points - 1];
-
-      else
-        the_blend = FT_MulDiv( design         - designs[before],
-                               blends [after] - blends [before],
-                               designs[after] - designs[before] );
-
-    Found:
-      final_blends[n] = the_blend;
-    }
-
-    return T1_Set_MM_Blend( face, blend->num_axis, final_blends );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Just a wrapper around T1_Set_MM_Design to support the different       */
-  /* arguments needed by the GX var distortable fonts.                     */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  T1_Set_Var_Design( T1_Face    face,
-                     FT_UInt    num_coords,
-                     FT_Fixed*  coords )
-  {
-     FT_Long  lcoords[T1_MAX_MM_AXIS];
-     FT_UInt  i;
-
-
-     if ( num_coords > T1_MAX_MM_AXIS )
-       num_coords = T1_MAX_MM_AXIS;
-
-     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 )
-  {
-    FT_Memory  memory = face->root.memory;
-    PS_Blend   blend  = face->blend;
-
-
-    if ( blend )
-    {
-      FT_UInt  num_designs = blend->num_designs;
-      FT_UInt  num_axis    = blend->num_axis;
-      FT_UInt  n;
-
-
-      /* release design pos table */
-      FT_FREE( blend->design_pos[0] );
-      for ( n = 1; n < num_designs; n++ )
-        blend->design_pos[n] = NULL;
-
-      /* release blend `private' and `font info' dictionaries */
-      FT_FREE( blend->privates[1] );
-      FT_FREE( blend->font_infos[1] );
-      FT_FREE( blend->bboxes[1] );
-
-      for ( n = 0; n < num_designs; n++ )
-      {
-        blend->privates  [n] = NULL;
-        blend->font_infos[n] = NULL;
-        blend->bboxes    [n] = NULL;
-      }
-
-      /* release weight vectors */
-      FT_FREE( blend->weight_vector );
-      blend->default_weight_vector = NULL;
-
-      /* release axis names */
-      for ( n = 0; n < num_axis; n++ )
-        FT_FREE( blend->axis_names[n] );
-
-      /* release design map */
-      for ( n = 0; n < num_axis; n++ )
-      {
-        PS_DesignMap  dmap = blend->design_map + n;
-
-
-        FT_FREE( dmap->design_points );
-        dmap->num_points = 0;
-      }
-
-      FT_FREE( face->blend );
-    }
-  }
-
-
-  static void
-  parse_blend_axis_types( T1_Face    face,
-                          T1_Loader  loader )
-  {
-    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
-    FT_Int       n, num_axis;
-    FT_Error     error = FT_Err_Ok;
-    PS_Blend     blend;
-    FT_Memory    memory;
-
-
-    /* take an array of objects */
-    T1_ToTokenArray( &loader->parser, axis_tokens,
-                     T1_MAX_MM_AXIS, &num_axis );
-    if ( num_axis < 0 )
-    {
-      error = FT_ERR( Ignore );
-      goto Exit;
-    }
-    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
-    {
-      FT_ERROR(( "parse_blend_axis_types: incorrect number of axes: %d\n",
-                 num_axis ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    /* allocate blend if necessary */
-    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
-    if ( error )
-      goto Exit;
-
-    blend  = face->blend;
-    memory = face->root.memory;
-
-    /* each token is an immediate containing the name of the axis */
-    for ( n = 0; n < num_axis; n++ )
-    {
-      T1_Token  token = axis_tokens + n;
-      FT_Byte*  name;
-      FT_UInt   len;
-
-
-      /* skip first slash, if any */
-      if ( token->start[0] == '/' )
-        token->start++;
-
-      len = (FT_UInt)( token->limit - token->start );
-      if ( len == 0 )
-      {
-        error = FT_THROW( Invalid_File_Format );
-        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;
-
-      name = (FT_Byte*)blend->axis_names[n];
-      FT_MEM_COPY( name, token->start, len );
-      name[len] = '\0';
-    }
-
-  Exit:
-    loader->parser.root.error = error;
-  }
-
-
-  static void
-  parse_blend_design_positions( T1_Face    face,
-                                T1_Loader  loader )
-  {
-    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
-    FT_Int       num_designs;
-    FT_Int       num_axis;
-    T1_Parser    parser = &loader->parser;
-
-    FT_Error     error = FT_Err_Ok;
-    PS_Blend     blend;
-
-
-    /* get the array of design tokens -- compute number of designs */
-    T1_ToTokenArray( parser, design_tokens,
-                     T1_MAX_MM_DESIGNS, &num_designs );
-    if ( num_designs < 0 )
-    {
-      error = FT_ERR( Ignore );
-      goto Exit;
-    }
-    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
-    {
-      FT_ERROR(( "parse_blend_design_positions:"
-                 " incorrect number of designs: %d\n",
-                 num_designs ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    {
-      FT_Byte*  old_cursor = parser->root.cursor;
-      FT_Byte*  old_limit  = parser->root.limit;
-      FT_Int    n;
-
-
-      blend    = face->blend;
-      num_axis = 0;  /* make compiler happy */
-
-      for ( n = 0; n < num_designs; n++ )
-      {
-        T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
-        T1_Token     token;
-        FT_Int       axis, n_axis;
-
-
-        /* read axis/coordinates tokens */
-        token = design_tokens + n;
-        parser->root.cursor = token->start;
-        parser->root.limit  = token->limit;
-        T1_ToTokenArray( parser, axis_tokens, T1_MAX_MM_AXIS, &n_axis );
-
-        if ( n == 0 )
-        {
-          if ( n_axis <= 0 || n_axis > T1_MAX_MM_AXIS )
-          {
-            FT_ERROR(( "parse_blend_design_positions:"
-                       " invalid number of axes: %d\n",
-                       n_axis ));
-            error = FT_THROW( Invalid_File_Format );
-            goto Exit;
-          }
-
-          num_axis = n_axis;
-          error = t1_allocate_blend( face,
-                                     (FT_UInt)num_designs,
-                                     (FT_UInt)num_axis );
-          if ( error )
-            goto Exit;
-          blend = face->blend;
-        }
-        else if ( n_axis != num_axis )
-        {
-          FT_ERROR(( "parse_blend_design_positions: incorrect table\n" ));
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /* now read each axis token into the design position */
-        for ( axis = 0; axis < n_axis; axis++ )
-        {
-          T1_Token  token2 = axis_tokens + axis;
-
-
-          parser->root.cursor = token2->start;
-          parser->root.limit  = token2->limit;
-          blend->design_pos[n][axis] = T1_ToFixed( parser, 0 );
-        }
-      }
-
-      loader->parser.root.cursor = old_cursor;
-      loader->parser.root.limit  = old_limit;
-    }
-
-  Exit:
-    loader->parser.root.error = error;
-  }
-
-
-  static void
-  parse_blend_design_map( T1_Face    face,
-                          T1_Loader  loader )
-  {
-    FT_Error     error  = FT_Err_Ok;
-    T1_Parser    parser = &loader->parser;
-    PS_Blend     blend;
-    T1_TokenRec  axis_tokens[T1_MAX_MM_AXIS];
-    FT_Int       n, num_axis;
-    FT_Byte*     old_cursor;
-    FT_Byte*     old_limit;
-    FT_Memory    memory = face->root.memory;
-
-
-    T1_ToTokenArray( parser, axis_tokens,
-                     T1_MAX_MM_AXIS, &num_axis );
-    if ( num_axis < 0 )
-    {
-      error = FT_ERR( Ignore );
-      goto Exit;
-    }
-    if ( num_axis == 0 || num_axis > T1_MAX_MM_AXIS )
-    {
-      FT_ERROR(( "parse_blend_design_map: incorrect number of axes: %d\n",
-                 num_axis ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    old_cursor = parser->root.cursor;
-    old_limit  = parser->root.limit;
-
-    error = t1_allocate_blend( face, 0, (FT_UInt)num_axis );
-    if ( error )
-      goto Exit;
-    blend = face->blend;
-
-    /* now read each axis design map */
-    for ( n = 0; n < num_axis; n++ )
-    {
-      PS_DesignMap  map = blend->design_map + n;
-      T1_Token      axis_token;
-      T1_TokenRec   point_tokens[T1_MAX_MM_MAP_POINTS];
-      FT_Int        p, num_points;
-
-
-      axis_token = axis_tokens + n;
-
-      parser->root.cursor = axis_token->start;
-      parser->root.limit  = axis_token->limit;
-      T1_ToTokenArray( parser, point_tokens,
-                       T1_MAX_MM_MAP_POINTS, &num_points );
-
-      if ( num_points <= 0 || num_points > T1_MAX_MM_MAP_POINTS )
-      {
-        FT_ERROR(( "parse_blend_design_map: incorrect table\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        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;
-      map->blend_points = map->design_points + num_points;
-      map->num_points   = (FT_Byte)num_points;
-
-      for ( p = 0; p < num_points; p++ )
-      {
-        T1_Token  point_token;
-
-
-        point_token = point_tokens + p;
-
-        /* don't include delimiting brackets */
-        parser->root.cursor = point_token->start + 1;
-        parser->root.limit  = point_token->limit - 1;
-
-        map->design_points[p] = T1_ToInt( parser );
-        map->blend_points [p] = T1_ToFixed( parser, 0 );
-      }
-    }
-
-    parser->root.cursor = old_cursor;
-    parser->root.limit  = old_limit;
-
-  Exit:
-    parser->root.error = error;
-  }
-
-
-  static void
-  parse_weight_vector( T1_Face    face,
-                       T1_Loader  loader )
-  {
-    T1_TokenRec  design_tokens[T1_MAX_MM_DESIGNS];
-    FT_Int       num_designs;
-    FT_Error     error  = FT_Err_Ok;
-    T1_Parser    parser = &loader->parser;
-    PS_Blend     blend  = face->blend;
-    T1_Token     token;
-    FT_Int       n;
-    FT_Byte*     old_cursor;
-    FT_Byte*     old_limit;
-
-
-    T1_ToTokenArray( parser, design_tokens,
-                     T1_MAX_MM_DESIGNS, &num_designs );
-    if ( num_designs < 0 )
-    {
-      error = FT_ERR( Ignore );
-      goto Exit;
-    }
-    if ( num_designs == 0 || num_designs > T1_MAX_MM_DESIGNS )
-    {
-      FT_ERROR(( "parse_weight_vector:"
-                 " incorrect number of designs: %d\n",
-                 num_designs ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    if ( !blend || !blend->num_designs )
-    {
-      error = t1_allocate_blend( face, (FT_UInt)num_designs, 0 );
-      if ( error )
-        goto Exit;
-      blend = face->blend;
-    }
-    else if ( blend->num_designs != (FT_UInt)num_designs )
-    {
-      FT_ERROR(( "parse_weight_vector:"
-                 " /BlendDesignPosition and /WeightVector have\n"
-                 "                    "
-                 " different number of elements\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    old_cursor = parser->root.cursor;
-    old_limit  = parser->root.limit;
-
-    for ( n = 0; n < num_designs; n++ )
-    {
-      token = design_tokens + n;
-      parser->root.cursor = token->start;
-      parser->root.limit  = token->limit;
-
-      blend->default_weight_vector[n] =
-      blend->weight_vector[n]         = T1_ToFixed( parser, 0 );
-    }
-
-    parser->root.cursor = old_cursor;
-    parser->root.limit  = old_limit;
-
-  Exit:
-    parser->root.error = error;
-  }
-
-
-  /* e.g., /BuildCharArray [0 0 0 0 0 0 0 0] def           */
-  /* we're only interested in the number of array elements */
-  static void
-  parse_buildchar( T1_Face    face,
-                   T1_Loader  loader )
-  {
-    face->len_buildchar = (FT_UInt)T1_ToFixedArray( &loader->parser,
-                                                    0, NULL, 0 );
-    return;
-  }
-
-
-#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
-
-
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                      TYPE 1 SYMBOL PARSING                    *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  static FT_Error
-  t1_load_keyword( T1_Face         face,
-                   T1_Loader       loader,
-                   const T1_Field  field )
-  {
-    FT_Error  error;
-    void*     dummy_object;
-    void**    objects;
-    FT_UInt   max_objects;
-    PS_Blend  blend = face->blend;
-
-
-    if ( blend && blend->num_designs == 0 )
-      blend = NULL;
-
-    /* if the keyword has a dedicated callback, call it */
-    if ( field->type == T1_FIELD_TYPE_CALLBACK )
-    {
-      field->reader( (FT_Face)face, loader );
-      error = loader->parser.root.error;
-      goto Exit;
-    }
-
-    /* now, the keyword is either a simple field, or a table of fields; */
-    /* we are now going to take care of it                              */
-    switch ( field->location )
-    {
-    case T1_FIELD_LOCATION_FONT_INFO:
-      dummy_object = &face->type1.font_info;
-      objects      = &dummy_object;
-      max_objects  = 0;
-
-      if ( blend )
-      {
-        objects     = (void**)blend->font_infos;
-        max_objects = blend->num_designs;
-      }
-      break;
-
-    case T1_FIELD_LOCATION_FONT_EXTRA:
-      dummy_object = &face->type1.font_extra;
-      objects      = &dummy_object;
-      max_objects  = 0;
-      break;
-
-    case T1_FIELD_LOCATION_PRIVATE:
-      dummy_object = &face->type1.private_dict;
-      objects      = &dummy_object;
-      max_objects  = 0;
-
-      if ( blend )
-      {
-        objects     = (void**)blend->privates;
-        max_objects = blend->num_designs;
-      }
-      break;
-
-    case T1_FIELD_LOCATION_BBOX:
-      dummy_object = &face->type1.font_bbox;
-      objects      = &dummy_object;
-      max_objects  = 0;
-
-      if ( blend )
-      {
-        objects     = (void**)blend->bboxes;
-        max_objects = blend->num_designs;
-      }
-      break;
-
-    case T1_FIELD_LOCATION_LOADER:
-      dummy_object = loader;
-      objects      = &dummy_object;
-      max_objects  = 0;
-      break;
-
-    case T1_FIELD_LOCATION_FACE:
-      dummy_object = face;
-      objects      = &dummy_object;
-      max_objects  = 0;
-      break;
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-    case T1_FIELD_LOCATION_BLEND:
-      dummy_object = face->blend;
-      objects      = &dummy_object;
-      max_objects  = 0;
-      break;
-#endif
-
-    default:
-      dummy_object = &face->type1;
-      objects      = &dummy_object;
-      max_objects  = 0;
-    }
-
-    if ( *objects )
-    {
-      if ( field->type == T1_FIELD_TYPE_INTEGER_ARRAY ||
-           field->type == T1_FIELD_TYPE_FIXED_ARRAY   )
-        error = T1_Load_Field_Table( &loader->parser, field,
-                                     objects, max_objects, 0 );
-      else
-        error = T1_Load_Field( &loader->parser, field,
-                               objects, max_objects, 0 );
-    }
-    else
-    {
-      FT_TRACE1(( "t1_load_keyword: ignoring keyword `%s'"
-                  " which is not valid at this point\n"
-                  "                 (probably due to missing keywords)\n",
-                 field->ident ));
-      error = FT_Err_Ok;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  parse_private( T1_Face    face,
-                 T1_Loader  loader )
-  {
-    FT_UNUSED( face );
-
-    loader->keywords_encountered |= T1_PRIVATE;
-  }
-
-
-  /* return 1 in case of success */
-
-  static int
-  read_binary_data( T1_Parser  parser,
-                    FT_ULong*  size,
-                    FT_Byte**  base,
-                    FT_Bool    incremental )
-  {
-    FT_Byte*  cur;
-    FT_Byte*  limit = parser->root.limit;
-
-
-    /* the binary data has one of the following formats */
-    /*                                                  */
-    /*   `size' [white*] RD white ....... ND            */
-    /*   `size' [white*] -| white ....... |-            */
-    /*                                                  */
-
-    T1_Skip_Spaces( parser );
-
-    cur = parser->root.cursor;
-
-    if ( cur < limit && ft_isdigit( *cur ) )
-    {
-      FT_Long  s = T1_ToInt( parser );
-
-
-      T1_Skip_PS_Token( parser );   /* `RD' or `-|' or something else */
-
-      /* there is only one whitespace char after the */
-      /* `RD' or `-|' token                          */
-      *base = parser->root.cursor + 1;
-
-      if ( s >= 0 && s < limit - *base )
-      {
-        parser->root.cursor += s + 1;
-        *size = (FT_ULong)s;
-        return !parser->root.error;
-      }
-    }
-
-    if( !incremental )
-    {
-      FT_ERROR(( "read_binary_data: invalid size field\n" ));
-      parser->root.error = FT_THROW( Invalid_File_Format );
-    }
-
-    return 0;
-  }
-
-
-  /* We now define the routines to handle the `/Encoding', `/Subrs', */
-  /* and `/CharStrings' dictionaries.                                */
-
-  static void
-  t1_parse_font_matrix( T1_Face    face,
-                        T1_Loader  loader )
-  {
-    T1_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;
-
-
-    /* input is scaled by 1000 to accommodate default FontMatrix */
-    result = T1_ToFixedArray( parser, 6, temp, 3 );
-
-    if ( result < 6 )
-    {
-      parser->root.error = FT_THROW( Invalid_File_Format );
-      return;
-    }
-
-    temp_scale = FT_ABS( temp[3] );
-
-    if ( temp_scale == 0 )
-    {
-      FT_ERROR(( "t1_parse_font_matrix: invalid font matrix\n" ));
-      parser->root.error = FT_THROW( Invalid_File_Format );
-      return;
-    }
-
-    /* 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 );
-      temp[4] = FT_DivFix( temp[4], temp_scale );
-      temp[5] = FT_DivFix( temp[5], temp_scale );
-      temp[3] = temp[3] < 0 ? -0x10000L : 0x10000L;
-    }
-
-    matrix->xx = temp[0];
-    matrix->yx = temp[1];
-    matrix->xy = temp[2];
-    matrix->yy = temp[3];
-
-    /* note that the offsets must be expressed in integer font units */
-    offset->x = temp[4] >> 16;
-    offset->y = temp[5] >> 16;
-  }
-
-
-  static void
-  parse_encoding( T1_Face    face,
-                  T1_Loader  loader )
-  {
-    T1_Parser  parser = &loader->parser;
-    FT_Byte*   cur;
-    FT_Byte*   limit  = parser->root.limit;
-
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    T1_Skip_Spaces( parser );
-    cur = parser->root.cursor;
-    if ( cur >= limit )
-    {
-      FT_ERROR(( "parse_encoding: out of bounds\n" ));
-      parser->root.error = FT_THROW( Invalid_File_Format );
-      return;
-    }
-
-    /* if we have a number or `[', the encoding is an array, */
-    /* and we must load it now                               */
-    if ( ft_isdigit( *cur ) || *cur == '[' )
-    {
-      T1_Encoding  encode          = &face->type1.encoding;
-      FT_Int       count, n;
-      PS_Table     char_table      = &loader->encoding_table;
-      FT_Memory    memory          = parser->root.memory;
-      FT_Error     error;
-      FT_Bool      only_immediates = 0;
-
-
-      /* read the number of entries in the encoding; should be 256 */
-      if ( *cur == '[' )
-      {
-        count           = 256;
-        only_immediates = 1;
-        parser->root.cursor++;
-      }
-      else
-        count = (FT_Int)T1_ToInt( parser );
-
-      /* only composite fonts (which we don't support) */
-      /* can have larger values                        */
-      if ( count > 256 )
-      {
-        FT_ERROR(( "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 )     ||
-           FT_NEW_ARRAY( encode->char_name,  count )     ||
-           FT_SET_ERROR( psaux->ps_table_funcs->init(
-                           char_table, count, memory ) ) )
-      {
-        parser->root.error = error;
-        return;
-      }
-
-      /* We need to `zero' out encoding_table.elements */
-      for ( n = 0; n < count; n++ )
-      {
-        char*  notdef = (char *)".notdef";
-
-
-        (void)T1_Add_Table( char_table, n, notdef, 8 );
-      }
-
-      /* Now we need to read records of the form                */
-      /*                                                        */
-      /*   ... charcode /charname ...                           */
-      /*                                                        */
-      /* for each entry in our table.                           */
-      /*                                                        */
-      /* We simply look for a number followed by an immediate   */
-      /* name.  Note that this ignores correctly the sequence   */
-      /* that is often seen in type1 fonts:                     */
-      /*                                                        */
-      /*   0 1 255 { 1 index exch /.notdef put } for dup        */
-      /*                                                        */
-      /* used to clean the encoding array before anything else. */
-      /*                                                        */
-      /* Alternatively, if the array is directly given as       */
-      /*                                                        */
-      /*   /Encoding [ ... ]                                    */
-      /*                                                        */
-      /* we only read immediates.                               */
-
-      n = 0;
-      T1_Skip_Spaces( parser );
-
-      while ( parser->root.cursor < limit )
-      {
-        cur = parser->root.cursor;
-
-        /* we stop when we encounter a `def' or `]' */
-        if ( *cur == 'd' && cur + 3 < limit )
-        {
-          if ( cur[1] == 'e'         &&
-               cur[2] == 'f'         &&
-               IS_PS_DELIM( cur[3] ) )
-          {
-            FT_TRACE6(( "encoding end\n" ));
-            cur += 3;
-            break;
-          }
-        }
-        if ( *cur == ']' )
-        {
-          FT_TRACE6(( "encoding end\n" ));
-          cur++;
-          break;
-        }
-
-        /* check whether we've found an entry */
-        if ( ft_isdigit( *cur ) || only_immediates )
-        {
-          FT_Int  charcode;
-
-
-          if ( only_immediates )
-            charcode = n;
-          else
-          {
-            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;
-
-          if ( cur + 2 < limit && *cur == '/' && n < count )
-          {
-            FT_UInt  len;
-
-
-            cur++;
-
-            parser->root.cursor = cur;
-            T1_Skip_PS_Token( parser );
-            if ( parser->root.cursor >= limit )
-              return;
-            if ( parser->root.error )
-              return;
-
-            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';
-
-            n++;
-          }
-          else if ( only_immediates )
-          {
-            /* Since the current position is not updated for           */
-            /* 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.                                             */
-            parser->root.error = FT_THROW( Unknown_File_Format );
-            return;
-          }
-        }
-        else
-        {
-          T1_Skip_PS_Token( parser );
-          if ( parser->root.error )
-            return;
-        }
-
-        T1_Skip_Spaces( parser );
-      }
-
-      face->type1.encoding_type = T1_ENCODING_TYPE_ARRAY;
-      parser->root.cursor       = cur;
-    }
-
-    /* Otherwise, we should have either `StandardEncoding', */
-    /* `ExpertEncoding', or `ISOLatin1Encoding'             */
-    else
-    {
-      if ( cur + 17 < limit                                            &&
-           ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
-        face->type1.encoding_type = T1_ENCODING_TYPE_STANDARD;
-
-      else if ( cur + 15 < limit                                          &&
-                ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
-        face->type1.encoding_type = T1_ENCODING_TYPE_EXPERT;
-
-      else if ( cur + 18 < limit                                             &&
-                ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
-        face->type1.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
-
-      else
-        parser->root.error = FT_ERR( Ignore );
-    }
-  }
-
-
-  static void
-  parse_subrs( T1_Face    face,
-               T1_Loader  loader )
-  {
-    T1_Parser  parser = &loader->parser;
-    PS_Table   table  = &loader->subrs;
-    FT_Memory  memory = parser->root.memory;
-    FT_Error   error;
-    FT_Int     num_subrs;
-    FT_UInt    count;
-
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    T1_Skip_Spaces( parser );
-
-    /* test for empty array */
-    if ( parser->root.cursor < parser->root.limit &&
-         *parser->root.cursor == '['              )
-    {
-      T1_Skip_PS_Token( parser );
-      T1_Skip_Spaces  ( parser );
-      if ( parser->root.cursor >= parser->root.limit ||
-           *parser->root.cursor != ']'               )
-        parser->root.error = FT_THROW( Invalid_File_Format );
-      return;
-    }
-
-    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' */
-    if ( parser->root.error )
-      return;
-    T1_Skip_Spaces( parser );
-
-    /* initialize subrs array -- with synthetic fonts it is possible */
-    /* we get here twice                                             */
-    if ( !loader->num_subrs )
-    {
-      error = psaux->ps_table_funcs->init( table, num_subrs, memory );
-      if ( error )
-        goto Fail;
-    }
-
-    /* the format is simple:   */
-    /*                         */
-    /*   `index' + binary data */
-    /*                         */
-    for ( count = 0; ; count++ )
-    {
-      FT_Long   idx;
-      FT_ULong  size;
-      FT_Byte*  base;
-
-
-      /* If we are out of data, or if the next token isn't `dup', */
-      /* we are done.                                             */
-      if ( parser->root.cursor + 4 >= parser->root.limit          ||
-          ft_strncmp( (char*)parser->root.cursor, "dup", 3 ) != 0 )
-        break;
-
-      T1_Skip_PS_Token( parser );       /* `dup' */
-
-      idx = T1_ToInt( parser );
-
-      if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
-        return;
-
-      /* The binary string is followed by one token, e.g. `NP' */
-      /* (bound to `noaccess put') or by two separate tokens:  */
-      /* `noaccess' & `put'.  We position the parser right     */
-      /* before the next `dup', if any.                        */
-      T1_Skip_PS_Token( parser );   /* `NP' or `|' or `noaccess' */
-      if ( parser->root.error )
-        return;
-      T1_Skip_Spaces  ( parser );
-
-      if ( parser->root.cursor + 4 < parser->root.limit            &&
-           ft_strncmp( (char*)parser->root.cursor, "put", 3 ) == 0 )
-      {
-        T1_Skip_PS_Token( parser ); /* skip `put' */
-        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;
-
-      /* some fonts use a value of -1 for lenIV to indicate that */
-      /* the charstrings are unencoded                           */
-      /*                                                         */
-      /* thanks to Tom Kacvinsky for pointing this out           */
-      /*                                                         */
-      if ( face->type1.private_dict.lenIV >= 0 )
-      {
-        FT_Byte*  temp = NULL;
-
-
-        /* some fonts define empty subr records -- this is not totally */
-        /* compliant to the specification (which says they should at   */
-        /* least contain a `return'), but we support them anyway       */
-        if ( size < (FT_ULong)face->type1.private_dict.lenIV )
-        {
-          error = FT_THROW( Invalid_File_Format );
-          goto Fail;
-        }
-
-        /* t1_decrypt() shouldn't write to base -- make temporary copy */
-        if ( FT_ALLOC( temp, size ) )
-          goto Fail;
-        FT_MEM_COPY( temp, base, size );
-        psaux->t1_decrypt( temp, size, 4330 );
-        size -= (FT_ULong)face->type1.private_dict.lenIV;
-        error = T1_Add_Table( table, (FT_Int)idx,
-                              temp + face->type1.private_dict.lenIV, size );
-        FT_FREE( temp );
-      }
-      else
-        error = T1_Add_Table( table, (FT_Int)idx, base, size );
-      if ( error )
-        goto Fail;
-    }
-
-    if ( !loader->num_subrs )
-      loader->num_subrs = num_subrs;
-
-    return;
-
-  Fail:
-    parser->root.error = error;
-  }
-
-
-#define TABLE_EXTEND  5
-
-
-  static void
-  parse_charstrings( T1_Face    face,
-                     T1_Loader  loader )
-  {
-    T1_Parser      parser       = &loader->parser;
-    PS_Table       code_table   = &loader->charstrings;
-    PS_Table       name_table   = &loader->glyph_names;
-    PS_Table       swap_table   = &loader->swap_table;
-    FT_Memory      memory       = parser->root.memory;
-    FT_Error       error;
-
-    PSAux_Service  psaux        = (PSAux_Service)face->psaux;
-
-    FT_Byte*       cur          = parser->root.cursor;
-    FT_Byte*       limit        = parser->root.limit;
-    FT_Int         n, num_glyphs;
-    FT_Int         notdef_index = 0;
-    FT_Byte        notdef_found = 0;
-
-
-    num_glyphs = (FT_Int)T1_ToInt( parser );
-    if ( num_glyphs < 0 )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      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 )
-      return;
-
-    /* initialize tables, leaving space for addition of .notdef, */
-    /* if necessary, and a few other glyphs to handle buggy      */
-    /* fonts which have more glyphs than specified.              */
-
-    /* for some non-standard fonts like `Optima' which provides  */
-    /* different outlines depending on the resolution it is      */
-    /* possible to get here twice                                */
-    if ( !loader->num_glyphs )
-    {
-      error = psaux->ps_table_funcs->init(
-                code_table, num_glyphs + 1 + TABLE_EXTEND, memory );
-      if ( error )
-        goto Fail;
-
-      error = psaux->ps_table_funcs->init(
-                name_table, num_glyphs + 1 + TABLE_EXTEND, memory );
-      if ( error )
-        goto Fail;
-
-      /* Initialize table for swapping index notdef_index and */
-      /* index 0 names and codes (if necessary).              */
-
-      error = psaux->ps_table_funcs->init( swap_table, 4, memory );
-      if ( error )
-        goto Fail;
-    }
-
-    n = 0;
-
-    for (;;)
-    {
-      FT_ULong  size;
-      FT_Byte*  base;
-
-
-      /* the format is simple:        */
-      /*   `/glyphname' + binary data */
-
-      T1_Skip_Spaces( parser );
-
-      cur = parser->root.cursor;
-      if ( cur >= limit )
-        break;
-
-      /* we stop when we find a `def' or `end' keyword */
-      if ( cur + 3 < limit && IS_PS_DELIM( cur[3] ) )
-      {
-        if ( cur[0] == 'd' &&
-             cur[1] == 'e' &&
-             cur[2] == 'f' )
-        {
-          /* There are fonts which have this: */
-          /*                                  */
-          /*   /CharStrings 118 dict def      */
-          /*   Private begin                  */
-          /*   CharStrings begin              */
-          /*   ...                            */
-          /*                                  */
-          /* To catch this we ignore `def' if */
-          /* no charstring has actually been  */
-          /* seen.                            */
-          if ( n )
-            break;
-        }
-
-        if ( cur[0] == 'e' &&
-             cur[1] == 'n' &&
-             cur[2] == 'd' )
-          break;
-      }
-
-      T1_Skip_PS_Token( parser );
-      if ( parser->root.cursor >= limit )
-      {
-        error = FT_THROW( Invalid_File_Format );
-        goto Fail;
-      }
-      if ( parser->root.error )
-        return;
-
-      if ( *cur == '/' )
-      {
-        FT_UInt  len;
-
-
-        if ( cur + 2 >= limit )
-        {
-          error = FT_THROW( Invalid_File_Format );
-          goto Fail;
-        }
-
-        cur++;                              /* skip `/' */
-        len = (FT_UInt)( parser->root.cursor - cur );
-
-        if ( !read_binary_data( parser, &size, &base, IS_INCREMENTAL ) )
-          return;
-
-        /* for some non-standard fonts like `Optima' which provides */
-        /* different outlines depending on the resolution it is     */
-        /* possible to get here twice                               */
-        if ( loader->num_glyphs )
-          continue;
-
-        error = T1_Add_Table( name_table, n, cur, len + 1 );
-        if ( error )
-          goto Fail;
-
-        /* add a trailing zero to the name table */
-        name_table->elements[n][len] = '\0';
-
-        /* record index of /.notdef */
-        if ( *cur == '.'                                              &&
-             ft_strcmp( ".notdef",
-                        (const char*)(name_table->elements[n]) ) == 0 )
-        {
-          notdef_index = n;
-          notdef_found = 1;
-        }
-
-        if ( face->type1.private_dict.lenIV >= 0 &&
-             n < num_glyphs + TABLE_EXTEND       )
-        {
-          FT_Byte*  temp = NULL;
-
-
-          if ( size <= (FT_ULong)face->type1.private_dict.lenIV )
-          {
-            error = FT_THROW( Invalid_File_Format );
-            goto Fail;
-          }
-
-          /* t1_decrypt() shouldn't write to base -- make temporary copy */
-          if ( FT_ALLOC( temp, size ) )
-            goto Fail;
-          FT_MEM_COPY( temp, base, size );
-          psaux->t1_decrypt( temp, size, 4330 );
-          size -= (FT_ULong)face->type1.private_dict.lenIV;
-          error = T1_Add_Table( code_table, n,
-                                temp + face->type1.private_dict.lenIV, size );
-          FT_FREE( temp );
-        }
-        else
-          error = T1_Add_Table( code_table, n, base, size );
-        if ( error )
-          goto Fail;
-
-        n++;
-      }
-    }
-
-    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. */
-    if ( notdef_found                                                 &&
-         ft_strcmp( ".notdef", (const char*)name_table->elements[0] ) )
-    {
-      /* Swap glyph in index 0 with /.notdef glyph.  First, add index 0  */
-      /* name and code entries to swap_table.  Then place notdef_index   */
-      /* name and code entries into swap_table.  Then swap name and code */
-      /* entries at indices notdef_index and 0 using values stored in    */
-      /* swap_table.                                                     */
-
-      /* Index 0 name */
-      error = T1_Add_Table( swap_table, 0,
-                            name_table->elements[0],
-                            name_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      /* Index 0 code */
-      error = T1_Add_Table( swap_table, 1,
-                            code_table->elements[0],
-                            code_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      /* Index notdef_index name */
-      error = T1_Add_Table( swap_table, 2,
-                            name_table->elements[notdef_index],
-                            name_table->lengths [notdef_index] );
-      if ( error )
-        goto Fail;
-
-      /* Index notdef_index code */
-      error = T1_Add_Table( swap_table, 3,
-                            code_table->elements[notdef_index],
-                            code_table->lengths [notdef_index] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( name_table, notdef_index,
-                            swap_table->elements[0],
-                            swap_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( code_table, notdef_index,
-                            swap_table->elements[1],
-                            swap_table->lengths [1] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( name_table, 0,
-                            swap_table->elements[2],
-                            swap_table->lengths [2] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( code_table, 0,
-                            swap_table->elements[3],
-                            swap_table->lengths [3] );
-      if ( error )
-        goto Fail;
-
-    }
-    else if ( !notdef_found )
-    {
-      /* notdef_index is already 0, or /.notdef is undefined in   */
-      /* charstrings dictionary.  Worry about /.notdef undefined. */
-      /* We take index 0 and add it to the end of the table(s)    */
-      /* and add our own /.notdef glyph to index 0.               */
-
-      /* 0 333 hsbw endchar */
-      FT_Byte  notdef_glyph[] = { 0x8B, 0xF7, 0xE1, 0x0D, 0x0E };
-      char*    notdef_name    = (char *)".notdef";
-
-
-      error = T1_Add_Table( swap_table, 0,
-                            name_table->elements[0],
-                            name_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( swap_table, 1,
-                            code_table->elements[0],
-                            code_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( name_table, 0, notdef_name, 8 );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( code_table, 0, notdef_glyph, 5 );
-
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( name_table, n,
-                            swap_table->elements[0],
-                            swap_table->lengths [0] );
-      if ( error )
-        goto Fail;
-
-      error = T1_Add_Table( code_table, n,
-                            swap_table->elements[1],
-                            swap_table->lengths [1] );
-      if ( error )
-        goto Fail;
-
-      /* we added a glyph. */
-      loader->num_glyphs += 1;
-    }
-
-    return;
-
-  Fail:
-    parser->root.error = error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Define the token field static variables.  This is a set of            */
-  /* T1_FieldRec variables.                                                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static
-  const T1_FieldRec  t1_keywords[] =
-  {
-
-#include "t1tokens.h"
-
-    /* now add the special functions... */
-    T1_FIELD_CALLBACK( "FontMatrix",           t1_parse_font_matrix,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "Encoding",             parse_encoding,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "Subrs",                parse_subrs,
-                       T1_FIELD_DICT_PRIVATE )
-    T1_FIELD_CALLBACK( "CharStrings",          parse_charstrings,
-                       T1_FIELD_DICT_PRIVATE )
-    T1_FIELD_CALLBACK( "Private",              parse_private,
-                       T1_FIELD_DICT_FONTDICT )
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-    T1_FIELD_CALLBACK( "BlendDesignPositions", parse_blend_design_positions,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "BlendDesignMap",       parse_blend_design_map,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "BlendAxisTypes",       parse_blend_axis_types,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "WeightVector",         parse_weight_vector,
-                       T1_FIELD_DICT_FONTDICT )
-    T1_FIELD_CALLBACK( "BuildCharArray",       parse_buildchar,
-                       T1_FIELD_DICT_PRIVATE )
-#endif
-
-    { 0, T1_FIELD_LOCATION_CID_INFO, T1_FIELD_TYPE_NONE, 0, 0, 0, 0, 0, 0 }
-  };
-
-
-  static FT_Error
-  parse_dict( T1_Face    face,
-              T1_Loader  loader,
-              FT_Byte*   base,
-              FT_ULong   size )
-  {
-    T1_Parser  parser = &loader->parser;
-    FT_Byte   *limit, *start_binary = NULL;
-    FT_Bool    have_integer = 0;
-
-
-    parser->root.cursor = base;
-    parser->root.limit  = base + size;
-    parser->root.error  = FT_Err_Ok;
-
-    limit = parser->root.limit;
-
-    T1_Skip_Spaces( parser );
-
-    while ( parser->root.cursor < limit )
-    {
-      FT_Byte*  cur;
-
-
-      cur = parser->root.cursor;
-
-      /* look for `eexec' */
-      if ( IS_PS_TOKEN( cur, limit, "eexec" ) )
-        break;
-
-      /* look for `closefile' which ends the eexec section */
-      else if ( IS_PS_TOKEN( cur, limit, "closefile" ) )
-        break;
-
-      /* in a synthetic font the base font starts after a           */
-      /* `FontDictionary' token that is placed after a Private dict */
-      else if ( IS_PS_TOKEN( cur, limit, "FontDirectory" ) )
-      {
-        if ( loader->keywords_encountered & T1_PRIVATE )
-          loader->keywords_encountered |=
-            T1_FONTDIR_AFTER_PRIVATE;
-        parser->root.cursor += 13;
-      }
-
-      /* check whether we have an integer */
-      else if ( ft_isdigit( *cur ) )
-      {
-        start_binary = cur;
-        T1_Skip_PS_Token( parser );
-        if ( parser->root.error )
-          goto Exit;
-        have_integer = 1;
-      }
-
-      /* in valid Type 1 fonts we don't see `RD' or `-|' directly */
-      /* since those tokens are handled by parse_subrs and        */
-      /* parse_charstrings                                        */
-      else if ( *cur == 'R' && cur + 6 < limit && *(cur + 1) == 'D' &&
-                have_integer )
-      {
-        FT_ULong  s;
-        FT_Byte*  b;
-
-
-        parser->root.cursor = start_binary;
-        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
-          return FT_THROW( Invalid_File_Format );
-        have_integer = 0;
-      }
-
-      else if ( *cur == '-' && cur + 6 < limit && *(cur + 1) == '|' &&
-                have_integer )
-      {
-        FT_ULong  s;
-        FT_Byte*  b;
-
-
-        parser->root.cursor = start_binary;
-        if ( !read_binary_data( parser, &s, &b, IS_INCREMENTAL ) )
-          return FT_THROW( Invalid_File_Format );
-        have_integer = 0;
-      }
-
-      /* look for immediates */
-      else if ( *cur == '/' && cur + 2 < limit )
-      {
-        FT_UInt  len;
-
-
-        cur++;
-
-        parser->root.cursor = cur;
-        T1_Skip_PS_Token( parser );
-        if ( parser->root.error )
-          goto Exit;
-
-        len = (FT_UInt)( parser->root.cursor - cur );
-
-        if ( len > 0 && len < 22 && parser->root.cursor < limit )
-        {
-          /* now compare the immediate name to the keyword table */
-          T1_Field  keyword = (T1_Field)t1_keywords;
-
-
-          for (;;)
-          {
-            FT_Byte*  name;
-
-
-            name = (FT_Byte*)keyword->ident;
-            if ( !name )
-              break;
-
-            if ( cur[0] == name[0]                      &&
-                 len == ft_strlen( (const char *)name ) &&
-                 ft_memcmp( cur, name, len ) == 0       )
-            {
-              /* We found it -- run the parsing callback!     */
-              /* We record every instance of every field      */
-              /* (until we reach the base font of a           */
-              /* synthetic font) to deal adequately with      */
-              /* multiple master fonts; this is also          */
-              /* necessary because later PostScript           */
-              /* definitions override earlier ones.           */
-
-              /* Once we encounter `FontDirectory' after      */
-              /* `/Private', we know that this is a synthetic */
-              /* font; except for `/CharStrings' we are not   */
-              /* interested in anything that follows this     */
-              /* `FontDirectory'.                             */
-
-              /* MM fonts have more than one /Private token at */
-              /* the top level; let's hope that all the junk   */
-              /* that follows the first /Private token is not  */
-              /* interesting to us.                            */
-
-              /* According to Adobe Tech Note #5175 (CID-Keyed */
-              /* Font Installation for ATM Software) a `begin' */
-              /* must be followed by exactly one `end', and    */
-              /* `begin' -- `end' pairs must be accurately     */
-              /* paired.  We could use this to distinguish     */
-              /* between the global Private and the Private    */
-              /* dict that is a member of the Blend dict.      */
-
-              const FT_UInt dict =
-                ( loader->keywords_encountered & T1_PRIVATE )
-                    ? T1_FIELD_DICT_PRIVATE
-                    : T1_FIELD_DICT_FONTDICT;
-
-              if ( !( dict & keyword->dict ) )
-              {
-                FT_TRACE1(( "parse_dict: found `%s' but ignoring it"
-                            " since it is in the wrong dictionary\n",
-                            keyword->ident ));
-                break;
-              }
-
-              if ( !( loader->keywords_encountered &
-                      T1_FONTDIR_AFTER_PRIVATE     )                  ||
-                   ft_strcmp( (const char*)name, "CharStrings" ) == 0 )
-              {
-                parser->root.error = t1_load_keyword( face,
-                                                      loader,
-                                                      keyword );
-                if ( parser->root.error )
-                {
-                  if ( FT_ERR_EQ( parser->root.error, Ignore ) )
-                    parser->root.error = FT_Err_Ok;
-                  else
-                    return parser->root.error;
-                }
-              }
-              break;
-            }
-
-            keyword++;
-          }
-        }
-
-        have_integer = 0;
-      }
-      else
-      {
-        T1_Skip_PS_Token( parser );
-        if ( parser->root.error )
-          goto Exit;
-        have_integer = 0;
-      }
-
-      T1_Skip_Spaces( parser );
-    }
-
-  Exit:
-    return parser->root.error;
-  }
-
-
-  static void
-  t1_init_loader( T1_Loader  loader,
-                  T1_Face    face )
-  {
-    FT_UNUSED( face );
-
-    FT_ZERO( loader );
-  }
-
-
-  static void
-  t1_done_loader( T1_Loader  loader )
-  {
-    T1_Parser  parser = &loader->parser;
-    FT_Memory  memory = parser->root.memory;
-
-
-    /* finalize tables */
-    T1_Release_Table( &loader->encoding_table );
-    T1_Release_Table( &loader->charstrings );
-    T1_Release_Table( &loader->glyph_names );
-    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 );
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Open_Face( T1_Face  face )
-  {
-    T1_LoaderRec   loader;
-    T1_Parser      parser;
-    T1_Font        type1 = &face->type1;
-    PS_Private     priv  = &type1->private_dict;
-    FT_Error       error;
-
-    PSAux_Service  psaux = (PSAux_Service)face->psaux;
-
-
-    t1_init_loader( &loader, face );
-
-    /* default values */
-    face->ndv_idx          = -1;
-    face->cdv_idx          = -1;
-    face->len_buildchar    = 0;
-
-    priv->blue_shift       = 7;
-    priv->blue_fuzz        = 1;
-    priv->lenIV            = 4;
-    priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L );
-    priv->blue_scale       = (FT_Fixed)( 0.039625 * 0x10000L * 1000 );
-
-    parser = &loader.parser;
-    error  = T1_New_Parser( parser,
-                            face->root.stream,
-                            face->root.memory,
-                            psaux );
-    if ( error )
-      goto Exit;
-
-    error = parse_dict( face, &loader,
-                        parser->base_dict, parser->base_len );
-    if ( error )
-      goto Exit;
-
-    error = T1_Get_Private_Dict( parser, psaux );
-    if ( error )
-      goto Exit;
-
-    error = parse_dict( face, &loader,
-                        parser->private_dict, parser->private_len );
-    if ( error )
-      goto Exit;
-
-    /* ensure even-ness of `num_blue_values' */
-    priv->num_blue_values &= ~1;
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-
-    if ( face->blend                                                     &&
-         face->blend->num_default_design_vector != 0                     &&
-         face->blend->num_default_design_vector != face->blend->num_axis )
-    {
-      /* we don't use it currently so just warn, reset, and ignore */
-      FT_ERROR(( "T1_Open_Face(): /DesignVector contains %u entries "
-                 "while there are %u axes.\n",
-                 face->blend->num_default_design_vector,
-                 face->blend->num_axis ));
-
-      face->blend->num_default_design_vector = 0;
-    }
-
-    /* the following can happen for MM instances; we then treat the */
-    /* font as a normal PS font                                     */
-    if ( face->blend                                             &&
-         ( !face->blend->num_designs || !face->blend->num_axis ) )
-      T1_Done_Blend( face );
-
-    /* another safety check */
-    if ( face->blend )
-    {
-      FT_UInt  i;
-
-
-      for ( i = 0; i < face->blend->num_axis; i++ )
-        if ( !face->blend->design_map[i].num_points )
-        {
-          T1_Done_Blend( face );
-          break;
-        }
-    }
-
-    if ( face->blend )
-    {
-      if ( face->len_buildchar > 0 )
-      {
-        FT_Memory  memory = face->root.memory;
-
-
-        if ( FT_NEW_ARRAY( face->buildchar, face->len_buildchar ) )
-        {
-          FT_ERROR(( "T1_Open_Face: cannot allocate BuildCharArray\n" ));
-          face->len_buildchar = 0;
-          goto Exit;
-        }
-      }
-    }
-    else
-      face->len_buildchar = 0;
-
-#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
-
-    /* now, propagate the subrs, charstrings, and glyphnames tables */
-    /* to the Type1 data                                            */
-    type1->num_glyphs = loader.num_glyphs;
-
-    if ( loader.subrs.init )
-    {
-      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 )
-      if ( !loader.charstrings.init )
-      {
-        FT_ERROR(( "T1_Open_Face: no `/CharStrings' array in face\n" ));
-        error = FT_THROW( Invalid_File_Format );
-      }
-
-    loader.charstrings.init  = 0;
-    type1->charstrings_block = loader.charstrings.block;
-    type1->charstrings       = loader.charstrings.elements;
-    type1->charstrings_len   = loader.charstrings.lengths;
-
-    /* we copy the glyph names `block' and `elements' fields; */
-    /* the `lengths' field must be released later             */
-    type1->glyph_names_block    = loader.glyph_names.block;
-    type1->glyph_names          = (FT_String**)loader.glyph_names.elements;
-    loader.glyph_names.block    = NULL;
-    loader.glyph_names.elements = NULL;
-
-    /* we must now build type1.encoding when we have a custom array */
-    if ( type1->encoding_type == T1_ENCODING_TYPE_ARRAY )
-    {
-      FT_Int    charcode, idx, min_char, max_char;
-      FT_Byte*  glyph_name;
-
-
-      /* OK, we do the following: for each element in the encoding  */
-      /* table, look up the index of the glyph having the same name */
-      /* the index is then stored in type1.encoding.char_index, and */
-      /* the name to type1.encoding.char_name                       */
-
-      min_char = 0;
-      max_char = 0;
-
-      charcode = 0;
-      for ( ; charcode < loader.encoding_table.max_elems; charcode++ )
-      {
-        FT_Byte*  char_name;
-
-
-        type1->encoding.char_index[charcode] = 0;
-        type1->encoding.char_name [charcode] = (char *)".notdef";
-
-        char_name = loader.encoding_table.elements[charcode];
-        if ( char_name )
-          for ( idx = 0; idx < type1->num_glyphs; idx++ )
-          {
-            glyph_name = (FT_Byte*)type1->glyph_names[idx];
-            if ( ft_strcmp( (const char*)char_name,
-                            (const char*)glyph_name ) == 0 )
-            {
-              type1->encoding.char_index[charcode] = (FT_UShort)idx;
-              type1->encoding.char_name [charcode] = (char*)glyph_name;
-
-              /* Change min/max encoded char only if glyph name is */
-              /* not /.notdef                                      */
-              if ( ft_strcmp( (const char*)".notdef",
-                              (const char*)glyph_name ) != 0 )
-              {
-                if ( charcode < min_char )
-                  min_char = charcode;
-                if ( charcode >= max_char )
-                  max_char = charcode + 1;
-              }
-              break;
-            }
-          }
-      }
-
-      type1->encoding.code_first = min_char;
-      type1->encoding.code_last  = max_char;
-      type1->encoding.num_chars  = loader.num_chars;
-    }
-
-  Exit:
-    t1_done_loader( &loader );
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1load.h b/third_party/freetype/src/type1/t1load.h
deleted file mode 100644
index 2d86984..0000000
--- a/third_party/freetype/src/type1/t1load.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1load.h                                                               */
-/*                                                                         */
-/*    Type 1 font loader (specification).                                  */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1LOAD_H_
-#define T1LOAD_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-#include FT_MULTIPLE_MASTERS_H
-
-#include "t1parse.h"
-
-
-FT_BEGIN_HEADER
-
-
-  typedef struct  T1_Loader_
-  {
-    T1_ParserRec  parser;          /* parser used to read the stream */
-
-    FT_Int        num_chars;       /* number of characters in encoding */
-    PS_TableRec   encoding_table;  /* PS_Table used to store the       */
-                                   /* encoding character names         */
-
-    FT_Int        num_glyphs;
-    PS_TableRec   glyph_names;
-    PS_TableRec   charstrings;
-    PS_TableRec   swap_table;      /* For moving .notdef glyph to index 0. */
-
-    FT_Int        num_subrs;
-    PS_TableRec   subrs;
-    FT_Hash       subrs_hash;
-    FT_Bool       fontdata;
-
-    FT_UInt       keywords_encountered; /* T1_LOADER_ENCOUNTERED_XXX */
-
-  } T1_LoaderRec, *T1_Loader;
-
-
-  /* treatment of some keywords differs depending on whether */
-  /* they precede or follow certain other keywords           */
-
-#define T1_PRIVATE                ( 1 << 0 )
-#define T1_FONTDIR_AFTER_PRIVATE  ( 1 << 1 )
-
-
-  FT_LOCAL( FT_Error )
-  T1_Open_Face( T1_Face  face );
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-
-  FT_LOCAL( FT_Error )
-  T1_Get_Multi_Master( T1_Face           face,
-                       FT_Multi_Master*  master );
-
-  FT_LOCAL( FT_Error )
-  T1_Get_MM_Var( T1_Face      face,
-                 FT_MM_Var*  *master );
-
-  FT_LOCAL( FT_Error )
-  T1_Set_MM_Blend( T1_Face    face,
-                   FT_UInt    num_coords,
-                   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( 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 );
-
-  FT_LOCAL( void )
-  T1_Done_Blend( T1_Face  face );
-
-#endif /* !T1_CONFIG_OPTION_NO_MM_SUPPORT */
-
-
-FT_END_HEADER
-
-#endif /* T1LOAD_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1objs.c b/third_party/freetype/src/type1/t1objs.c
deleted file mode 100644
index 5637035..0000000
--- a/third_party/freetype/src/type1/t1objs.c
+++ /dev/null
@@ -1,616 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1objs.c                                                               */
-/*                                                                         */
-/*    Type 1 objects manager (body).                                       */
-/*                                                                         */
-/*  Copyright 1996-2017 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_IDS_H
-
-#include "t1gload.h"
-#include "t1load.h"
-
-#include "t1errors.h"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "t1afm.h"
-#endif
-
-#include FT_SERVICE_POSTSCRIPT_CMAPS_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_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_t1objs
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            SIZE FUNCTIONS                             */
-  /*                                                                       */
-  /*  note that we store the global hints in the size's "internal" root    */
-  /*  field                                                                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  static PSH_Globals_Funcs
-  T1_Size_Get_Globals_Funcs( T1_Size  size )
-  {
-    T1_Face           face     = (T1_Face)size->root.face;
-    PSHinter_Service  pshinter = (PSHinter_Service)face->pshinter;
-    FT_Module         module;
-
-
-    module = FT_Get_Module( size->root.face->driver->root.library,
-                            "pshinter" );
-    return ( module && pshinter && pshinter->get_globals_funcs )
-           ? pshinter->get_globals_funcs( module )
-           : 0;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  T1_Size_Done( FT_Size  t1size )          /* T1_Size */
-  {
-    T1_Size  size = (T1_Size)t1size;
-
-
-    if ( size->root.internal )
-    {
-      PSH_Globals_Funcs  funcs;
-
-
-      funcs = T1_Size_Get_Globals_Funcs( size );
-      if ( funcs )
-        funcs->destroy( (PSH_Globals)size->root.internal );
-
-      size->root.internal = NULL;
-    }
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Size_Init( FT_Size  t1size )      /* T1_Size */
-  {
-    T1_Size            size  = (T1_Size)t1size;
-    FT_Error           error = FT_Err_Ok;
-    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
-
-
-    if ( funcs )
-    {
-      PSH_Globals  globals;
-      T1_Face      face = (T1_Face)size->root.face;
-
-
-      error = funcs->create( size->root.face->memory,
-                             &face->type1.private_dict, &globals );
-      if ( !error )
-        size->root.internal = (FT_Size_Internal)(void*)globals;
-    }
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Size_Request( FT_Size          t1size,     /* T1_Size */
-                   FT_Size_Request  req )
-  {
-    T1_Size            size  = (T1_Size)t1size;
-    PSH_Globals_Funcs  funcs = T1_Size_Get_Globals_Funcs( size );
-
-
-    FT_Request_Metrics( size->root.face, req );
-
-    if ( funcs )
-      funcs->set_scale( (PSH_Globals)size->root.internal,
-                        size->root.metrics.x_scale,
-                        size->root.metrics.y_scale,
-                        0, 0 );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            SLOT  FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-  FT_LOCAL_DEF( void )
-  T1_GlyphSlot_Done( FT_GlyphSlot  slot )
-  {
-    slot->internal->glyph_hints = NULL;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_GlyphSlot_Init( FT_GlyphSlot  slot )
-  {
-    T1_Face           face;
-    PSHinter_Service  pshinter;
-
-
-    face     = (T1_Face)slot->face;
-    pshinter = (PSHinter_Service)face->pshinter;
-
-    if ( pshinter )
-    {
-      FT_Module  module;
-
-
-      module = FT_Get_Module( slot->face->driver->root.library,
-                              "pshinter" );
-      if ( module )
-      {
-        T1_Hints_Funcs  funcs;
-
-
-        funcs = pshinter->get_t1_funcs( module );
-        slot->internal->glyph_hints = (void*)funcs;
-      }
-    }
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                            FACE  FUNCTIONS                            */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    T1_Face_Done                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The face object destructor.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face :: A typeless pointer to the face object to destroy.          */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  T1_Face_Done( FT_Face  t1face )         /* T1_Face */
-  {
-    T1_Face    face = (T1_Face)t1face;
-    FT_Memory  memory;
-    T1_Font    type1;
-
-
-    if ( !face )
-      return;
-
-    memory = face->root.memory;
-    type1  = &face->type1;
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-    /* release multiple masters information */
-    FT_ASSERT( ( face->len_buildchar == 0 ) == ( face->buildchar == NULL ) );
-
-    if ( face->buildchar )
-    {
-      FT_FREE( face->buildchar );
-
-      face->buildchar     = NULL;
-      face->len_buildchar = 0;
-    }
-
-    T1_Done_Blend( face );
-    face->blend = NULL;
-#endif
-
-    /* release font info strings */
-    {
-      PS_FontInfo  info = &type1->font_info;
-
-
-      FT_FREE( info->version );
-      FT_FREE( info->notice );
-      FT_FREE( info->full_name );
-      FT_FREE( info->family_name );
-      FT_FREE( info->weight );
-    }
-
-    /* release top dictionary */
-    FT_FREE( type1->charstrings_len );
-    FT_FREE( type1->charstrings );
-    FT_FREE( type1->glyph_names );
-
-    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 );
-
-    FT_FREE( type1->encoding.char_index );
-    FT_FREE( type1->encoding.char_name );
-    FT_FREE( type1->font_name );
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-    /* release afm data if present */
-    if ( face->afm_data )
-      T1_Done_Metrics( memory, (AFM_FontInfo)face->afm_data );
-#endif
-
-    /* release unicode map, if any */
-#if 0
-    FT_FREE( face->unicode_map_rec.maps );
-    face->unicode_map_rec.num_maps = 0;
-    face->unicode_map              = NULL;
-#endif
-
-    face->root.family_name = NULL;
-    face->root.style_name  = NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    T1_Face_Init                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The face object constructor.                                       */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream     ::  input stream where to load font data.               */
-  /*                                                                       */
-  /*    face_index :: The index of the font face in the resource.          */
-  /*                                                                       */
-  /*    num_params :: Number of additional generic parameters.  Ignored.   */
-  /*                                                                       */
-  /*    params     :: Additional generic parameters.  Ignored.             */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The face record to build.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  T1_Face_Init( FT_Stream      stream,
-                FT_Face        t1face,          /* T1_Face */
-                FT_Int         face_index,
-                FT_Int         num_params,
-                FT_Parameter*  params )
-  {
-    T1_Face             face = (T1_Face)t1face;
-    FT_Error            error;
-    FT_Service_PsCMaps  psnames;
-    PSAux_Service       psaux;
-    T1_Font             type1 = &face->type1;
-    PS_FontInfo         info = &type1->font_info;
-
-    FT_UNUSED( num_params );
-    FT_UNUSED( params );
-    FT_UNUSED( stream );
-
-
-    face->root.num_faces = 1;
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS );
-    face->psnames = psnames;
-
-    face->psaux = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
-                                           "psaux" );
-    psaux = (PSAux_Service)face->psaux;
-    if ( !psaux )
-    {
-      FT_ERROR(( "T1_Face_Init: cannot access `psaux' module\n" ));
-      error = FT_THROW( Missing_Module );
-      goto Exit;
-    }
-
-    face->pshinter = FT_Get_Module_Interface( FT_FACE_LIBRARY( face ),
-                                              "pshinter" );
-
-    FT_TRACE2(( "Type 1 driver\n" ));
-
-    /* open the tokenizer; this will also check the font format */
-    error = T1_Open_Face( face );
-    if ( error )
-      goto Exit;
-
-    /* if we just wanted to check the format, leave successfully now */
-    if ( face_index < 0 )
-      goto Exit;
-
-    /* check the face index */
-    if ( ( face_index & 0xFFFF ) > 0 )
-    {
-      FT_ERROR(( "T1_Face_Init: invalid face index\n" ));
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* now load the font program into the face object */
-
-    /* initialize the face object fields */
-
-    /* set up root face fields */
-    {
-      FT_Face  root = (FT_Face)&face->root;
-
-
-      root->num_glyphs = type1->num_glyphs;
-      root->face_index = 0;
-
-      root->face_flags |= FT_FACE_FLAG_SCALABLE    |
-                          FT_FACE_FLAG_HORIZONTAL  |
-                          FT_FACE_FLAG_GLYPH_NAMES |
-                          FT_FACE_FLAG_HINTER;
-
-      if ( info->is_fixed_pitch )
-        root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
-
-      if ( face->blend )
-        root->face_flags |= FT_FACE_FLAG_MULTIPLE_MASTERS;
-
-      /* 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 */
-
-      /* get style name -- be careful, some broken fonts only */
-      /* have a `/FontName' dictionary entry!                 */
-      root->family_name = info->family_name;
-      root->style_name  = NULL;
-
-      if ( root->family_name )
-      {
-        char*  full   = info->full_name;
-        char*  family = root->family_name;
-
-
-        if ( full )
-        {
-          FT_Bool  the_same = TRUE;
-
-
-          while ( *full )
-          {
-            if ( *full == *family )
-            {
-              family++;
-              full++;
-            }
-            else
-            {
-              if ( *full == ' ' || *full == '-' )
-                full++;
-              else if ( *family == ' ' || *family == '-' )
-                family++;
-              else
-              {
-                the_same = FALSE;
-
-                if ( !*family )
-                  root->style_name = full;
-                break;
-              }
-            }
-          }
-
-          if ( the_same )
-            root->style_name = (char *)"Regular";
-        }
-      }
-      else
-      {
-        /* do we have a `/FontName'? */
-        if ( type1->font_name )
-          root->family_name = type1->font_name;
-      }
-
-      if ( !root->style_name )
-      {
-        if ( info->weight )
-          root->style_name = info->weight;
-        else
-          /* assume `Regular' style because we don't know better */
-          root->style_name = (char *)"Regular";
-      }
-
-      /* compute style flags */
-      root->style_flags = 0;
-      if ( info->italic_angle )
-        root->style_flags |= FT_STYLE_FLAG_ITALIC;
-      if ( info->weight )
-      {
-        if ( !ft_strcmp( info->weight, "Bold"  ) ||
-             !ft_strcmp( info->weight, "Black" ) )
-          root->style_flags |= FT_STYLE_FLAG_BOLD;
-      }
-
-      /* no embedded bitmap support */
-      root->num_fixed_sizes = 0;
-      root->available_sizes = NULL;
-
-      root->bbox.xMin =   type1->font_bbox.xMin            >> 16;
-      root->bbox.yMin =   type1->font_bbox.yMin            >> 16;
-      /* no `U' suffix here to 0xFFFF! */
-      root->bbox.xMax = ( type1->font_bbox.xMax + 0xFFFF ) >> 16;
-      root->bbox.yMax = ( type1->font_bbox.yMax + 0xFFFF ) >> 16;
-
-      /* Set units_per_EM if we didn't set it in t1_parse_font_matrix. */
-      if ( !root->units_per_EM )
-        root->units_per_EM = 1000;
-
-      root->ascender  = (FT_Short)( root->bbox.yMax );
-      root->descender = (FT_Short)( root->bbox.yMin );
-
-      root->height = (FT_Short)( ( root->units_per_EM * 12 ) / 10 );
-      if ( root->height < root->ascender - root->descender )
-        root->height = (FT_Short)( root->ascender - root->descender );
-
-      /* now compute the maximum advance width */
-      root->max_advance_width =
-        (FT_Short)( root->bbox.xMax );
-      {
-        FT_Pos  max_advance;
-
-
-        error = T1_Compute_Max_Advance( face, &max_advance );
-
-        /* in case of error, keep the standard width */
-        if ( !error )
-          root->max_advance_width = (FT_Short)FIXED_TO_INT( max_advance );
-        else
-          error = FT_Err_Ok;   /* clear error */
-      }
-
-      root->max_advance_height = root->height;
-
-      root->underline_position  = (FT_Short)info->underline_position;
-      root->underline_thickness = (FT_Short)info->underline_thickness;
-    }
-
-    {
-      FT_Face  root = &face->root;
-
-
-      if ( psnames )
-      {
-        FT_CharMapRec    charmap;
-        T1_CMap_Classes  cmap_classes = psaux->t1_cmap_classes;
-        FT_CMap_Class    clazz;
-
-
-        charmap.face = root;
-
-        /* first of all, try to synthesize a Unicode charmap */
-        charmap.platform_id = TT_PLATFORM_MICROSOFT;
-        charmap.encoding_id = TT_MS_ID_UNICODE_CS;
-        charmap.encoding    = FT_ENCODING_UNICODE;
-
-        error = FT_CMap_New( cmap_classes->unicode, NULL, &charmap, NULL );
-        if ( error                                      &&
-             FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) )
-          goto Exit;
-        error = FT_Err_Ok;
-
-        /* now, generate an Adobe Standard encoding when appropriate */
-        charmap.platform_id = TT_PLATFORM_ADOBE;
-        clazz               = NULL;
-
-        switch ( type1->encoding_type )
-        {
-        case T1_ENCODING_TYPE_STANDARD:
-          charmap.encoding    = FT_ENCODING_ADOBE_STANDARD;
-          charmap.encoding_id = TT_ADOBE_ID_STANDARD;
-          clazz               = cmap_classes->standard;
-          break;
-
-        case T1_ENCODING_TYPE_EXPERT:
-          charmap.encoding    = FT_ENCODING_ADOBE_EXPERT;
-          charmap.encoding_id = TT_ADOBE_ID_EXPERT;
-          clazz               = cmap_classes->expert;
-          break;
-
-        case T1_ENCODING_TYPE_ARRAY:
-          charmap.encoding    = FT_ENCODING_ADOBE_CUSTOM;
-          charmap.encoding_id = TT_ADOBE_ID_CUSTOM;
-          clazz               = cmap_classes->custom;
-          break;
-
-        case T1_ENCODING_TYPE_ISOLATIN1:
-          charmap.encoding    = FT_ENCODING_ADOBE_LATIN_1;
-          charmap.encoding_id = TT_ADOBE_ID_LATIN_1;
-          clazz               = cmap_classes->unicode;
-          break;
-
-        default:
-          ;
-        }
-
-        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:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    T1_Driver_Init                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Initializes a given Type 1 driver object.                          */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target driver object.                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  T1_Driver_Init( FT_Module  driver )
-  {
-    FT_UNUSED( driver );
-
-    return FT_Err_Ok;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    T1_Driver_Done                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Finalizes a given Type 1 driver.                                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    driver :: A handle to the target Type 1 driver.                    */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  T1_Driver_Done( FT_Module  driver )
-  {
-    FT_UNUSED( driver );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1objs.h b/third_party/freetype/src/type1/t1objs.h
deleted file mode 100644
index 39d26bf..0000000
--- a/third_party/freetype/src/type1/t1objs.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1objs.h                                                               */
-/*                                                                         */
-/*    Type 1 objects manager (specification).                              */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1OBJS_H_
-#define T1OBJS_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_OBJECTS_H
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_TYPE1_TYPES_H
-
-
-FT_BEGIN_HEADER
-
-
-  /* The following structures must be defined by the hinter */
-  typedef struct T1_Size_Hints_   T1_Size_Hints;
-  typedef struct T1_Glyph_Hints_  T1_Glyph_Hints;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    T1_Size                                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 size object.                                  */
-  /*                                                                       */
-  typedef struct T1_SizeRec_*  T1_Size;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    T1_GlyphSlot                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 glyph slot object.                            */
-  /*                                                                       */
-  typedef struct T1_GlyphSlotRec_*  T1_GlyphSlot;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    T1_CharMap                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a Type 1 character mapping object.                     */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The Type 1 format doesn't use a charmap but an encoding table.     */
-  /*    The driver is responsible for making up charmap objects            */
-  /*    corresponding to these tables.                                     */
-  /*                                                                       */
-  typedef struct T1_CharMapRec_*   T1_CharMap;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                  HERE BEGINS THE TYPE1 SPECIFIC STUFF                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    T1_SizeRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Type 1 size record.                                                */
-  /*                                                                       */
-  typedef struct  T1_SizeRec_
-  {
-    FT_SizeRec  root;
-
-  } T1_SizeRec;
-
-
-  FT_LOCAL( void )
-  T1_Size_Done( FT_Size  size );
-
-  FT_LOCAL( FT_Error )
-  T1_Size_Request( FT_Size          size,
-                   FT_Size_Request  req );
-
-  FT_LOCAL( FT_Error )
-  T1_Size_Init( FT_Size  size );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    T1_GlyphSlotRec                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Type 1 glyph slot record.                                          */
-  /*                                                                       */
-  typedef struct  T1_GlyphSlotRec_
-  {
-    FT_GlyphSlotRec  root;
-
-    FT_Bool          hint;
-    FT_Bool          scaled;
-
-    FT_Int           max_points;
-    FT_Int           max_contours;
-
-    FT_Fixed         x_scale;
-    FT_Fixed         y_scale;
-
-  } T1_GlyphSlotRec;
-
-
-  FT_LOCAL( FT_Error )
-  T1_Face_Init( FT_Stream      stream,
-                FT_Face        face,
-                FT_Int         face_index,
-                FT_Int         num_params,
-                FT_Parameter*  params );
-
-  FT_LOCAL( void )
-  T1_Face_Done( FT_Face  face );
-
-  FT_LOCAL( FT_Error )
-  T1_GlyphSlot_Init( FT_GlyphSlot  slot );
-
-  FT_LOCAL( void )
-  T1_GlyphSlot_Done( FT_GlyphSlot  slot );
-
-  FT_LOCAL( FT_Error )
-  T1_Driver_Init( FT_Module  driver );
-
-  FT_LOCAL( void )
-  T1_Driver_Done( FT_Module  driver );
-
-
-FT_END_HEADER
-
-#endif /* T1OBJS_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1parse.c b/third_party/freetype/src/type1/t1parse.c
deleted file mode 100644
index 18dd264..0000000
--- a/third_party/freetype/src/type1/t1parse.c
+++ /dev/null
@@ -1,525 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1parse.c                                                              */
-/*                                                                         */
-/*    Type 1 parser (body).                                                */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The Type 1 parser is in charge of the following:                      */
-  /*                                                                       */
-  /*  - provide an implementation of a growing sequence of objects called  */
-  /*    a `T1_Table' (used to build various tables needed by the loader).  */
-  /*                                                                       */
-  /*  - opening .pfb and .pfa files to extract their top-level and private */
-  /*    dictionaries.                                                      */
-  /*                                                                       */
-  /*  - read numbers, arrays & strings from any dictionary.                */
-  /*                                                                       */
-  /* See `t1load.c' to see how data is loaded from the font file.          */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_POSTSCRIPT_AUX_H
-
-#include "t1parse.h"
-
-#include "t1errors.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_t1parse
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                   INPUT STREAM PARSER                         *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* see Adobe Technical Note 5040.Download_Fonts.pdf */
-
-  static FT_Error
-  read_pfb_tag( FT_Stream   stream,
-                FT_UShort  *atag,
-                FT_ULong   *asize )
-  {
-    FT_Error   error;
-    FT_UShort  tag;
-    FT_ULong   size;
-
-
-    *atag  = 0;
-    *asize = 0;
-
-    if ( !FT_READ_USHORT( tag ) )
-    {
-      if ( tag == 0x8001U || tag == 0x8002U )
-      {
-        if ( !FT_READ_ULONG_LE( size ) )
-          *asize = size;
-      }
-
-      *atag = tag;
-    }
-
-    return error;
-  }
-
-
-  static FT_Error
-  check_type1_format( FT_Stream    stream,
-                      const char*  header_string,
-                      size_t       header_length )
-  {
-    FT_Error   error;
-    FT_UShort  tag;
-    FT_ULong   dummy;
-
-
-    if ( FT_STREAM_SEEK( 0 ) )
-      goto Exit;
-
-    error = read_pfb_tag( stream, &tag, &dummy );
-    if ( error )
-      goto Exit;
-
-    /* We assume that the first segment in a PFB is always encoded as   */
-    /* text.  This might be wrong (and the specification doesn't insist */
-    /* on that), but we have never seen a counterexample.               */
-    if ( tag != 0x8001U && FT_STREAM_SEEK( 0 ) )
-      goto Exit;
-
-    if ( !FT_FRAME_ENTER( header_length ) )
-    {
-      error = FT_Err_Ok;
-
-      if ( ft_memcmp( stream->cursor, header_string, header_length ) != 0 )
-        error = FT_THROW( Unknown_File_Format );
-
-      FT_FRAME_EXIT();
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_New_Parser( T1_Parser      parser,
-                 FT_Stream      stream,
-                 FT_Memory      memory,
-                 PSAux_Service  psaux )
-  {
-    FT_Error   error;
-    FT_UShort  tag;
-    FT_ULong   size;
-
-
-    psaux->ps_parser_funcs->init( &parser->root, NULL, NULL, memory );
-
-    parser->stream       = stream;
-    parser->base_len     = 0;
-    parser->base_dict    = NULL;
-    parser->private_len  = 0;
-    parser->private_dict = NULL;
-    parser->in_pfb       = 0;
-    parser->in_memory    = 0;
-    parser->single_block = 0;
-
-    /* check the header format */
-    error = check_type1_format( stream, "%!PS-AdobeFont", 14 );
-    if ( error )
-    {
-      if ( FT_ERR_NEQ( error, Unknown_File_Format ) )
-        goto Exit;
-
-      error = check_type1_format( stream, "%!FontType", 10 );
-      if ( error )
-      {
-        FT_TRACE2(( "  not a Type 1 font\n" ));
-        goto Exit;
-      }
-    }
-
-    /******************************************************************/
-    /*                                                                */
-    /* Here a short summary of what is going on:                      */
-    /*                                                                */
-    /*   When creating a new Type 1 parser, we try to locate and load */
-    /*   the base dictionary if this is possible (i.e., for PFB       */
-    /*   files).  Otherwise, we load the whole font into memory.      */
-    /*                                                                */
-    /*   When `loading' the base dictionary, we only setup pointers   */
-    /*   in the case of a memory-based stream.  Otherwise, we         */
-    /*   allocate and load the base dictionary in it.                 */
-    /*                                                                */
-    /*   parser->in_pfb is set if we are in a binary (`.pfb') font.   */
-    /*   parser->in_memory is set if we have a memory stream.         */
-    /*                                                                */
-
-    /* try to compute the size of the base dictionary;     */
-    /* look for a Postscript binary file tag, i.e., 0x8001 */
-    if ( FT_STREAM_SEEK( 0L ) )
-      goto Exit;
-
-    error = read_pfb_tag( stream, &tag, &size );
-    if ( error )
-      goto Exit;
-
-    if ( tag != 0x8001U )
-    {
-      /* assume that this is a PFA file for now; an error will */
-      /* be produced later when more things are checked        */
-      if ( FT_STREAM_SEEK( 0L ) )
-        goto Exit;
-      size = stream->size;
-    }
-    else
-      parser->in_pfb = 1;
-
-    /* now, try to load `size' bytes of the `base' dictionary we */
-    /* found previously                                          */
-
-    /* if it is a memory-based resource, set up pointers */
-    if ( !stream->read )
-    {
-      parser->base_dict = (FT_Byte*)stream->base + stream->pos;
-      parser->base_len  = size;
-      parser->in_memory = 1;
-
-      /* check that the `size' field is valid */
-      if ( FT_STREAM_SKIP( size ) )
-        goto Exit;
-    }
-    else
-    {
-      /* read segment in memory -- this is clumsy, but so does the format */
-      if ( FT_ALLOC( parser->base_dict, size )       ||
-           FT_STREAM_READ( parser->base_dict, size ) )
-        goto Exit;
-      parser->base_len = size;
-    }
-
-    parser->root.base   = parser->base_dict;
-    parser->root.cursor = parser->base_dict;
-    parser->root.limit  = parser->root.cursor + parser->base_len;
-
-  Exit:
-    if ( error && !parser->in_memory )
-      FT_FREE( parser->base_dict );
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  T1_Finalize_Parser( T1_Parser  parser )
-  {
-    FT_Memory  memory = parser->root.memory;
-
-
-    /* always free the private dictionary */
-    FT_FREE( parser->private_dict );
-
-    /* free the base dictionary only when we have a disk stream */
-    if ( !parser->in_memory )
-      FT_FREE( parser->base_dict );
-
-    parser->root.funcs.done( &parser->root );
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  T1_Get_Private_Dict( T1_Parser      parser,
-                       PSAux_Service  psaux )
-  {
-    FT_Stream  stream = parser->stream;
-    FT_Memory  memory = parser->root.memory;
-    FT_Error   error  = FT_Err_Ok;
-    FT_ULong   size;
-
-
-    if ( parser->in_pfb )
-    {
-      /* in the case of the PFB format, the private dictionary can be  */
-      /* made of several segments.  We thus first read the number of   */
-      /* segments to compute the total size of the private dictionary  */
-      /* then re-read them into memory.                                */
-      FT_ULong   start_pos = FT_STREAM_POS();
-      FT_UShort  tag;
-
-
-      parser->private_len = 0;
-      for (;;)
-      {
-        error = read_pfb_tag( stream, &tag, &size );
-        if ( error )
-          goto Fail;
-
-        if ( tag != 0x8002U )
-          break;
-
-        parser->private_len += size;
-
-        if ( FT_STREAM_SKIP( size ) )
-          goto Fail;
-      }
-
-      /* Check that we have a private dictionary there */
-      /* and allocate private dictionary buffer        */
-      if ( parser->private_len == 0 )
-      {
-        FT_ERROR(( "T1_Get_Private_Dict:"
-                   " invalid private dictionary section\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Fail;
-      }
-
-      if ( FT_STREAM_SEEK( start_pos )                           ||
-           FT_ALLOC( parser->private_dict, parser->private_len ) )
-        goto Fail;
-
-      parser->private_len = 0;
-      for (;;)
-      {
-        error = read_pfb_tag( stream, &tag, &size );
-        if ( error || tag != 0x8002U )
-        {
-          error = FT_Err_Ok;
-          break;
-        }
-
-        if ( FT_STREAM_READ( parser->private_dict + parser->private_len,
-                             size ) )
-          goto Fail;
-
-        parser->private_len += size;
-      }
-    }
-    else
-    {
-      /* We have already `loaded' the whole PFA font file into memory; */
-      /* if this is a memory resource, allocate a new block to hold    */
-      /* the private dict.  Otherwise, simply overwrite into the base  */
-      /* dictionary block in the heap.                                 */
-
-      /* first of all, look at the `eexec' keyword */
-      FT_Byte*    cur   = parser->base_dict;
-      FT_Byte*    limit = cur + parser->base_len;
-      FT_Pointer  pos_lf;
-      FT_Bool     test_cr;
-
-
-    Again:
-      for (;;)
-      {
-        if ( cur[0] == 'e'   &&
-             cur + 9 < limit )      /* 9 = 5 letters for `eexec' + */
-                                    /* whitespace + 4 chars        */
-        {
-          if ( cur[1] == 'e' &&
-               cur[2] == 'x' &&
-               cur[3] == 'e' &&
-               cur[4] == 'c' )
-            break;
-        }
-        cur++;
-        if ( cur >= limit )
-        {
-          FT_ERROR(( "T1_Get_Private_Dict:"
-                     " could not find `eexec' keyword\n" ));
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-      }
-
-      /* check whether `eexec' was real -- it could be in a comment */
-      /* or string (as e.g. in u003043t.gsf from ghostscript)       */
-
-      parser->root.cursor = parser->base_dict;
-      /* set limit to `eexec' + whitespace + 4 characters */
-      parser->root.limit  = cur + 10;
-
-      cur   = parser->root.cursor;
-      limit = parser->root.limit;
-
-      while ( cur < limit )
-      {
-        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 )
-          break;
-        T1_Skip_Spaces  ( parser );
-        cur = parser->root.cursor;
-      }
-
-      /* we haven't found the correct `eexec'; go back and continue */
-      /* searching                                                  */
-
-      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  */
-      /* dictionary.  We overwrite the base dictionary for disk-based */
-      /* resources and allocate a new block otherwise                 */
-
-    Found:
-      parser->root.limit = parser->base_dict + parser->base_len;
-
-      T1_Skip_PS_Token( parser );
-      cur   = parser->root.cursor;
-      limit = parser->root.limit;
-
-      /* According to the Type 1 spec, the first cipher byte must not be */
-      /* an ASCII whitespace character code (blank, tab, carriage return */
-      /* or line feed).  We have seen Type 1 fonts with two line feed    */
-      /* characters...  So skip now all whitespace character codes.      */
-      /*                                                                 */
-      /* On the other hand, Adobe's Type 1 parser handles fonts just     */
-      /* fine that are violating this limitation, so we add a heuristic  */
-      /* test to stop at \r only if it is not used for EOL.              */
-
-      pos_lf  = ft_memchr( cur, '\n', (size_t)( limit - cur ) );
-      test_cr = FT_BOOL( !pos_lf                                       ||
-                         pos_lf > ft_memchr( cur,
-                                             '\r',
-                                             (size_t)( limit - cur ) ) );
-
-      while ( cur < limit                    &&
-              ( *cur == ' '                ||
-                *cur == '\t'               ||
-                (test_cr && *cur == '\r' ) ||
-                *cur == '\n'               ) )
-        cur++;
-      if ( cur >= limit )
-      {
-        FT_ERROR(( "T1_Get_Private_Dict:"
-                   " `eexec' not properly terminated\n" ));
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      size = parser->base_len - (FT_ULong)( cur - parser->base_dict );
-
-      if ( parser->in_memory )
-      {
-        /* note that we allocate one more byte to put a terminating `0' */
-        if ( FT_ALLOC( parser->private_dict, size + 1 ) )
-          goto Fail;
-        parser->private_len = size;
-      }
-      else
-      {
-        parser->single_block = 1;
-        parser->private_dict = parser->base_dict;
-        parser->private_len  = size;
-        parser->base_dict    = NULL;
-        parser->base_len     = 0;
-      }
-
-      /* now determine whether the private dictionary is encoded in binary */
-      /* or hexadecimal ASCII format -- decode it accordingly              */
-
-      /* we need to access the next 4 bytes (after the final whitespace */
-      /* following the `eexec' keyword); if they all are hexadecimal    */
-      /* digits, then we have a case of ASCII storage                   */
-
-      if ( cur + 3 < limit                                &&
-           ft_isxdigit( cur[0] ) && ft_isxdigit( cur[1] ) &&
-           ft_isxdigit( cur[2] ) && ft_isxdigit( cur[3] ) )
-      {
-        /* ASCII hexadecimal encoding */
-        FT_ULong  len;
-
-
-        parser->root.cursor = cur;
-        (void)psaux->ps_parser_funcs->to_bytes( &parser->root,
-                                                parser->private_dict,
-                                                parser->private_len,
-                                                &len,
-                                                0 );
-        parser->private_len = len;
-
-        /* put a safeguard */
-        parser->private_dict[len] = '\0';
-      }
-      else
-        /* binary encoding -- copy the private dict */
-        FT_MEM_MOVE( parser->private_dict, cur, size );
-    }
-
-    /* we now decrypt the encoded binary private dictionary */
-    psaux->t1_decrypt( parser->private_dict, parser->private_len, 55665U );
-
-    if ( parser->private_len < 4 )
-    {
-      FT_ERROR(( "T1_Get_Private_Dict:"
-                 " invalid private dictionary section\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Fail;
-    }
-
-    /* replace the four random bytes at the beginning with whitespace */
-    parser->private_dict[0] = ' ';
-    parser->private_dict[1] = ' ';
-    parser->private_dict[2] = ' ';
-    parser->private_dict[3] = ' ';
-
-    parser->root.base   = parser->private_dict;
-    parser->root.cursor = parser->private_dict;
-    parser->root.limit  = parser->root.cursor + parser->private_len;
-
-  Fail:
-  Exit:
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1parse.h b/third_party/freetype/src/type1/t1parse.h
deleted file mode 100644
index 3396680..0000000
--- a/third_party/freetype/src/type1/t1parse.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1parse.h                                                              */
-/*                                                                         */
-/*    Type 1 parser (specification).                                       */
-/*                                                                         */
-/*  Copyright 1996-2017 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 T1PARSE_H_
-#define T1PARSE_H_
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_TYPE1_TYPES_H
-#include FT_INTERNAL_STREAM_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    T1_ParserRec                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A PS_ParserRec is an object used to parse a Type 1 fonts very      */
-  /*    quickly.                                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    root         :: The root parser.                                   */
-  /*                                                                       */
-  /*    stream       :: The current input stream.                          */
-  /*                                                                       */
-  /*    base_dict    :: A pointer to the top-level dictionary.             */
-  /*                                                                       */
-  /*    base_len     :: The length in bytes of the top dictionary.         */
-  /*                                                                       */
-  /*    private_dict :: A pointer to the private dictionary.               */
-  /*                                                                       */
-  /*    private_len  :: The length in bytes of the private dictionary.     */
-  /*                                                                       */
-  /*    in_pfb       :: A boolean.  Indicates that we are handling a PFB   */
-  /*                    file.                                              */
-  /*                                                                       */
-  /*    in_memory    :: A boolean.  Indicates a memory-based stream.       */
-  /*                                                                       */
-  /*    single_block :: A boolean.  Indicates that the private dictionary  */
-  /*                    is stored in lieu of the base dictionary.          */
-  /*                                                                       */
-  typedef struct  T1_ParserRec_
-  {
-    PS_ParserRec  root;
-    FT_Stream     stream;
-
-    FT_Byte*      base_dict;
-    FT_ULong      base_len;
-
-    FT_Byte*      private_dict;
-    FT_ULong      private_len;
-
-    FT_Bool       in_pfb;
-    FT_Bool       in_memory;
-    FT_Bool       single_block;
-
-  } T1_ParserRec, *T1_Parser;
-
-
-#define T1_Add_Table( p, i, o, l )  (p)->funcs.add( (p), i, o, l )
-#define T1_Release_Table( p )          \
-          do                           \
-          {                            \
-            if ( (p)->funcs.release )  \
-              (p)->funcs.release( p ); \
-          } while ( 0 )
-
-
-#define T1_Skip_Spaces( p )    (p)->root.funcs.skip_spaces( &(p)->root )
-#define T1_Skip_PS_Token( p )  (p)->root.funcs.skip_PS_token( &(p)->root )
-
-#define T1_ToInt( p )       (p)->root.funcs.to_int( &(p)->root )
-#define T1_ToFixed( p, t )  (p)->root.funcs.to_fixed( &(p)->root, t )
-
-#define T1_ToCoordArray( p, m, c )                           \
-          (p)->root.funcs.to_coord_array( &(p)->root, m, c )
-#define T1_ToFixedArray( p, m, f, t )                           \
-          (p)->root.funcs.to_fixed_array( &(p)->root, m, f, t )
-#define T1_ToToken( p, t )                          \
-          (p)->root.funcs.to_token( &(p)->root, t )
-#define T1_ToTokenArray( p, t, m, c )                           \
-          (p)->root.funcs.to_token_array( &(p)->root, t, m, c )
-
-#define T1_Load_Field( p, f, o, m, pf )                         \
-          (p)->root.funcs.load_field( &(p)->root, f, o, m, pf )
-
-#define T1_Load_Field_Table( p, f, o, m, pf )                         \
-          (p)->root.funcs.load_field_table( &(p)->root, f, o, m, pf )
-
-
-  FT_LOCAL( FT_Error )
-  T1_New_Parser( T1_Parser      parser,
-                 FT_Stream      stream,
-                 FT_Memory      memory,
-                 PSAux_Service  psaux );
-
-  FT_LOCAL( FT_Error )
-  T1_Get_Private_Dict( T1_Parser      parser,
-                       PSAux_Service  psaux );
-
-  FT_LOCAL( void )
-  T1_Finalize_Parser( T1_Parser  parser );
-
-
-FT_END_HEADER
-
-#endif /* T1PARSE_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/t1tokens.h b/third_party/freetype/src/type1/t1tokens.h
deleted file mode 100644
index ca0c55f..0000000
--- a/third_party/freetype/src/type1/t1tokens.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  t1tokens.h                                                             */
-/*                                                                         */
-/*    Type 1 tokenizer (specification).                                    */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_FontInfoRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_INFO
-
-  T1_FIELD_STRING( "version",            version,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_STRING( "Notice",             notice,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_STRING( "FullName",           full_name,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_STRING( "FamilyName",         family_name,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_STRING( "Weight",             weight,
-                   T1_FIELD_DICT_FONTDICT )
-
-  /* we use pointers to detect modifications made by synthetic fonts */
-  T1_FIELD_NUM   ( "ItalicAngle",        italic_angle,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_BOOL  ( "isFixedPitch",       is_fixed_pitch,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_NUM   ( "UnderlinePosition",  underline_position,
-                   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_NUM   ( "UnderlineThickness", underline_thickness,
-                   T1_FIELD_DICT_FONTDICT )
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_FontExtraRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_EXTRA
-
-  T1_FIELD_NUM   ( "FSType", fs_type,
-                   T1_FIELD_DICT_FONTDICT )
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_PrivateRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_PRIVATE
-
-  T1_FIELD_NUM       ( "UniqueID",         unique_id,
-                       T1_FIELD_DICT_FONTDICT | T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM       ( "lenIV",            lenIV,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM       ( "LanguageGroup",    language_group,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM       ( "password",         password,
-                       T1_FIELD_DICT_PRIVATE )
-
-  T1_FIELD_FIXED_1000( "BlueScale",        blue_scale,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM       ( "BlueShift",        blue_shift,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM       ( "BlueFuzz",         blue_fuzz,
-                       T1_FIELD_DICT_PRIVATE )
-
-  T1_FIELD_NUM_TABLE ( "BlueValues",       blue_values,        14,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE ( "OtherBlues",       other_blues,        10,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE ( "FamilyBlues",      family_blues,       14,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE ( "FamilyOtherBlues", family_other_blues, 10,
-                       T1_FIELD_DICT_PRIVATE )
-
-  T1_FIELD_NUM_TABLE2( "StdHW",            standard_width,      1,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE2( "StdVW",            standard_height,     1,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE2( "MinFeature",       min_feature,         2,
-                       T1_FIELD_DICT_PRIVATE )
-
-  T1_FIELD_NUM_TABLE ( "StemSnapH",        snap_widths,        12,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM_TABLE ( "StemSnapV",        snap_heights,       12,
-                       T1_FIELD_DICT_PRIVATE )
-
-  T1_FIELD_FIXED     ( "ExpansionFactor",  expansion_factor,
-                       T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_BOOL      ( "ForceBold",        force_bold,
-                       T1_FIELD_DICT_PRIVATE )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  T1_FontRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FONT_DICT
-
-  T1_FIELD_KEY  ( "FontName",    font_name,    T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_NUM  ( "PaintType",   paint_type,   T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_NUM  ( "FontType",    font_type,    T1_FIELD_DICT_FONTDICT )
-  T1_FIELD_FIXED( "StrokeWidth", stroke_width, T1_FIELD_DICT_FONTDICT )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  FT_BBox
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_BBOX
-
-  T1_FIELD_BBOX( "FontBBox", xMin, T1_FIELD_DICT_FONTDICT )
-
-
-#ifndef T1_CONFIG_OPTION_NO_MM_SUPPORT
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  T1_FaceRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_FACE
-
-  T1_FIELD_NUM( "NDV", ndv_idx, T1_FIELD_DICT_PRIVATE )
-  T1_FIELD_NUM( "CDV", cdv_idx, T1_FIELD_DICT_PRIVATE )
-
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  PS_BlendRec
-#undef  T1CODE
-#define T1CODE        T1_FIELD_LOCATION_BLEND
-
-  T1_FIELD_NUM_TABLE( "DesignVector", default_design_vector,
-                      T1_MAX_MM_DESIGNS, T1_FIELD_DICT_FONTDICT )
-
-
-#endif /* T1_CONFIG_OPTION_NO_MM_SUPPORT */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/type1.c b/third_party/freetype/src/type1/type1.c
deleted file mode 100644
index bfe0e43..0000000
--- a/third_party/freetype/src/type1/type1.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  type1.c                                                                */
-/*                                                                         */
-/*    FreeType Type 1 driver component (body only).                        */
-/*                                                                         */
-/*  Copyright 1996-2017 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "t1parse.c"
-#include "t1load.c"
-#include "t1objs.c"
-#include "t1driver.c"
-#include "t1gload.c"
-
-#ifndef T1_CONFIG_OPTION_NO_AFM
-#include "t1afm.c"
-#endif
-
-
-/* END */
diff --git a/xfa/fgas/font/DEPS b/xfa/fgas/font/DEPS
deleted file mode 100644
index 2930dd0..0000000
--- a/xfa/fgas/font/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  '+third_party/freetype/include',
-]