Erase unused freetype files.

Change-Id: I024573f341cba48d9f5d2bc38683a016639b14e2
Reviewed-on: https://pdfium-review.googlesource.com/3119
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index e1076ee..78afcd0 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -60,14 +60,72 @@
   ]
   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/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/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",
@@ -92,6 +150,8 @@
   ]
   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",
diff --git a/third_party/freetype/include/freetype/ftautoh.h b/third_party/freetype/include/freetype/ftautoh.h
deleted file mode 100644
index ab39c21..0000000
--- a/third_party/freetype/include/freetype/ftautoh.h
+++ /dev/null
@@ -1,450 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftautoh.h                                                              */
-/*                                                                         */
-/*    FreeType API for controlling the auto-hinter (specification only).   */
-/*                                                                         */
-/*  Copyright 2012-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTAUTOH_H__
-#define __FTAUTOH_H__
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-#ifdef FREETYPE_H
-#error "freetype.h of FreeType 1 has been loaded!"
-#error "Please fix the directory search order for header files"
-#error "so that freetype.h of FreeType 2 is found first."
-#endif
-
-
-FT_BEGIN_HEADER
-
-
-  /**************************************************************************
-   *
-   * @section:
-   *   auto_hinter
-   *
-   * @title:
-   *   The auto-hinter
-   *
-   * @abstract:
-   *   Controlling the auto-hinting module.
-   *
-   * @description:
-   *   While FreeType's auto-hinter doesn't expose API functions by itself,
-   *   it is possible to control its behaviour with @FT_Property_Set and
-   *   @FT_Property_Get.  The following lists the available properties
-   *   together with the necessary macros and structures.
-   *
-   *   Note that the auto-hinter's module name is `autofitter' for
-   *   historical reasons.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   glyph-to-script-map
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The auto-hinter provides various script modules to hint glyphs.
-   *   Examples of supported scripts are Latin or CJK.  Before a glyph is
-   *   auto-hinted, the Unicode character map of the font gets examined, and
-   *   the script is then determined based on Unicode character ranges, see
-   *   below.
-   *
-   *   OpenType fonts, however, often provide much more glyphs than
-   *   character codes (small caps, superscripts, ligatures, swashes, etc.),
-   *   to be controlled by so-called `features'.  Handling OpenType features
-   *   can be quite complicated and thus needs a separate library on top of
-   *   FreeType.
-   *
-   *   The mapping between glyph indices and scripts (in the auto-hinter
-   *   sense, see the @FT_AUTOHINTER_SCRIPT_XXX values) is stored as an
-   *   array with `num_glyphs' elements, as found in the font's @FT_Face
-   *   structure.  The `glyph-to-script-map' property returns a pointer to
-   *   this array, which can be modified as needed.  Note that the
-   *   modification should happen before the first glyph gets processed by
-   *   the auto-hinter so that the global analysis of the font shapes
-   *   actually uses the modified mapping.
-   *
-   *   The following example code demonstrates how to access it (omitting
-   *   the error handling).
-   *
-   *   {
-   *     FT_Library                library;
-   *     FT_Face                   face;
-   *     FT_Prop_GlyphToScriptMap  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *
-   *     prop.face = face;
-   *
-   *     FT_Property_Get( library, "autofitter",
-   *                               "glyph-to-script-map", &prop );
-   *
-   *     // adjust `prop.map' as needed right here
-   *
-   *     FT_Load_Glyph( face, ..., FT_LOAD_FORCE_AUTOHINT );
-   *   }
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @enum:
-   *   FT_AUTOHINTER_SCRIPT_XXX
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   A list of constants used for the @glyph-to-script-map property to
-   *   specify the script submodule the auto-hinter should use for hinting a
-   *   particular glyph.
-   *
-   * @values:
-   *   FT_AUTOHINTER_SCRIPT_NONE ::
-   *     Don't auto-hint this glyph.
-   *
-   *   FT_AUTOHINTER_SCRIPT_LATIN ::
-   *     Apply the latin auto-hinter.  For the auto-hinter, `latin' is a
-   *     very broad term, including Cyrillic and Greek also since characters
-   *     from those scripts share the same design constraints.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0020 - U+007F  // Basic Latin (no control characters)
-   *       U+00A0 - U+00FF  // Latin-1 Supplement (no control characters)
-   *       U+0100 - U+017F  // Latin Extended-A
-   *       U+0180 - U+024F  // Latin Extended-B
-   *       U+0250 - U+02AF  // IPA Extensions
-   *       U+02B0 - U+02FF  // Spacing Modifier Letters
-   *       U+0300 - U+036F  // Combining Diacritical Marks
-   *       U+0370 - U+03FF  // Greek and Coptic
-   *       U+0400 - U+04FF  // Cyrillic
-   *       U+0500 - U+052F  // Cyrillic Supplement
-   *       U+1D00 - U+1D7F  // Phonetic Extensions
-   *       U+1D80 - U+1DBF  // Phonetic Extensions Supplement
-   *       U+1DC0 - U+1DFF  // Combining Diacritical Marks Supplement
-   *       U+1E00 - U+1EFF  // Latin Extended Additional
-   *       U+1F00 - U+1FFF  // Greek Extended
-   *       U+2000 - U+206F  // General Punctuation
-   *       U+2070 - U+209F  // Superscripts and Subscripts
-   *       U+20A0 - U+20CF  // Currency Symbols
-   *       U+2150 - U+218F  // Number Forms
-   *       U+2460 - U+24FF  // Enclosed Alphanumerics
-   *       U+2C60 - U+2C7F  // Latin Extended-C
-   *       U+2DE0 - U+2DFF  // Cyrillic Extended-A
-   *       U+2E00 - U+2E7F  // Supplemental Punctuation
-   *       U+A640 - U+A69F  // Cyrillic Extended-B
-   *       U+A720 - U+A7FF  // Latin Extended-D
-   *       U+FB00 - U+FB06  // Alphab. Present. Forms (Latin Ligatures)
-   *      U+1D400 - U+1D7FF // Mathematical Alphanumeric Symbols
-   *      U+1F100 - U+1F1FF // Enclosed Alphanumeric Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_CJK ::
-   *     Apply the CJK auto-hinter, covering Chinese, Japanese, Korean, old
-   *     Vietnamese, and some other scripts.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+1100 - U+11FF  // Hangul Jamo
-   *       U+2E80 - U+2EFF  // CJK Radicals Supplement
-   *       U+2F00 - U+2FDF  // Kangxi Radicals
-   *       U+2FF0 - U+2FFF  // Ideographic Description Characters
-   *       U+3000 - U+303F  // CJK Symbols and Punctuation
-   *       U+3040 - U+309F  // Hiragana
-   *       U+30A0 - U+30FF  // Katakana
-   *       U+3100 - U+312F  // Bopomofo
-   *       U+3130 - U+318F  // Hangul Compatibility Jamo
-   *       U+3190 - U+319F  // Kanbun
-   *       U+31A0 - U+31BF  // Bopomofo Extended
-   *       U+31C0 - U+31EF  // CJK Strokes
-   *       U+31F0 - U+31FF  // Katakana Phonetic Extensions
-   *       U+3200 - U+32FF  // Enclosed CJK Letters and Months
-   *       U+3300 - U+33FF  // CJK Compatibility
-   *       U+3400 - U+4DBF  // CJK Unified Ideographs Extension A
-   *       U+4DC0 - U+4DFF  // Yijing Hexagram Symbols
-   *       U+4E00 - U+9FFF  // CJK Unified Ideographs
-   *       U+A960 - U+A97F  // Hangul Jamo Extended-A
-   *       U+AC00 - U+D7AF  // Hangul Syllables
-   *       U+D7B0 - U+D7FF  // Hangul Jamo Extended-B
-   *       U+F900 - U+FAFF  // CJK Compatibility Ideographs
-   *       U+FE10 - U+FE1F  // Vertical forms
-   *       U+FE30 - U+FE4F  // CJK Compatibility Forms
-   *       U+FF00 - U+FFEF  // Halfwidth and Fullwidth Forms
-   *      U+1B000 - U+1B0FF // Kana Supplement
-   *      U+1D300 - U+1D35F // Tai Xuan Hing Symbols
-   *      U+1F200 - U+1F2FF // Enclosed Ideographic Supplement
-   *      U+20000 - U+2A6DF // CJK Unified Ideographs Extension B
-   *      U+2A700 - U+2B73F // CJK Unified Ideographs Extension C
-   *      U+2B740 - U+2B81F // CJK Unified Ideographs Extension D
-   *      U+2F800 - U+2FA1F // CJK Compatibility Ideographs Supplement
-   *     }
-   *
-   *   FT_AUTOHINTER_SCRIPT_INDIC ::
-   *     Apply the indic auto-hinter, covering all major scripts from the
-   *     Indian sub-continent and some other related scripts like Thai, Lao,
-   *     or Tibetan.
-   *
-   *     By default, characters from the following Unicode ranges are
-   *     assigned to this submodule.
-   *
-   *     {
-   *       U+0900 - U+0DFF  // Indic Range
-   *       U+0F00 - U+0FFF  // Tibetan
-   *       U+1900 - U+194F  // Limbu
-   *       U+1B80 - U+1BBF  // Sundanese
-   *       U+1C80 - U+1CDF  // Meetei Mayak
-   *       U+A800 - U+A82F  // Syloti Nagri
-   *      U+11800 - U+118DF // Sharada
-   *     }
-   *
-   *     Note that currently Indic support is rudimentary only, missing blue
-   *     zone support.
-   *
-   */
-#define FT_AUTOHINTER_SCRIPT_NONE   0
-#define FT_AUTOHINTER_SCRIPT_LATIN  1
-#define FT_AUTOHINTER_SCRIPT_CJK    2
-#define FT_AUTOHINTER_SCRIPT_INDIC  3
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_GlyphToScriptMap
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   The data exchange structure for the @glyph-to-script-map property.
-   *
-   */
-  typedef struct  FT_Prop_GlyphToScriptMap_
-  {
-    FT_Face     face;
-    FT_UShort*  map;
-
-  } FT_Prop_GlyphToScriptMap;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   fallback-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If no auto-hinter script module can be assigned to a glyph, a
-   *   fallback script gets assigned to it (see also the
-   *   @glyph-to-script-map property).  By default, this is
-   *   @FT_AUTOHINTER_SCRIPT_CJK.  Using the `fallback-script' property,
-   *   this fallback value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     fallback_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "fallback-script", &fallback_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   fallback script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the fallback script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   default-script
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with FT_CONFIG_OPTION_USE_HARFBUZZ to make
-   *   the HarfBuzz library access OpenType features for getting better
-   *   glyph coverages, this property sets the (auto-fitter) script to be
-   *   used for the default (OpenType) script data of a font's GSUB table.
-   *   Features for the default script are intended for all scripts not
-   *   explicitly handled in GSUB; an example is a `dlig' feature,
-   *   containing the combination of the characters `T', `E', and `L' to
-   *   form a `TEL' ligature.
-   *
-   *   By default, this is @FT_AUTOHINTER_SCRIPT_LATIN.  Using the
-   *   `default-script' property, this default value can be changed.
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_UInt     default_script = FT_AUTOHINTER_SCRIPT_NONE;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "default-script", &default_script );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   It's important to use the right timing for changing this value: The
-   *   creation of the glyph-to-script map that eventually uses the
-   *   default script value gets triggered either by setting or reading a
-   *   face-specific property like @glyph-to-script-map, or by auto-hinting
-   *   any glyph from that face.  In particular, if you have already created
-   *   an @FT_Face structure but not loaded any glyph (using the
-   *   auto-hinter), a change of the default script will affect this face.
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   increase-x-height
-   *
-   * @description:
-   *   For ppem values in the range 6~<= ppem <= `increase-x-height', round
-   *   up the font's x~height much more often than normally.  If the value
-   *   is set to~0, which is the default, this feature is switched off.  Use
-   *   this property to improve the legibility of small font sizes if
-   *   necessary.
-   *
-   *   {
-   *     FT_Library               library;
-   *     FT_Face                  face;
-   *     FT_Prop_IncreaseXHeight  prop;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *     FT_New_Face( library, "foo.ttf", 0, &face );
-   *     FT_Set_Char_Size( face, 10 * 64, 0, 72, 0 );
-   *
-   *     prop.face  = face;
-   *     prop.limit = 14;
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "increase-x-height", &prop );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   Set this value right after calling @FT_Set_Char_Size, but before
-   *   loading any glyph (using the auto-hinter).
-   *
-   */
-
-
-  /**************************************************************************
-   *
-   * @struct:
-   *   FT_Prop_IncreaseXHeight
-   *
-   * @description:
-   *   The data exchange structure for the @increase-x-height property.
-   *
-   */
-  typedef struct  FT_Prop_IncreaseXHeight_
-  {
-    FT_Face  face;
-    FT_UInt  limit;
-
-  } FT_Prop_IncreaseXHeight;
-
-
-  /**************************************************************************
-   *
-   * @property:
-   *   warping
-   *
-   * @description:
-   *   *Experimental* *only*
-   *
-   *   If FreeType gets compiled with option AF_CONFIG_OPTION_USE_WARPER to
-   *   activate the warp hinting code in the auto-hinter, this property
-   *   switches warping on and off.
-   *
-   *   Warping only works in `light' auto-hinting mode.  The idea of the
-   *   code is to slightly scale and shift a glyph along the non-hinted
-   *   dimension (which is usually the horizontal axis) so that as much of
-   *   its segments are aligned (more or less) to the grid.  To find out a
-   *   glyph's optimal scaling and shifting value, various parameter
-   *   combinations are tried and scored.
-   *
-   *   By default, warping is off.  The example below shows how to switch on
-   *   warping (omitting the error handling).
-   *
-   *   {
-   *     FT_Library  library;
-   *     FT_Bool     warping = 1;
-   *
-   *
-   *     FT_Init_FreeType( &library );
-   *
-   *     FT_Property_Set( library, "autofitter",
-   *                               "warping", &warping );
-   *   }
-   *
-   * @note:
-   *   This property can be used with @FT_Property_Get also.
-   *
-   *   The warping code can also change advance widths.  Have a look at the
-   *   `lsb_delta' and `rsb_delta' fields in the @FT_GlyphSlotRec structure
-   *   for details on improving inter-glyph distances while rendering.
-   *
-   *   Since warping is a global property of the auto-hinter it is best to
-   *   change its value before rendering any face.  Otherwise, you should
-   *   reload all faces that get auto-hinted in `light' hinting mode.
-   *
-   */
-
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTAUTOH_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftbbox.h b/third_party/freetype/include/freetype/ftbbox.h
deleted file mode 100644
index 9d9d040..0000000
--- a/third_party/freetype/include/freetype/ftbbox.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbbox.h                                                               */
-/*                                                                         */
-/*    FreeType exact bbox computation (specification).                     */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This component has a _single_ role: to compute exact outline bounding */
-  /* boxes.                                                                */
-  /*                                                                       */
-  /* It is separated from the rest of the engine for various technical     */
-  /* reasons.  It may well be integrated in `ftoutln' later.               */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#ifndef __FTBBOX_H__
-#define __FTBBOX_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                                                 */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_Outline_Get_BBox                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Compute the exact bounding box of an outline.  This is slower      */
-  /*    than computing the control box.  However, it uses an advanced      */
-  /*    algorithm that returns _very_ quickly when the two boxes           */
-  /*    coincide.  Otherwise, the outline Bézier arcs are traversed to     */
-  /*    extract their extrema.                                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    outline :: A pointer to the source outline.                        */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    abbox   :: The outline's exact bounding box.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    If the font is tricky and the glyph has been loaded with           */
-  /*    @FT_LOAD_NO_SCALE, the resulting BBox is meaningless.  To get      */
-  /*    reasonable values for the BBox 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 BBox, */
-  /*    which can be eventually converted back to font units.              */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_Outline_Get_BBox( FT_Outline*  outline,
-                       FT_BBox     *abbox );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTBBOX_H__ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/ftbdf.h b/third_party/freetype/include/freetype/ftbdf.h
deleted file mode 100644
index 0bdabf4..0000000
--- a/third_party/freetype/include/freetype/ftbdf.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbdf.h                                                                */
-/*                                                                         */
-/*    FreeType API for accessing BDF-specific strings (specification).     */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTBDF_H__
-#define __FTBDF_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>                                                             */
-  /*    bdf_fonts                                                          */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    BDF and PCF Files                                                  */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    BDF and PCF specific API.                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of functions specific to BDF */
-  /*    and PCF fonts.                                                     */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /**********************************************************************
-   *
-   * @enum:
-   *    BDF_PropertyType
-   *
-   * @description:
-   *    A list of BDF property types.
-   *
-   * @values:
-   *    BDF_PROPERTY_TYPE_NONE ::
-   *      Value~0 is used to indicate a missing property.
-   *
-   *    BDF_PROPERTY_TYPE_ATOM ::
-   *      Property is a string atom.
-   *
-   *    BDF_PROPERTY_TYPE_INTEGER ::
-   *      Property is a 32-bit signed integer.
-   *
-   *    BDF_PROPERTY_TYPE_CARDINAL ::
-   *      Property is a 32-bit unsigned integer.
-   */
-  typedef enum  BDF_PropertyType_
-  {
-    BDF_PROPERTY_TYPE_NONE     = 0,
-    BDF_PROPERTY_TYPE_ATOM     = 1,
-    BDF_PROPERTY_TYPE_INTEGER  = 2,
-    BDF_PROPERTY_TYPE_CARDINAL = 3
-
-  } BDF_PropertyType;
-
-
-  /**********************************************************************
-   *
-   * @type:
-   *    BDF_Property
-   *
-   * @description:
-   *    A handle to a @BDF_PropertyRec structure to model a given
-   *    BDF/PCF property.
-   */
-  typedef struct BDF_PropertyRec_*  BDF_Property;
-
-
- /**********************************************************************
-  *
-  * @struct:
-  *    BDF_PropertyRec
-  *
-  * @description:
-  *    This structure models a given BDF/PCF property.
-  *
-  * @fields:
-  *    type ::
-  *      The property type.
-  *
-  *    u.atom ::
-  *      The atom string, if type is @BDF_PROPERTY_TYPE_ATOM.  May be
-  *      NULL, indicating an empty string.
-  *
-  *    u.integer ::
-  *      A signed integer, if type is @BDF_PROPERTY_TYPE_INTEGER.
-  *
-  *    u.cardinal ::
-  *      An unsigned integer, if type is @BDF_PROPERTY_TYPE_CARDINAL.
-  */
-  typedef struct  BDF_PropertyRec_
-  {
-    BDF_PropertyType  type;
-    union {
-      const char*     atom;
-      FT_Int32        integer;
-      FT_UInt32       cardinal;
-
-    } u;
-
-  } BDF_PropertyRec;
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_Get_BDF_Charset_ID
-  *
-  * @description:
-  *    Retrieve a BDF font character set identity, according to
-  *    the BDF specification.
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  * @output:
-  *    acharset_encoding ::
-  *       Charset encoding, as a C~string, owned by the face.
-  *
-  *    acharset_registry ::
-  *       Charset registry, as a C~string, owned by the face.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   This function only works with BDF faces, returning an error otherwise.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Get_BDF_Charset_ID( FT_Face       face,
-                         const char*  *acharset_encoding,
-                         const char*  *acharset_registry );
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_Get_BDF_Property
-  *
-  * @description:
-  *    Retrieve a BDF property from a BDF or PCF font file.
-  *
-  * @input:
-  *    face :: A handle to the input face.
-  *
-  *    name :: The property name.
-  *
-  * @output:
-  *    aproperty :: The property.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   This function works with BDF _and_ PCF fonts.  It returns an error
-  *   otherwise.  It also returns an error if the property is not in the
-  *   font.
-  *
-  *   A `property' is a either key-value pair within the STARTPROPERTIES
-  *   ... ENDPROPERTIES block of a BDF font or a key-value pair from the
-  *   `info->props' array within a `FontRec' structure of a PCF font.
-  *
-  *   Integer properties are always stored as `signed' within PCF fonts;
-  *   consequently, @BDF_PROPERTY_TYPE_CARDINAL is a possible return value
-  *   for BDF fonts only.
-  *
-  *   In case of error, `aproperty->type' is always set to
-  *   @BDF_PROPERTY_TYPE_NONE.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Get_BDF_Property( FT_Face           face,
-                       const char*       prop_name,
-                       BDF_PropertyRec  *aproperty );
-
-  /* */
-
-FT_END_HEADER
-
-#endif /* __FTBDF_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftbzip2.h b/third_party/freetype/include/freetype/ftbzip2.h
deleted file mode 100644
index c25f946..0000000
--- a/third_party/freetype/include/freetype/ftbzip2.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbzip2.h                                                              */
-/*                                                                         */
-/*    Bzip2-compressed stream support.                                     */
-/*                                                                         */
-/*  Copyright 2010-2015 by                                                 */
-/*  Joel Klinghed.                                                         */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 __FTBZIP2_H__
-#define __FTBZIP2_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>                                                             */
-  /*    bzip2                                                              */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    BZIP2 Streams                                                      */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Using bzip2-compressed font files.                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of Bzip2-specific functions. */
-  /*                                                                       */
-  /*************************************************************************/
-
-
- /************************************************************************
-  *
-  * @function:
-  *   FT_Stream_OpenBzip2
-  *
-  * @description:
-  *   Open a new stream to parse bzip2-compressed font files.  This is
-  *   mainly used to support the compressed `*.pcf.bz2' 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, bzip2 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 bzip2 compressed 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 bzip2 support.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Stream_OpenBzip2( FT_Stream  stream,
-                       FT_Stream  source );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTBZIP2_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftcache.h b/third_party/freetype/include/freetype/ftcache.h
deleted file mode 100644
index 68525bb..0000000
--- a/third_party/freetype/include/freetype/ftcache.h
+++ /dev/null
@@ -1,1057 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcache.h                                                              */
-/*                                                                         */
-/*    FreeType Cache subsystem (specification).                            */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTCACHE_H__
-#define __FTCACHE_H__
-
-
-#include <ft2build.h>
-#include FT_GLYPH_H
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************
-   *
-   * <Section>
-   *    cache_subsystem
-   *
-   * <Title>
-   *    Cache Sub-System
-   *
-   * <Abstract>
-   *    How to cache face, size, and glyph data with FreeType~2.
-   *
-   * <Description>
-   *   This section describes the FreeType~2 cache sub-system, which is used
-   *   to limit the number of concurrently opened @FT_Face and @FT_Size
-   *   objects, as well as caching information like character maps and glyph
-   *   images while limiting their maximum memory usage.
-   *
-   *   Note that all types and functions begin with the `FTC_' prefix.
-   *
-   *   The cache is highly portable and thus doesn't know anything about the
-   *   fonts installed on your system, or how to access them.  This implies
-   *   the following scheme:
-   *
-   *   First, available or installed font faces are uniquely identified by
-   *   @FTC_FaceID values, provided to the cache by the client.  Note that
-   *   the cache only stores and compares these values, and doesn't try to
-   *   interpret them in any way.
-   *
-   *   Second, the cache calls, only when needed, a client-provided function
-   *   to convert an @FTC_FaceID into a new @FT_Face object.  The latter is
-   *   then completely managed by the cache, including its termination
-   *   through @FT_Done_Face.  To monitor termination of face objects, the
-   *   finalizer callback in the `generic' field of the @FT_Face object can
-   *   be used, which might also be used to store the @FTC_FaceID of the
-   *   face.
-   *
-   *   Clients are free to map face IDs to anything else.  The most simple
-   *   usage is to associate them to a (pathname,face_index) pair that is
-   *   used to call @FT_New_Face.  However, more complex schemes are also
-   *   possible.
-   *
-   *   Note that for the cache to work correctly, the face ID values must be
-   *   *persistent*, which means that the contents they point to should not
-   *   change at runtime, or that their value should not become invalid.
-   *
-   *   If this is unavoidable (e.g., when a font is uninstalled at runtime),
-   *   you should call @FTC_Manager_RemoveFaceID as soon as possible, to let
-   *   the cache get rid of any references to the old @FTC_FaceID it may
-   *   keep internally.  Failure to do so will lead to incorrect behaviour
-   *   or even crashes.
-   *
-   *   To use the cache, start with calling @FTC_Manager_New to create a new
-   *   @FTC_Manager object, which models a single cache instance.  You can
-   *   then look up @FT_Face and @FT_Size objects with
-   *   @FTC_Manager_LookupFace and @FTC_Manager_LookupSize, respectively.
-   *
-   *   If you want to use the charmap caching, call @FTC_CMapCache_New, then
-   *   later use @FTC_CMapCache_Lookup to perform the equivalent of
-   *   @FT_Get_Char_Index, only much faster.
-   *
-   *   If you want to use the @FT_Glyph caching, call @FTC_ImageCache, then
-   *   later use @FTC_ImageCache_Lookup to retrieve the corresponding
-   *   @FT_Glyph objects from the cache.
-   *
-   *   If you need lots of small bitmaps, it is much more memory efficient
-   *   to call @FTC_SBitCache_New followed by @FTC_SBitCache_Lookup.  This
-   *   returns @FTC_SBitRec structures, which are used to store small
-   *   bitmaps directly.  (A small bitmap is one whose metrics and
-   *   dimensions all fit into 8-bit integers).
-   *
-   *   We hope to also provide a kerning cache in the near future.
-   *
-   *
-   * <Order>
-   *   FTC_Manager
-   *   FTC_FaceID
-   *   FTC_Face_Requester
-   *
-   *   FTC_Manager_New
-   *   FTC_Manager_Reset
-   *   FTC_Manager_Done
-   *   FTC_Manager_LookupFace
-   *   FTC_Manager_LookupSize
-   *   FTC_Manager_RemoveFaceID
-   *
-   *   FTC_Node
-   *   FTC_Node_Unref
-   *
-   *   FTC_ImageCache
-   *   FTC_ImageCache_New
-   *   FTC_ImageCache_Lookup
-   *
-   *   FTC_SBit
-   *   FTC_SBitCache
-   *   FTC_SBitCache_New
-   *   FTC_SBitCache_Lookup
-   *
-   *   FTC_CMapCache
-   *   FTC_CMapCache_New
-   *   FTC_CMapCache_Lookup
-   *
-   *************************************************************************/
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                    BASIC TYPE DEFINITIONS                     *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @type: FTC_FaceID
-   *
-   * @description:
-   *   An opaque pointer type that is used to identity face objects.  The
-   *   contents of such objects is application-dependent.
-   *
-   *   These pointers are typically used to point to a user-defined
-   *   structure containing a font file path, and face index.
-   *
-   * @note:
-   *   Never use NULL as a valid @FTC_FaceID.
-   *
-   *   Face IDs are passed by the client to the cache manager that calls,
-   *   when needed, the @FTC_Face_Requester to translate them into new
-   *   @FT_Face objects.
-   *
-   *   If the content of a given face ID changes at runtime, or if the value
-   *   becomes invalid (e.g., when uninstalling a font), you should
-   *   immediately call @FTC_Manager_RemoveFaceID before any other cache
-   *   function.
-   *
-   *   Failure to do so will result in incorrect behaviour or even
-   *   memory leaks and crashes.
-   */
-  typedef FT_Pointer  FTC_FaceID;
-
-
-  /************************************************************************
-   *
-   * @functype:
-   *   FTC_Face_Requester
-   *
-   * @description:
-   *   A callback function provided by client applications.  It is used by
-   *   the cache manager to translate a given @FTC_FaceID into a new valid
-   *   @FT_Face object, on demand.
-   *
-   * <Input>
-   *   face_id ::
-   *     The face ID to resolve.
-   *
-   *   library ::
-   *     A handle to a FreeType library object.
-   *
-   *   req_data ::
-   *     Application-provided request data (see note below).
-   *
-   * <Output>
-   *   aface ::
-   *     A new @FT_Face handle.
-   *
-   * <Return>
-   *   FreeType error code.  0~means success.
-   *
-   * <Note>
-   *   The third parameter `req_data' is the same as the one passed by the
-   *   client when @FTC_Manager_New is called.
-   *
-   *   The face requester should not perform funny things on the returned
-   *   face object, like creating a new @FT_Size for it, or setting a
-   *   transformation through @FT_Set_Transform!
-   */
-  typedef FT_Error
-  (*FTC_Face_Requester)( FTC_FaceID  face_id,
-                         FT_Library  library,
-                         FT_Pointer  req_data,
-                         FT_Face*    aface );
-
-  /* */
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                      CACHE MANAGER OBJECT                     *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FTC_Manager                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This object corresponds to one instance of the cache-subsystem.    */
-  /*    It is used to cache one or more @FT_Face objects, along with       */
-  /*    corresponding @FT_Size objects.                                    */
-  /*                                                                       */
-  /*    The manager intentionally limits the total number of opened        */
-  /*    @FT_Face and @FT_Size objects to control memory usage.  See the    */
-  /*    `max_faces' and `max_sizes' parameters of @FTC_Manager_New.        */
-  /*                                                                       */
-  /*    The manager is also used to cache `nodes' of various types while   */
-  /*    limiting their total memory usage.                                 */
-  /*                                                                       */
-  /*    All limitations are enforced by keeping lists of managed objects   */
-  /*    in most-recently-used order, and flushing old nodes to make room   */
-  /*    for new ones.                                                      */
-  /*                                                                       */
-  typedef struct FTC_ManagerRec_*  FTC_Manager;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FTC_Node                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    An opaque handle to a cache node object.  Each cache node is       */
-  /*    reference-counted.  A node with a count of~0 might be flushed      */
-  /*    out of a full cache whenever a lookup request is performed.        */
-  /*                                                                       */
-  /*    If you look up nodes, you have the ability to `acquire' them,      */
-  /*    i.e., to increment their reference count.  This will prevent the   */
-  /*    node from being flushed out of the cache until you explicitly      */
-  /*    `release' it (see @FTC_Node_Unref).                                */
-  /*                                                                       */
-  /*    See also @FTC_SBitCache_Lookup and @FTC_ImageCache_Lookup.         */
-  /*                                                                       */
-  typedef struct FTC_NodeRec_*  FTC_Node;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Manager_New                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new cache manager.                                        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    library   :: The parent FreeType library handle to use.            */
-  /*                                                                       */
-  /*    max_faces :: Maximum number of opened @FT_Face objects managed by  */
-  /*                 this cache instance.  Use~0 for defaults.             */
-  /*                                                                       */
-  /*    max_sizes :: Maximum number of opened @FT_Size objects managed by  */
-  /*                 this cache instance.  Use~0 for defaults.             */
-  /*                                                                       */
-  /*    max_bytes :: Maximum number of bytes to use for cached data nodes. */
-  /*                 Use~0 for defaults.  Note that this value does not    */
-  /*                 account for managed @FT_Face and @FT_Size objects.    */
-  /*                                                                       */
-  /*    requester :: An application-provided callback used to translate    */
-  /*                 face IDs into real @FT_Face objects.                  */
-  /*                                                                       */
-  /*    req_data  :: A generic pointer that is passed to the requester     */
-  /*                 each time it is called (see @FTC_Face_Requester).     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    amanager  :: A handle to a new manager object.  0~in case of       */
-  /*                 failure.                                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_Manager_New( FT_Library          library,
-                   FT_UInt             max_faces,
-                   FT_UInt             max_sizes,
-                   FT_ULong            max_bytes,
-                   FTC_Face_Requester  requester,
-                   FT_Pointer          req_data,
-                   FTC_Manager        *amanager );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Manager_Reset                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Empty a given cache manager.  This simply gets rid of all the      */
-  /*    currently cached @FT_Face and @FT_Size objects within the manager. */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    manager :: A handle to the manager.                                */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FTC_Manager_Reset( FTC_Manager  manager );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Manager_Done                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Destroy a given manager after emptying it.                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    manager :: A handle to the target cache manager object.            */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FTC_Manager_Done( FTC_Manager  manager );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Manager_LookupFace                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the @FT_Face object that corresponds to a given face ID   */
-  /*    through a cache manager.                                           */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    manager :: A handle to the cache manager.                          */
-  /*                                                                       */
-  /*    face_id :: The ID of the face object.                              */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aface   :: A handle to the face object.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The returned @FT_Face object is always owned by the manager.  You  */
-  /*    should never try to discard it yourself.                           */
-  /*                                                                       */
-  /*    The @FT_Face object doesn't necessarily have a current size object */
-  /*    (i.e., face->size can be~0).  If you need a specific `font size',  */
-  /*    use @FTC_Manager_LookupSize instead.                               */
-  /*                                                                       */
-  /*    Never change the face's transformation matrix (i.e., never call    */
-  /*    the @FT_Set_Transform function) on a returned face!  If you need   */
-  /*    to transform glyphs, do it yourself after glyph loading.           */
-  /*                                                                       */
-  /*    When you perform a lookup, out-of-memory errors are detected       */
-  /*    _within_ the lookup and force incremental flushes of the cache     */
-  /*    until enough memory is released for the lookup to succeed.         */
-  /*                                                                       */
-  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
-  /*    already been completely flushed, and still no memory was available */
-  /*    for the operation.                                                 */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_Manager_LookupFace( FTC_Manager  manager,
-                          FTC_FaceID   face_id,
-                          FT_Face     *aface );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FTC_ScalerRec                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A structure used to describe a given character size in either      */
-  /*    pixels or points to the cache manager.  See                        */
-  /*    @FTC_Manager_LookupSize.                                           */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    face_id :: The source face ID.                                     */
-  /*                                                                       */
-  /*    width   :: The character width.                                    */
-  /*                                                                       */
-  /*    height  :: The character height.                                   */
-  /*                                                                       */
-  /*    pixel   :: A Boolean.  If 1, the `width' and `height' fields are   */
-  /*               interpreted as integer pixel character sizes.           */
-  /*               Otherwise, they are expressed as 1/64th of points.      */
-  /*                                                                       */
-  /*    x_res   :: Only used when `pixel' is value~0 to indicate the       */
-  /*               horizontal resolution in dpi.                           */
-  /*                                                                       */
-  /*    y_res   :: Only used when `pixel' is value~0 to indicate the       */
-  /*               vertical resolution in dpi.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    This type is mainly used to retrieve @FT_Size objects through the  */
-  /*    cache manager.                                                     */
-  /*                                                                       */
-  typedef struct  FTC_ScalerRec_
-  {
-    FTC_FaceID  face_id;
-    FT_UInt     width;
-    FT_UInt     height;
-    FT_Int      pixel;
-    FT_UInt     x_res;
-    FT_UInt     y_res;
-
-  } FTC_ScalerRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FTC_Scaler                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an @FTC_ScalerRec structure.                           */
-  /*                                                                       */
-  typedef struct FTC_ScalerRec_*  FTC_Scaler;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Manager_LookupSize                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve the @FT_Size object that corresponds to a given           */
-  /*    @FTC_ScalerRec pointer through a cache manager.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    manager :: A handle to the cache manager.                          */
-  /*                                                                       */
-  /*    scaler  :: A scaler handle.                                        */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    asize   :: A handle to the size object.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The returned @FT_Size object is always owned by the manager.  You  */
-  /*    should never try to discard it by yourself.                        */
-  /*                                                                       */
-  /*    You can access the parent @FT_Face object simply as `size->face'   */
-  /*    if you need it.  Note that this object is also owned by the        */
-  /*    manager.                                                           */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    When you perform a lookup, out-of-memory errors are detected       */
-  /*    _within_ the lookup and force incremental flushes of the cache     */
-  /*    until enough memory is released for the lookup to succeed.         */
-  /*                                                                       */
-  /*    If a lookup fails with `FT_Err_Out_Of_Memory' the cache has        */
-  /*    already been completely flushed, and still no memory is available  */
-  /*    for the operation.                                                 */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_Manager_LookupSize( FTC_Manager  manager,
-                          FTC_Scaler   scaler,
-                          FT_Size     *asize );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_Node_Unref                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Decrement a cache node's internal reference count.  When the count */
-  /*    reaches 0, it is not destroyed but becomes eligible for subsequent */
-  /*    cache flushes.                                                     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    node    :: The cache node handle.                                  */
-  /*                                                                       */
-  /*    manager :: The cache manager handle.                               */
-  /*                                                                       */
-  FT_EXPORT( void )
-  FTC_Node_Unref( FTC_Node     node,
-                  FTC_Manager  manager );
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FTC_Manager_RemoveFaceID
-   *
-   * @description:
-   *   A special function used to indicate to the cache manager that
-   *   a given @FTC_FaceID is no longer valid, either because its
-   *   content changed, or because it was deallocated or uninstalled.
-   *
-   * @input:
-   *   manager ::
-   *     The cache manager handle.
-   *
-   *   face_id ::
-   *     The @FTC_FaceID to be removed.
-   *
-   * @note:
-   *   This function flushes all nodes from the cache corresponding to this
-   *   `face_id', with the exception of nodes with a non-null reference
-   *   count.
-   *
-   *   Such nodes are however modified internally so as to never appear
-   *   in later lookups with the same `face_id' value, and to be immediately
-   *   destroyed when released by all their users.
-   *
-   */
-  FT_EXPORT( void )
-  FTC_Manager_RemoveFaceID( FTC_Manager  manager,
-                            FTC_FaceID   face_id );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************
-   *
-   * @type:
-   *   FTC_CMapCache
-   *
-   * @description:
-   *   An opaque handle used to model a charmap cache.  This cache is to
-   *   hold character codes -> glyph indices mappings.
-   *
-   */
-  typedef struct FTC_CMapCacheRec_*  FTC_CMapCache;
-
-
-  /*************************************************************************
-   *
-   * @function:
-   *   FTC_CMapCache_New
-   *
-   * @description:
-   *   Create a new charmap cache.
-   *
-   * @input:
-   *   manager ::
-   *     A handle to the cache manager.
-   *
-   * @output:
-   *   acache ::
-   *     A new cache handle.  NULL in case of error.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   Like all other caches, this one will be destroyed with the cache
-   *   manager.
-   *
-   */
-  FT_EXPORT( FT_Error )
-  FTC_CMapCache_New( FTC_Manager     manager,
-                     FTC_CMapCache  *acache );
-
-
-  /************************************************************************
-   *
-   * @function:
-   *   FTC_CMapCache_Lookup
-   *
-   * @description:
-   *   Translate a character code into a glyph index, using the charmap
-   *   cache.
-   *
-   * @input:
-   *   cache ::
-   *     A charmap cache handle.
-   *
-   *   face_id ::
-   *     The source face ID.
-   *
-   *   cmap_index ::
-   *     The index of the charmap in the source face.  Any negative value
-   *     means to use the cache @FT_Face's default charmap.
-   *
-   *   char_code ::
-   *     The character code (in the corresponding charmap).
-   *
-   * @return:
-   *    Glyph index.  0~means `no glyph'.
-   *
-   */
-  FT_EXPORT( FT_UInt )
-  FTC_CMapCache_Lookup( FTC_CMapCache  cache,
-                        FTC_FaceID     face_id,
-                        FT_Int         cmap_index,
-                        FT_UInt32      char_code );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    cache_subsystem                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       IMAGE CACHE OBJECT                      *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @struct:
-   *   FTC_ImageTypeRec
-   *
-   * @description:
-   *   A structure used to model the type of images in a glyph cache.
-   *
-   * @fields:
-   *   face_id ::
-   *     The face ID.
-   *
-   *   width ::
-   *     The width in pixels.
-   *
-   *   height ::
-   *     The height in pixels.
-   *
-   *   flags ::
-   *     The load flags, as in @FT_Load_Glyph.
-   *
-   */
-  typedef struct  FTC_ImageTypeRec_
-  {
-    FTC_FaceID  face_id;
-    FT_UInt     width;
-    FT_UInt     height;
-    FT_Int32    flags;
-
-  } FTC_ImageTypeRec;
-
-
-  /*************************************************************************
-   *
-   * @type:
-   *   FTC_ImageType
-   *
-   * @description:
-   *   A handle to an @FTC_ImageTypeRec structure.
-   *
-   */
-  typedef struct FTC_ImageTypeRec_*  FTC_ImageType;
-
-
-  /* */
-
-
-#define FTC_IMAGE_TYPE_COMPARE( d1, d2 )      \
-          ( (d1)->face_id == (d2)->face_id && \
-            (d1)->width   == (d2)->width   && \
-            (d1)->flags   == (d2)->flags   )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FTC_ImageCache                                                     */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a glyph image cache object.  They are designed to      */
-  /*    hold many distinct glyph images while not exceeding a certain      */
-  /*    memory threshold.                                                  */
-  /*                                                                       */
-  typedef struct FTC_ImageCacheRec_*  FTC_ImageCache;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_ImageCache_New                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new glyph image cache.                                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    manager :: The parent manager for the image cache.                 */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    acache  :: A handle to the new glyph image cache object.           */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_ImageCache_New( FTC_Manager      manager,
-                      FTC_ImageCache  *acache );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_ImageCache_Lookup                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Retrieve a given glyph image from a glyph image cache.             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    cache  :: A handle to the source glyph image cache.                */
-  /*                                                                       */
-  /*    type   :: A pointer to a glyph image type descriptor.              */
-  /*                                                                       */
-  /*    gindex :: The glyph index to retrieve.                             */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aglyph :: The corresponding @FT_Glyph object.  0~in case of        */
-  /*              failure.                                                 */
-  /*                                                                       */
-  /*    anode  :: Used to return the address of of the corresponding cache */
-  /*              node after incrementing its reference count (see note    */
-  /*              below).                                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The returned glyph is owned and managed by the glyph image cache.  */
-  /*    Never try to transform or discard it manually!  You can however    */
-  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
-  /*                                                                       */
-  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
-  /*    node containing the glyph image, after increasing its reference    */
-  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
-  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
-  /*    `release' it.                                                      */
-  /*                                                                       */
-  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
-  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
-  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
-  /*    is persistent!                                                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_ImageCache_Lookup( FTC_ImageCache  cache,
-                         FTC_ImageType   type,
-                         FT_UInt         gindex,
-                         FT_Glyph       *aglyph,
-                         FTC_Node       *anode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_ImageCache_LookupScaler                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A variant of @FTC_ImageCache_Lookup that uses an @FTC_ScalerRec    */
-  /*    to specify the face ID and its size.                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    cache      :: A handle to the source glyph image cache.            */
-  /*                                                                       */
-  /*    scaler     :: A pointer to a scaler descriptor.                    */
-  /*                                                                       */
-  /*    load_flags :: The corresponding load flags.                        */
-  /*                                                                       */
-  /*    gindex     :: The glyph index to retrieve.                         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aglyph     :: The corresponding @FT_Glyph object.  0~in case of    */
-  /*                  failure.                                             */
-  /*                                                                       */
-  /*    anode      :: Used to return the address of of the corresponding   */
-  /*                  cache node after incrementing its reference count    */
-  /*                  (see note below).                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The returned glyph is owned and managed by the glyph image cache.  */
-  /*    Never try to transform or discard it manually!  You can however    */
-  /*    create a copy with @FT_Glyph_Copy and modify the new one.          */
-  /*                                                                       */
-  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
-  /*    node containing the glyph image, after increasing its reference    */
-  /*    count.  This ensures that the node (as well as the @FT_Glyph) will */
-  /*    always be kept in the cache until you call @FTC_Node_Unref to      */
-  /*    `release' it.                                                      */
-  /*                                                                       */
-  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
-  /*    that the @FT_Glyph could be flushed out of the cache on the next   */
-  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
-  /*    is persistent!                                                     */
-  /*                                                                       */
-  /*    Calls to @FT_Set_Char_Size and friends have no effect on cached    */
-  /*    glyphs; you should always use the FreeType cache API instead.      */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_ImageCache_LookupScaler( FTC_ImageCache  cache,
-                               FTC_Scaler      scaler,
-                               FT_ULong        load_flags,
-                               FT_UInt         gindex,
-                               FT_Glyph       *aglyph,
-                               FTC_Node       *anode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FTC_SBit                                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a small bitmap descriptor.  See the @FTC_SBitRec       */
-  /*    structure for details.                                             */
-  /*                                                                       */
-  typedef struct FTC_SBitRec_*  FTC_SBit;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FTC_SBitRec                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A very compact structure used to describe a small glyph bitmap.    */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    width     :: The bitmap width in pixels.                           */
-  /*                                                                       */
-  /*    height    :: The bitmap height in pixels.                          */
-  /*                                                                       */
-  /*    left      :: The horizontal distance from the pen position to the  */
-  /*                 left bitmap border (a.k.a. `left side bearing', or    */
-  /*                 `lsb').                                               */
-  /*                                                                       */
-  /*    top       :: The vertical distance from the pen position (on the   */
-  /*                 baseline) to the upper bitmap border (a.k.a. `top     */
-  /*                 side bearing').  The distance is positive for upwards */
-  /*                 y~coordinates.                                        */
-  /*                                                                       */
-  /*    format    :: The format of the glyph bitmap (monochrome or gray).  */
-  /*                                                                       */
-  /*    max_grays :: Maximum gray level value (in the range 1 to~255).     */
-  /*                                                                       */
-  /*    pitch     :: The number of bytes per bitmap line.  May be positive */
-  /*                 or negative.                                          */
-  /*                                                                       */
-  /*    xadvance  :: The horizontal advance width in pixels.               */
-  /*                                                                       */
-  /*    yadvance  :: The vertical advance height in pixels.                */
-  /*                                                                       */
-  /*    buffer    :: A pointer to the bitmap pixels.                       */
-  /*                                                                       */
-  typedef struct  FTC_SBitRec_
-  {
-    FT_Byte   width;
-    FT_Byte   height;
-    FT_Char   left;
-    FT_Char   top;
-
-    FT_Byte   format;
-    FT_Byte   max_grays;
-    FT_Short  pitch;
-    FT_Char   xadvance;
-    FT_Char   yadvance;
-
-    FT_Byte*  buffer;
-
-  } FTC_SBitRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Type>                                                                */
-  /*    FTC_SBitCache                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to a small bitmap cache.  These are special cache objects */
-  /*    used to store small glyph bitmaps (and anti-aliased pixmaps) in a  */
-  /*    much more efficient way than the traditional glyph image cache     */
-  /*    implemented by @FTC_ImageCache.                                    */
-  /*                                                                       */
-  typedef struct FTC_SBitCacheRec_*  FTC_SBitCache;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_SBitCache_New                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new cache to store small glyph bitmaps.                   */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    manager :: A handle to the source cache manager.                   */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    acache  :: A handle to the new sbit cache.  NULL in case of error. */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_SBitCache_New( FTC_Manager     manager,
-                     FTC_SBitCache  *acache );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_SBitCache_Lookup                                               */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Look up a given small glyph bitmap in a given sbit cache and       */
-  /*    `lock' it to prevent its flushing from the cache until needed.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    cache  :: A handle to the source sbit cache.                       */
-  /*                                                                       */
-  /*    type   :: A pointer to the glyph image type descriptor.            */
-  /*                                                                       */
-  /*    gindex :: The glyph index.                                         */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    sbit   :: A handle to a small bitmap descriptor.                   */
-  /*                                                                       */
-  /*    anode  :: Used to return the address of of the corresponding cache */
-  /*              node after incrementing its reference count (see note    */
-  /*              below).                                                  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The small bitmap descriptor and its bit buffer are owned by the    */
-  /*    cache and should never be freed by the application.  They might    */
-  /*    as well disappear from memory on the next cache lookup, so don't   */
-  /*    treat them as persistent data.                                     */
-  /*                                                                       */
-  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
-  /*    glyph bitmap.                                                      */
-  /*                                                                       */
-  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
-  /*    node containing the bitmap, after increasing its reference count.  */
-  /*    This ensures that the node (as well as the image) will always be   */
-  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
-  /*                                                                       */
-  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
-  /*    that the bitmap could be flushed out of the cache on the next      */
-  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
-  /*    is persistent!                                                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_SBitCache_Lookup( FTC_SBitCache    cache,
-                        FTC_ImageType    type,
-                        FT_UInt          gindex,
-                        FTC_SBit        *sbit,
-                        FTC_Node        *anode );
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FTC_SBitCache_LookupScaler                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A variant of @FTC_SBitCache_Lookup that uses an @FTC_ScalerRec     */
-  /*    to specify the face ID and its size.                               */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    cache      :: A handle to the source sbit cache.                   */
-  /*                                                                       */
-  /*    scaler     :: A pointer to the scaler descriptor.                  */
-  /*                                                                       */
-  /*    load_flags :: The corresponding load flags.                        */
-  /*                                                                       */
-  /*    gindex     :: The glyph index.                                     */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    sbit       :: A handle to a small bitmap descriptor.               */
-  /*                                                                       */
-  /*    anode      :: Used to return the address of of the corresponding   */
-  /*                  cache node after incrementing its reference count    */
-  /*                  (see note below).                                    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    The small bitmap descriptor and its bit buffer are owned by the    */
-  /*    cache and should never be freed by the application.  They might    */
-  /*    as well disappear from memory on the next cache lookup, so don't   */
-  /*    treat them as persistent data.                                     */
-  /*                                                                       */
-  /*    The descriptor's `buffer' field is set to~0 to indicate a missing  */
-  /*    glyph bitmap.                                                      */
-  /*                                                                       */
-  /*    If `anode' is _not_ NULL, it receives the address of the cache     */
-  /*    node containing the bitmap, after increasing its reference count.  */
-  /*    This ensures that the node (as well as the image) will always be   */
-  /*    kept in the cache until you call @FTC_Node_Unref to `release' it.  */
-  /*                                                                       */
-  /*    If `anode' is NULL, the cache node is left unchanged, which means  */
-  /*    that the bitmap could be flushed out of the cache on the next      */
-  /*    call to one of the caching sub-system APIs.  Don't assume that it  */
-  /*    is persistent!                                                     */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FTC_SBitCache_LookupScaler( FTC_SBitCache  cache,
-                              FTC_Scaler     scaler,
-                              FT_ULong       load_flags,
-                              FT_UInt        gindex,
-                              FTC_SBit      *sbit,
-                              FTC_Node      *anode );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTCACHE_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftcid.h b/third_party/freetype/include/freetype/ftcid.h
deleted file mode 100644
index 05741c8..0000000
--- a/third_party/freetype/include/freetype/ftcid.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcid.h                                                                */
-/*                                                                         */
-/*    FreeType API for accessing CID font information (specification).     */
-/*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
-/*  Dereg 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 __FTCID_H__
-#define __FTCID_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>                                                             */
-  /*    cid_fonts                                                          */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    CID Fonts                                                          */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    CID-keyed font specific API.                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of CID-keyed font specific   */
-  /*    functions.                                                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Get_CID_Registry_Ordering_Supplement
-   *
-   * @description:
-   *    Retrieve the Registry/Ordering/Supplement triple (also known as the
-   *    "R/O/S") from a CID-keyed font.
-   *
-   * @input:
-   *    face ::
-   *       A handle to the input face.
-   *
-   * @output:
-   *    registry ::
-   *       The registry, as a C~string, owned by the face.
-   *
-   *    ordering ::
-   *       The ordering, as a C~string, owned by the face.
-   *
-   *    supplement ::
-   *       The supplement.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *    This function only works with CID faces, returning an error
-   *    otherwise.
-   *
-   * @since:
-   *    2.3.6
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
-                                           const char*  *registry,
-                                           const char*  *ordering,
-                                           FT_Int       *supplement);
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Get_CID_Is_Internally_CID_Keyed
-   *
-   * @description:
-   *    Retrieve the type of the input face, CID keyed or not.  In
-   *    constrast to the @FT_IS_CID_KEYED macro this function returns
-   *    successfully also for CID-keyed fonts in an SNFT wrapper.
-   *
-   * @input:
-   *    face ::
-   *       A handle to the input face.
-   *
-   * @output:
-   *    is_cid ::
-   *       The type of the face as an @FT_Bool.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *    This function only works with CID faces and OpenType fonts,
-   *    returning an error otherwise.
-   *
-   * @since:
-   *    2.3.9
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
-                                      FT_Bool  *is_cid );
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Get_CID_From_Glyph_Index
-   *
-   * @description:
-   *    Retrieve the CID of the input glyph index.
-   *
-   * @input:
-   *    face ::
-   *       A handle to the input face.
-   *
-   *    glyph_index ::
-   *       The input glyph index.
-   *
-   * @output:
-   *    cid ::
-   *       The CID as an @FT_UInt.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *    This function only works with CID faces and OpenType fonts,
-   *    returning an error otherwise.
-   *
-   * @since:
-   *    2.3.9
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_CID_From_Glyph_Index( FT_Face   face,
-                               FT_UInt   glyph_index,
-                               FT_UInt  *cid );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTCID_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftgasp.h b/third_party/freetype/include/freetype/ftgasp.h
deleted file mode 100644
index 9a9b632..0000000
--- a/third_party/freetype/include/freetype/ftgasp.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgasp.h                                                               */
-/*                                                                         */
-/*    Access of TrueType's `gasp' table (specification).                   */
-/*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef _FT_GASP_H_
-#define _FT_GASP_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
-
-
-  /***************************************************************************
-   *
-   * @section:
-   *   gasp_table
-   *
-   * @title:
-   *   Gasp Table
-   *
-   * @abstract:
-   *   Retrieving TrueType `gasp' table entries.
-   *
-   * @description:
-   *   The function @FT_Get_Gasp can be used to query a TrueType or OpenType
-   *   font for specific entries in its `gasp' table, if any.  This is
-   *   mainly useful when implementing native TrueType hinting with the
-   *   bytecode interpreter to duplicate the Windows text rendering results.
-   */
-
-  /*************************************************************************
-   *
-   * @enum:
-   *   FT_GASP_XXX
-   *
-   * @description:
-   *   A list of values and/or bit-flags returned by the @FT_Get_Gasp
-   *   function.
-   *
-   * @values:
-   *   FT_GASP_NO_TABLE ::
-   *     This special value means that there is no GASP table in this face.
-   *     It is up to the client to decide what to do.
-   *
-   *   FT_GASP_DO_GRIDFIT ::
-   *     Grid-fitting and hinting should be performed at the specified ppem.
-   *     This *really* means TrueType bytecode interpretation.  If this bit
-   *     is not set, no hinting gets applied.
-   *
-   *   FT_GASP_DO_GRAY ::
-   *     Anti-aliased rendering should be performed at the specified ppem.
-   *     If not set, do monochrome rendering.
-   *
-   *   FT_GASP_SYMMETRIC_SMOOTHING ::
-   *     If set, smoothing along multiple axes must be used with ClearType.
-   *
-   *   FT_GASP_SYMMETRIC_GRIDFIT ::
-   *     Grid-fitting must be used with ClearType's symmetric smoothing.
-   *
-   * @note:
-   *   The bit-flags `FT_GASP_DO_GRIDFIT' and `FT_GASP_DO_GRAY' are to be
-   *   used for standard font rasterization only.  Independently of that,
-   *   `FT_GASP_SYMMETRIC_SMOOTHING' and `FT_GASP_SYMMETRIC_GRIDFIT' are to
-   *   be used if ClearType is enabled (and `FT_GASP_DO_GRIDFIT' and
-   *   `FT_GASP_DO_GRAY' are consequently ignored).
-   *
-   *   `ClearType' is Microsoft's implementation of LCD rendering, partly
-   *   protected by patents.
-   *
-   * @since:
-   *   2.3.0
-   */
-#define FT_GASP_NO_TABLE               -1
-#define FT_GASP_DO_GRIDFIT           0x01
-#define FT_GASP_DO_GRAY              0x02
-#define FT_GASP_SYMMETRIC_SMOOTHING  0x08
-#define FT_GASP_SYMMETRIC_GRIDFIT    0x10
-
-
-  /*************************************************************************
-   *
-   * @func:
-   *   FT_Get_Gasp
-   *
-   * @description:
-   *   Read the `gasp' table from a TrueType or OpenType font file and
-   *   return the entry corresponding to a given character pixel size.
-   *
-   * @input:
-   *   face :: The source face handle.
-   *   ppem :: The vertical character pixel size.
-   *
-   * @return:
-   *   Bit flags (see @FT_GASP_XXX), or @FT_GASP_NO_TABLE if there is no
-   *   `gasp' table in the face.
-   *
-   * @since:
-   *   2.3.0
-   */
-  FT_EXPORT( FT_Int )
-  FT_Get_Gasp( FT_Face  face,
-               FT_UInt  ppem );
-
-  /* */
-
-
-#endif /* _FT_GASP_H_ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftgxval.h b/third_party/freetype/include/freetype/ftgxval.h
deleted file mode 100644
index 0e9ac1d..0000000
--- a/third_party/freetype/include/freetype/ftgxval.h
+++ /dev/null
@@ -1,357 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgxval.h                                                              */
-/*                                                                         */
-/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
-/*                                                                         */
-/*  Copyright 2004-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/*                                                                         */
-/* gxvalid is derived from both gxlayout module and otvalid module.        */
-/* Development of gxlayout is supported by the Information-technology      */
-/* Promotion Agency(IPA), Japan.                                           */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTGXVAL_H__
-#define __FTGXVAL_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>                                                             */
-  /*    gx_validation                                                      */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    TrueTypeGX/AAT Validation                                          */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    An API to validate TrueTypeGX/AAT tables.                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of functions to validate     */
-  /*    some TrueTypeGX tables (feat, mort, morx, bsln, just, kern, opbd,  */
-  /*    trak, prop, lcar).                                                 */
-  /*                                                                       */
-  /* <Order>                                                               */
-  /*    FT_TrueTypeGX_Validate                                             */
-  /*    FT_TrueTypeGX_Free                                                 */
-  /*                                                                       */
-  /*    FT_ClassicKern_Validate                                            */
-  /*    FT_ClassicKern_Free                                                */
-  /*                                                                       */
-  /*    FT_VALIDATE_GX_LENGTH                                              */
-  /*    FT_VALIDATE_GXXXX                                                  */
-  /*    FT_VALIDATE_CKERNXXX                                               */
-  /*                                                                       */
-  /*************************************************************************/
-
-  /*************************************************************************/
-  /*                                                                       */
-  /*                                                                       */
-  /* Warning: Use FT_VALIDATE_XXX to validate a table.                     */
-  /*          Following definitions are for gxvalid developers.            */
-  /*                                                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-#define FT_VALIDATE_feat_INDEX     0
-#define FT_VALIDATE_mort_INDEX     1
-#define FT_VALIDATE_morx_INDEX     2
-#define FT_VALIDATE_bsln_INDEX     3
-#define FT_VALIDATE_just_INDEX     4
-#define FT_VALIDATE_kern_INDEX     5
-#define FT_VALIDATE_opbd_INDEX     6
-#define FT_VALIDATE_trak_INDEX     7
-#define FT_VALIDATE_prop_INDEX     8
-#define FT_VALIDATE_lcar_INDEX     9
-#define FT_VALIDATE_GX_LAST_INDEX  FT_VALIDATE_lcar_INDEX
-
-
-  /*************************************************************************
-   *
-   * @macro:
-   *   FT_VALIDATE_GX_LENGTH
-   *
-   * @description:
-   *   The number of tables checked in this module.  Use it as a parameter
-   *   for the `table-length' argument of function @FT_TrueTypeGX_Validate.
-   */
-#define FT_VALIDATE_GX_LENGTH     (FT_VALIDATE_GX_LAST_INDEX + 1)
-
-  /* */
-
-  /* Up to 0x1000 is used by otvalid.
-     Ox2xxx is reserved for feature OT extension. */
-#define FT_VALIDATE_GX_START 0x4000
-#define FT_VALIDATE_GX_BITFIELD( tag )                  \
-  ( FT_VALIDATE_GX_START << FT_VALIDATE_##tag##_INDEX )
-
-
- /**********************************************************************
-  *
-  * @enum:
-  *    FT_VALIDATE_GXXXX
-  *
-  * @description:
-  *    A list of bit-field constants used with @FT_TrueTypeGX_Validate to
-  *    indicate which TrueTypeGX/AAT Type tables should be validated.
-  *
-  * @values:
-  *    FT_VALIDATE_feat ::
-  *      Validate `feat' table.
-  *
-  *    FT_VALIDATE_mort ::
-  *      Validate `mort' table.
-  *
-  *    FT_VALIDATE_morx ::
-  *      Validate `morx' table.
-  *
-  *    FT_VALIDATE_bsln ::
-  *      Validate `bsln' table.
-  *
-  *    FT_VALIDATE_just ::
-  *      Validate `just' table.
-  *
-  *    FT_VALIDATE_kern ::
-  *      Validate `kern' table.
-  *
-  *    FT_VALIDATE_opbd ::
-  *      Validate `opbd' table.
-  *
-  *    FT_VALIDATE_trak ::
-  *      Validate `trak' table.
-  *
-  *    FT_VALIDATE_prop ::
-  *      Validate `prop' table.
-  *
-  *    FT_VALIDATE_lcar ::
-  *      Validate `lcar' table.
-  *
-  *    FT_VALIDATE_GX ::
-  *      Validate all TrueTypeGX tables (feat, mort, morx, bsln, just, kern,
-  *      opbd, trak, prop and lcar).
-  *
-  */
-
-#define FT_VALIDATE_feat  FT_VALIDATE_GX_BITFIELD( feat )
-#define FT_VALIDATE_mort  FT_VALIDATE_GX_BITFIELD( mort )
-#define FT_VALIDATE_morx  FT_VALIDATE_GX_BITFIELD( morx )
-#define FT_VALIDATE_bsln  FT_VALIDATE_GX_BITFIELD( bsln )
-#define FT_VALIDATE_just  FT_VALIDATE_GX_BITFIELD( just )
-#define FT_VALIDATE_kern  FT_VALIDATE_GX_BITFIELD( kern )
-#define FT_VALIDATE_opbd  FT_VALIDATE_GX_BITFIELD( opbd )
-#define FT_VALIDATE_trak  FT_VALIDATE_GX_BITFIELD( trak )
-#define FT_VALIDATE_prop  FT_VALIDATE_GX_BITFIELD( prop )
-#define FT_VALIDATE_lcar  FT_VALIDATE_GX_BITFIELD( lcar )
-
-#define FT_VALIDATE_GX  ( FT_VALIDATE_feat | \
-                          FT_VALIDATE_mort | \
-                          FT_VALIDATE_morx | \
-                          FT_VALIDATE_bsln | \
-                          FT_VALIDATE_just | \
-                          FT_VALIDATE_kern | \
-                          FT_VALIDATE_opbd | \
-                          FT_VALIDATE_trak | \
-                          FT_VALIDATE_prop | \
-                          FT_VALIDATE_lcar )
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_TrueTypeGX_Validate
-  *
-  * @description:
-  *    Validate various TrueTypeGX 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_GXXXX for possible values.
-  *
-  *    table_length ::
-  *       The size of the `tables' array.  Normally, @FT_VALIDATE_GX_LENGTH
-  *       should be passed.
-  *
-  * @output:
-  *    tables ::
-  *       The array where all validated sfnt tables are stored.
-  *       The array itself must be allocated by a client.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   This function only works with TrueTypeGX fonts, returning an error
-  *   otherwise.
-  *
-  *   After use, the application should deallocate the buffers pointed to by
-  *   each `tables' element, by calling @FT_TrueTypeGX_Free.  A NULL value
-  *   indicates that the table either doesn't exist in the font, the
-  *   application hasn't asked for validation, or the validator doesn't have
-  *   the ability to validate the sfnt table.
-  */
-  FT_EXPORT( FT_Error )
-  FT_TrueTypeGX_Validate( FT_Face   face,
-                          FT_UInt   validation_flags,
-                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
-                          FT_UInt   table_length );
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_TrueTypeGX_Free
-  *
-  * @description:
-  *    Free the buffer allocated by TrueTypeGX validator.
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  *    table ::
-  *       The pointer to the buffer allocated by
-  *       @FT_TrueTypeGX_Validate.
-  *
-  * @note:
-  *   This function must be used to free the buffer allocated by
-  *   @FT_TrueTypeGX_Validate only.
-  */
-  FT_EXPORT( void )
-  FT_TrueTypeGX_Free( FT_Face   face,
-                      FT_Bytes  table );
-
-
- /**********************************************************************
-  *
-  * @enum:
-  *    FT_VALIDATE_CKERNXXX
-  *
-  * @description:
-  *    A list of bit-field constants used with @FT_ClassicKern_Validate
-  *    to indicate the classic kern dialect or dialects.  If the selected
-  *    type doesn't fit, @FT_ClassicKern_Validate regards the table as
-  *    invalid.
-  *
-  * @values:
-  *    FT_VALIDATE_MS ::
-  *      Handle the `kern' table as a classic Microsoft kern table.
-  *
-  *    FT_VALIDATE_APPLE ::
-  *      Handle the `kern' table as a classic Apple kern table.
-  *
-  *    FT_VALIDATE_CKERN ::
-  *      Handle the `kern' as either classic Apple or Microsoft kern table.
-  */
-#define FT_VALIDATE_MS     ( FT_VALIDATE_GX_START << 0 )
-#define FT_VALIDATE_APPLE  ( FT_VALIDATE_GX_START << 1 )
-
-#define FT_VALIDATE_CKERN  ( FT_VALIDATE_MS | FT_VALIDATE_APPLE )
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_ClassicKern_Validate
-  *
-  * @description:
-  *    Validate classic (16-bit format) kern table to assure that the 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).
-  *
-  *    The `kern' table validator in @FT_TrueTypeGX_Validate deals with both
-  *    the new 32-bit format and the classic 16-bit format, while
-  *    FT_ClassicKern_Validate only supports the classic 16-bit format.
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  *    validation_flags ::
-  *       A bit field that specifies the dialect to be validated.  See
-  *       @FT_VALIDATE_CKERNXXX for possible values.
-  *
-  * @output:
-  *    ckern_table ::
-  *       A pointer to the kern table.
-  *
-  * @return:
-  *   FreeType error code.  0~means success.
-  *
-  * @note:
-  *   After use, the application should deallocate the buffers pointed to by
-  *   `ckern_table', by calling @FT_ClassicKern_Free.  A NULL value
-  *   indicates that the table doesn't exist in the font.
-  */
-  FT_EXPORT( FT_Error )
-  FT_ClassicKern_Validate( FT_Face    face,
-                           FT_UInt    validation_flags,
-                           FT_Bytes  *ckern_table );
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_ClassicKern_Free
-  *
-  * @description:
-  *    Free the buffer allocated by classic Kern validator.
-  *
-  * @input:
-  *    face ::
-  *       A handle to the input face.
-  *
-  *    table ::
-  *       The pointer to the buffer that is allocated by
-  *       @FT_ClassicKern_Validate.
-  *
-  * @note:
-  *   This function must be used to free the buffer allocated by
-  *   @FT_ClassicKern_Validate only.
-  */
-  FT_EXPORT( void )
-  FT_ClassicKern_Free( FT_Face   face,
-                       FT_Bytes  table );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTGXVAL_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftlzw.h b/third_party/freetype/include/freetype/ftlzw.h
deleted file mode 100644
index d3ec28e..0000000
--- a/third_party/freetype/include/freetype/ftlzw.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftlzw.h                                                                */
-/*                                                                         */
-/*    LZW-compressed stream support.                                       */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTLZW_H__
-#define __FTLZW_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>                                                             */
-  /*    lzw                                                                */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    LZW Streams                                                        */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Using LZW-compressed font files.                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of LZW-specific functions.   */
-  /*                                                                       */
-  /*************************************************************************/
-
- /************************************************************************
-  *
-  * @function:
-  *   FT_Stream_OpenLZW
-  *
-  * @description:
-  *   Open a new stream to parse LZW-compressed font files.  This is
-  *   mainly used to support the compressed `*.pcf.Z' 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, LZW 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 LZW 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 LZW support.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Stream_OpenLZW( FT_Stream  stream,
-                     FT_Stream  source );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTLZW_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftmac.h b/third_party/freetype/include/freetype/ftmac.h
deleted file mode 100644
index 14c55cf..0000000
--- a/third_party/freetype/include/freetype/ftmac.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmac.h                                                                */
-/*                                                                         */
-/*    Additional Mac-specific API.                                         */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  Just van Rossum, 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: Include this file after FT_FREETYPE_H and after any               */
-/*       Mac-specific headers (because this header uses Mac types such as  */
-/*       Handle, FSSpec, FSRef, etc.)                                      */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTMAC_H__
-#define __FTMAC_H__
-
-
-#include <ft2build.h>
-
-
-FT_BEGIN_HEADER
-
-
-/* gcc-3.4.1 and later can warn about functions tagged as deprecated */
-#ifndef FT_DEPRECATED_ATTRIBUTE
-#if defined(__GNUC__)                                               && \
-    ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
-#define FT_DEPRECATED_ATTRIBUTE  __attribute__((deprecated))
-#else
-#define FT_DEPRECATED_ATTRIBUTE
-#endif
-#endif
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Section>                                                             */
-  /*    mac_specific                                                       */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Mac Specific Interface                                             */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Only available on the Macintosh.                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    The following definitions are only available if FreeType is        */
-  /*    compiled on a Macintosh.                                           */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face_From_FOND                                              */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new face object from a FOND resource.                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    fond       :: A FOND resource.                                     */
-  /*                                                                       */
-  /*    face_index :: Only supported for the -1 `sanity check' special     */
-  /*                  case.                                                */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    aface      :: A handle to a new face object.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Notes>                                                               */
-  /*    This function can be used to create @FT_Face objects from fonts    */
-  /*    that are installed in the system as follows.                       */
-  /*                                                                       */
-  /*    {                                                                  */
-  /*      fond = GetResource( 'FOND', fontName );                          */
-  /*      error = FT_New_Face_From_FOND( library, fond, 0, &face );        */
-  /*    }                                                                  */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Face_From_FOND( FT_Library  library,
-                         Handle      fond,
-                         FT_Long     face_index,
-                         FT_Face    *aface )
-                       FT_DEPRECATED_ATTRIBUTE;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_GetFile_From_Mac_Name                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return an FSSpec for the disk file containing the named font.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    fontName   :: Mac OS name of the font (e.g., Times New Roman       */
-  /*                  Bold).                                               */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    pathSpec   :: FSSpec to the file.  For passing to                  */
-  /*                  @FT_New_Face_From_FSSpec.                            */
-  /*                                                                       */
-  /*    face_index :: Index of the face.  For passing to                   */
-  /*                  @FT_New_Face_From_FSSpec.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_GetFile_From_Mac_Name( const char*  fontName,
-                            FSSpec*      pathSpec,
-                            FT_Long*     face_index )
-                          FT_DEPRECATED_ATTRIBUTE;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_GetFile_From_Mac_ATS_Name                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return an FSSpec for the disk file containing the named font.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    fontName   :: Mac OS name of the font in ATS framework.            */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    pathSpec   :: FSSpec to the file. For passing to                   */
-  /*                  @FT_New_Face_From_FSSpec.                            */
-  /*                                                                       */
-  /*    face_index :: Index of the face. For passing to                    */
-  /*                  @FT_New_Face_From_FSSpec.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
-                                FSSpec*      pathSpec,
-                                FT_Long*     face_index )
-                              FT_DEPRECATED_ATTRIBUTE;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_GetFilePath_From_Mac_ATS_Name                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Return a pathname of the disk file and face index for given font   */
-  /*    name that is handled by ATS framework.                             */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    fontName    :: Mac OS name of the font in ATS framework.           */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    path        :: Buffer to store pathname of the file.  For passing  */
-  /*                   to @FT_New_Face.  The client must allocate this     */
-  /*                   buffer before calling this function.                */
-  /*                                                                       */
-  /*    maxPathSize :: Lengths of the buffer `path' that client allocated. */
-  /*                                                                       */
-  /*    face_index  :: Index of the face.  For passing to @FT_New_Face.    */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
-                                    UInt8*       path,
-                                    UInt32       maxPathSize,
-                                    FT_Long*     face_index )
-                                  FT_DEPRECATED_ATTRIBUTE;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face_From_FSSpec                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new face object from a given resource and typeface index  */
-  /*    using an FSSpec to the font file.                                  */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    spec       :: FSSpec to the font file.                             */
-  /*                                                                       */
-  /*    face_index :: The index of the face within the resource.  The      */
-  /*                  first face has index~0.                              */
-  /* <Output>                                                              */
-  /*    aface      :: A handle to a new face object.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    @FT_New_Face_From_FSSpec is identical to @FT_New_Face except       */
-  /*    it accepts an FSSpec instead of a path.                            */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Face_From_FSSpec( FT_Library     library,
-                           const FSSpec  *spec,
-                           FT_Long        face_index,
-                           FT_Face       *aface )
-                         FT_DEPRECATED_ATTRIBUTE;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face_From_FSRef                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Create a new face object from a given resource and typeface index  */
-  /*    using an FSRef to the font file.                                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    library    :: A handle to the library resource.                    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    spec       :: FSRef to the font file.                              */
-  /*                                                                       */
-  /*    face_index :: The index of the face within the resource.  The      */
-  /*                  first face has index~0.                              */
-  /* <Output>                                                              */
-  /*    aface      :: A handle to a new face object.                       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0~means success.                             */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    @FT_New_Face_From_FSRef is identical to @FT_New_Face except        */
-  /*    it accepts an FSRef instead of a path.                             */
-  /*                                                                       */
-  FT_EXPORT( FT_Error )
-  FT_New_Face_From_FSRef( FT_Library    library,
-                          const FSRef  *ref,
-                          FT_Long       face_index,
-                          FT_Face      *aface )
-                        FT_DEPRECATED_ATTRIBUTE;
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __FTMAC_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftpfr.h b/third_party/freetype/include/freetype/ftpfr.h
deleted file mode 100644
index a1c02a2..0000000
--- a/third_party/freetype/include/freetype/ftpfr.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpfr.h                                                                */
-/*                                                                         */
-/*    FreeType API for accessing PFR-specific data (specification only).   */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTPFR_H__
-#define __FTPFR_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>                                                             */
-  /*    pfr_fonts                                                          */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    PFR Fonts                                                          */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    PFR/TrueDoc specific API.                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of PFR-specific functions.   */
-  /*                                                                       */
-  /*************************************************************************/
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_Get_PFR_Metrics
-  *
-  * @description:
-  *    Return the outline and metrics resolutions of a given PFR face.
-  *
-  * @input:
-  *    face :: Handle to the input face.  It can be a non-PFR face.
-  *
-  * @output:
-  *    aoutline_resolution ::
-  *      Outline resolution.  This is equivalent to `face->units_per_EM'
-  *      for non-PFR fonts.  Optional (parameter can be NULL).
-  *
-  *    ametrics_resolution ::
-  *      Metrics resolution.  This is equivalent to `outline_resolution'
-  *      for non-PFR fonts.  Optional (parameter can be NULL).
-  *
-  *    ametrics_x_scale ::
-  *      A 16.16 fixed-point number used to scale distance expressed
-  *      in metrics units to device sub-pixels.  This is equivalent to
-  *      `face->size->x_scale', but for metrics only.  Optional (parameter
-  *      can be NULL).
-  *
-  *    ametrics_y_scale ::
-  *      Same as `ametrics_x_scale' but for the vertical direction.
-  *      optional (parameter can be NULL).
-  *
-  * @return:
-  *    FreeType error code.  0~means success.
-  *
-  * @note:
-  *   If the input face is not a PFR, this function will return an error.
-  *   However, in all cases, it will return valid values.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Get_PFR_Metrics( FT_Face    face,
-                      FT_UInt   *aoutline_resolution,
-                      FT_UInt   *ametrics_resolution,
-                      FT_Fixed  *ametrics_x_scale,
-                      FT_Fixed  *ametrics_y_scale );
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_Get_PFR_Kerning
-  *
-  * @description:
-  *    Return the kerning pair corresponding to two glyphs in a PFR face.
-  *    The distance is expressed in metrics units, unlike the result of
-  *    @FT_Get_Kerning.
-  *
-  * @input:
-  *    face  :: A handle to the input face.
-  *
-  *    left  :: Index of the left glyph.
-  *
-  *    right :: Index of the right glyph.
-  *
-  * @output:
-  *    avector :: A kerning vector.
-  *
-  * @return:
-  *    FreeType error code.  0~means success.
-  *
-  * @note:
-  *    This function always return distances in original PFR metrics
-  *    units.  This is unlike @FT_Get_Kerning with the @FT_KERNING_UNSCALED
-  *    mode, which always returns distances converted to outline units.
-  *
-  *    You can use the value of the `x_scale' and `y_scale' parameters
-  *    returned by @FT_Get_PFR_Metrics to scale these to device sub-pixels.
-  */
-  FT_EXPORT( FT_Error )
-  FT_Get_PFR_Kerning( FT_Face     face,
-                      FT_UInt     left,
-                      FT_UInt     right,
-                      FT_Vector  *avector );
-
-
- /**********************************************************************
-  *
-  * @function:
-  *    FT_Get_PFR_Advance
-  *
-  * @description:
-  *    Return a given glyph advance, expressed in original metrics units,
-  *    from a PFR font.
-  *
-  * @input:
-  *    face   :: A handle to the input face.
-  *
-  *    gindex :: The glyph index.
-  *
-  * @output:
-  *    aadvance :: The glyph advance in metrics units.
-  *
-  * @return:
-  *    FreeType error code.  0~means success.
-  *
-  * @note:
-  *    You can use the `x_scale' or `y_scale' results of @FT_Get_PFR_Metrics
-  *    to convert the advance to device sub-pixels (i.e., 1/64th of pixels).
-  */
-  FT_EXPORT( FT_Error )
-  FT_Get_PFR_Advance( FT_Face   face,
-                      FT_UInt   gindex,
-                      FT_Pos   *aadvance );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTPFR_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ftstroke.h b/third_party/freetype/include/freetype/ftstroke.h
deleted file mode 100644
index 7ebb1e7..0000000
--- a/third_party/freetype/include/freetype/ftstroke.h
+++ /dev/null
@@ -1,785 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftstroke.h                                                             */
-/*                                                                         */
-/*    FreeType path stroker (specification).                               */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FT_STROKE_H__
-#define __FT_STROKE_H__
-
-#include <ft2build.h>
-#include FT_OUTLINE_H
-#include FT_GLYPH_H
-
-
-FT_BEGIN_HEADER
-
-
- /************************************************************************
-  *
-  * @section:
-  *    glyph_stroker
-  *
-  * @title:
-  *    Glyph Stroker
-  *
-  * @abstract:
-  *    Generating bordered and stroked glyphs.
-  *
-  * @description:
-  *    This component generates stroked outlines of a given vectorial
-  *    glyph.  It also allows you to retrieve the `outside' and/or the
-  *    `inside' borders of the stroke.
-  *
-  *    This can be useful to generate `bordered' glyph, i.e., glyphs
-  *    displayed with a coloured (and anti-aliased) border around their
-  *    shape.
-  *
-  * @order:
-  *    FT_Stroker
-  *
-  *    FT_Stroker_LineJoin
-  *    FT_Stroker_LineCap
-  *    FT_StrokerBorder
-  *
-  *    FT_Outline_GetInsideBorder
-  *    FT_Outline_GetOutsideBorder
-  *
-  *    FT_Glyph_Stroke
-  *    FT_Glyph_StrokeBorder
-  *
-  *    FT_Stroker_New
-  *    FT_Stroker_Set
-  *    FT_Stroker_Rewind
-  *    FT_Stroker_ParseOutline
-  *    FT_Stroker_Done
-  *
-  *    FT_Stroker_BeginSubPath
-  *    FT_Stroker_EndSubPath
-  *
-  *    FT_Stroker_LineTo
-  *    FT_Stroker_ConicTo
-  *    FT_Stroker_CubicTo
-  *
-  *    FT_Stroker_GetBorderCounts
-  *    FT_Stroker_ExportBorder
-  *    FT_Stroker_GetCounts
-  *    FT_Stroker_Export
-  *
-  */
-
-
- /**************************************************************
-  *
-  * @type:
-  *   FT_Stroker
-  *
-  * @description:
-  *   Opaque handle to a path stroker object.
-  */
-  typedef struct FT_StrokerRec_*  FT_Stroker;
-
-
-  /**************************************************************
-   *
-   * @enum:
-   *   FT_Stroker_LineJoin
-   *
-   * @description:
-   *   These values determine how two joining lines are rendered
-   *   in a stroker.
-   *
-   * @values:
-   *   FT_STROKER_LINEJOIN_ROUND ::
-   *     Used to render rounded line joins.  Circular arcs are used
-   *     to join two lines smoothly.
-   *
-   *   FT_STROKER_LINEJOIN_BEVEL ::
-   *     Used to render beveled line joins.  The outer corner of
-   *     the joined lines is filled by enclosing the triangular
-   *     region of the corner with a straight line between the
-   *     outer corners of each stroke.
-   *
-   *   FT_STROKER_LINEJOIN_MITER_FIXED ::
-   *     Used to render mitered line joins, with fixed bevels if the
-   *     miter limit is exceeded.  The outer edges of the strokes
-   *     for the two segments are extended until they meet at an
-   *     angle.  If the segments meet at too sharp an angle (such
-   *     that the miter would extend from the intersection of the
-   *     segments a distance greater than the product of the miter
-   *     limit value and the border radius), then a bevel join (see
-   *     above) is used instead.  This prevents long spikes being
-   *     created.  FT_STROKER_LINEJOIN_MITER_FIXED generates a miter
-   *     line join as used in PostScript and PDF.
-   *
-   *   FT_STROKER_LINEJOIN_MITER_VARIABLE ::
-   *   FT_STROKER_LINEJOIN_MITER ::
-   *     Used to render mitered line joins, with variable bevels if
-   *     the miter limit is exceeded.  The intersection of the
-   *     strokes is clipped at a line perpendicular to the bisector
-   *     of the angle between the strokes, at the distance from the
-   *     intersection of the segments equal to the product of the
-   *     miter limit value and the border radius.  This prevents
-   *     long spikes being created.
-   *     FT_STROKER_LINEJOIN_MITER_VARIABLE generates a mitered line
-   *     join as used in XPS.  FT_STROKER_LINEJOIN_MITER is an alias
-   *     for FT_STROKER_LINEJOIN_MITER_VARIABLE, retained for
-   *     backwards compatibility.
-   */
-  typedef enum  FT_Stroker_LineJoin_
-  {
-    FT_STROKER_LINEJOIN_ROUND          = 0,
-    FT_STROKER_LINEJOIN_BEVEL          = 1,
-    FT_STROKER_LINEJOIN_MITER_VARIABLE = 2,
-    FT_STROKER_LINEJOIN_MITER          = FT_STROKER_LINEJOIN_MITER_VARIABLE,
-    FT_STROKER_LINEJOIN_MITER_FIXED    = 3
-
-  } FT_Stroker_LineJoin;
-
-
-  /**************************************************************
-   *
-   * @enum:
-   *   FT_Stroker_LineCap
-   *
-   * @description:
-   *   These values determine how the end of opened sub-paths are
-   *   rendered in a stroke.
-   *
-   * @values:
-   *   FT_STROKER_LINECAP_BUTT ::
-   *     The end of lines is rendered as a full stop on the last
-   *     point itself.
-   *
-   *   FT_STROKER_LINECAP_ROUND ::
-   *     The end of lines is rendered as a half-circle around the
-   *     last point.
-   *
-   *   FT_STROKER_LINECAP_SQUARE ::
-   *     The end of lines is rendered as a square around the
-   *     last point.
-   */
-  typedef enum  FT_Stroker_LineCap_
-  {
-    FT_STROKER_LINECAP_BUTT = 0,
-    FT_STROKER_LINECAP_ROUND,
-    FT_STROKER_LINECAP_SQUARE
-
-  } FT_Stroker_LineCap;
-
-
-  /**************************************************************
-   *
-   * @enum:
-   *   FT_StrokerBorder
-   *
-   * @description:
-   *   These values are used to select a given stroke border
-   *   in @FT_Stroker_GetBorderCounts and @FT_Stroker_ExportBorder.
-   *
-   * @values:
-   *   FT_STROKER_BORDER_LEFT ::
-   *     Select the left border, relative to the drawing direction.
-   *
-   *   FT_STROKER_BORDER_RIGHT ::
-   *     Select the right border, relative to the drawing direction.
-   *
-   * @note:
-   *   Applications are generally interested in the `inside' and `outside'
-   *   borders.  However, there is no direct mapping between these and the
-   *   `left' and `right' ones, since this really depends on the glyph's
-   *   drawing orientation, which varies between font formats.
-   *
-   *   You can however use @FT_Outline_GetInsideBorder and
-   *   @FT_Outline_GetOutsideBorder to get these.
-   */
-  typedef enum  FT_StrokerBorder_
-  {
-    FT_STROKER_BORDER_LEFT = 0,
-    FT_STROKER_BORDER_RIGHT
-
-  } FT_StrokerBorder;
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Outline_GetInsideBorder
-   *
-   * @description:
-   *   Retrieve the @FT_StrokerBorder value corresponding to the
-   *   `inside' borders of a given outline.
-   *
-   * @input:
-   *   outline ::
-   *     The source outline handle.
-   *
-   * @return:
-   *   The border index.  @FT_STROKER_BORDER_RIGHT for empty or invalid
-   *   outlines.
-   */
-  FT_EXPORT( FT_StrokerBorder )
-  FT_Outline_GetInsideBorder( FT_Outline*  outline );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Outline_GetOutsideBorder
-   *
-   * @description:
-   *   Retrieve the @FT_StrokerBorder value corresponding to the
-   *   `outside' borders of a given outline.
-   *
-   * @input:
-   *   outline ::
-   *     The source outline handle.
-   *
-   * @return:
-   *   The border index.  @FT_STROKER_BORDER_LEFT for empty or invalid
-   *   outlines.
-   */
-  FT_EXPORT( FT_StrokerBorder )
-  FT_Outline_GetOutsideBorder( FT_Outline*  outline );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_New
-   *
-   * @description:
-   *   Create a new stroker object.
-   *
-   * @input:
-   *   library ::
-   *     FreeType library handle.
-   *
-   * @output:
-   *   astroker ::
-   *     A new stroker object handle.  NULL in case of error.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_New( FT_Library   library,
-                  FT_Stroker  *astroker );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_Set
-   *
-   * @description:
-   *   Reset a stroker object's attributes.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   radius ::
-   *     The border radius.
-   *
-   *   line_cap ::
-   *     The line cap style.
-   *
-   *   line_join ::
-   *     The line join style.
-   *
-   *   miter_limit ::
-   *     The miter limit for the FT_STROKER_LINEJOIN_MITER_FIXED and
-   *     FT_STROKER_LINEJOIN_MITER_VARIABLE line join styles,
-   *     expressed as 16.16 fixed-point value.
-   *
-   * @note:
-   *   The radius is expressed in the same units as the outline
-   *   coordinates.
-   *
-   *   This function calls @FT_Stroker_Rewind automatically.
-   */
-  FT_EXPORT( void )
-  FT_Stroker_Set( FT_Stroker           stroker,
-                  FT_Fixed             radius,
-                  FT_Stroker_LineCap   line_cap,
-                  FT_Stroker_LineJoin  line_join,
-                  FT_Fixed             miter_limit );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_Rewind
-   *
-   * @description:
-   *   Reset a stroker object without changing its attributes.
-   *   You should call this function before beginning a new
-   *   series of calls to @FT_Stroker_BeginSubPath or
-   *   @FT_Stroker_EndSubPath.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   */
-  FT_EXPORT( void )
-  FT_Stroker_Rewind( FT_Stroker  stroker );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_ParseOutline
-   *
-   * @description:
-   *   A convenience function used to parse a whole outline with
-   *   the stroker.  The resulting outline(s) can be retrieved
-   *   later by functions like @FT_Stroker_GetCounts and @FT_Stroker_Export.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   outline ::
-   *     The source outline.
-   *
-   *   opened ::
-   *     A boolean.  If~1, the outline is treated as an open path instead
-   *     of a closed one.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   If `opened' is~0 (the default), the outline is treated as a closed
-   *   path, and the stroker generates two distinct `border' outlines.
-   *
-   *   If `opened' is~1, the outline is processed as an open path, and the
-   *   stroker generates a single `stroke' outline.
-   *
-   *   This function calls @FT_Stroker_Rewind automatically.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_ParseOutline( FT_Stroker   stroker,
-                           FT_Outline*  outline,
-                           FT_Bool      opened );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_BeginSubPath
-   *
-   * @description:
-   *   Start a new sub-path in the stroker.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   to ::
-   *     A pointer to the start vector.
-   *
-   *   open ::
-   *     A boolean.  If~1, the sub-path is treated as an open one.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   This function is useful when you need to stroke a path that is
-   *   not stored as an @FT_Outline object.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
-                           FT_Vector*  to,
-                           FT_Bool     open );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_EndSubPath
-   *
-   * @description:
-   *   Close the current sub-path in the stroker.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   You should call this function after @FT_Stroker_BeginSubPath.
-   *   If the subpath was not `opened', this function `draws' a
-   *   single line segment to the start position when needed.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_EndSubPath( FT_Stroker  stroker );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_LineTo
-   *
-   * @description:
-   *   `Draw' a single line segment in the stroker's current sub-path,
-   *   from the last position.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   to ::
-   *     A pointer to the destination point.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   You should call this function between @FT_Stroker_BeginSubPath and
-   *   @FT_Stroker_EndSubPath.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_LineTo( FT_Stroker  stroker,
-                     FT_Vector*  to );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_ConicTo
-   *
-   * @description:
-   *   `Draw' a single quadratic Bézier in the stroker's current sub-path,
-   *   from the last position.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   control ::
-   *     A pointer to a Bézier control point.
-   *
-   *   to ::
-   *     A pointer to the destination point.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   You should call this function between @FT_Stroker_BeginSubPath and
-   *   @FT_Stroker_EndSubPath.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_ConicTo( FT_Stroker  stroker,
-                      FT_Vector*  control,
-                      FT_Vector*  to );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_CubicTo
-   *
-   * @description:
-   *   `Draw' a single cubic Bézier in the stroker's current sub-path,
-   *   from the last position.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   control1 ::
-   *     A pointer to the first Bézier control point.
-   *
-   *   control2 ::
-   *     A pointer to second Bézier control point.
-   *
-   *   to ::
-   *     A pointer to the destination point.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   You should call this function between @FT_Stroker_BeginSubPath and
-   *   @FT_Stroker_EndSubPath.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_CubicTo( FT_Stroker  stroker,
-                      FT_Vector*  control1,
-                      FT_Vector*  control2,
-                      FT_Vector*  to );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_GetBorderCounts
-   *
-   * @description:
-   *   Call this function once you have finished parsing your paths
-   *   with the stroker.  It returns the number of points and
-   *   contours necessary to export one of the `border' or `stroke'
-   *   outlines generated by the stroker.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   border ::
-   *     The border index.
-   *
-   * @output:
-   *   anum_points ::
-   *     The number of points.
-   *
-   *   anum_contours ::
-   *     The number of contours.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   When an outline, or a sub-path, is `closed', the stroker generates
-   *   two independent `border' outlines, named `left' and `right'.
-   *
-   *   When the outline, or a sub-path, is `opened', the stroker merges
-   *   the `border' outlines with caps.  The `left' border receives all
-   *   points, while the `right' border becomes empty.
-   *
-   *   Use the function @FT_Stroker_GetCounts instead if you want to
-   *   retrieve the counts associated to both borders.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
-                              FT_StrokerBorder  border,
-                              FT_UInt          *anum_points,
-                              FT_UInt          *anum_contours );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_ExportBorder
-   *
-   * @description:
-   *   Call this function after @FT_Stroker_GetBorderCounts to
-   *   export the corresponding border to your own @FT_Outline
-   *   structure.
-   *
-   *   Note that this function appends the border points and
-   *   contours to your outline, but does not try to resize its
-   *   arrays.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   border ::
-   *     The border index.
-   *
-   *   outline ::
-   *     The target outline handle.
-   *
-   * @note:
-   *   Always call this function after @FT_Stroker_GetBorderCounts to
-   *   get sure that there is enough room in your @FT_Outline object to
-   *   receive all new data.
-   *
-   *   When an outline, or a sub-path, is `closed', the stroker generates
-   *   two independent `border' outlines, named `left' and `right'.
-   *
-   *   When the outline, or a sub-path, is `opened', the stroker merges
-   *   the `border' outlines with caps.  The `left' border receives all
-   *   points, while the `right' border becomes empty.
-   *
-   *   Use the function @FT_Stroker_Export instead if you want to
-   *   retrieve all borders at once.
-   */
-  FT_EXPORT( void )
-  FT_Stroker_ExportBorder( FT_Stroker        stroker,
-                           FT_StrokerBorder  border,
-                           FT_Outline*       outline );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_GetCounts
-   *
-   * @description:
-   *   Call this function once you have finished parsing your paths
-   *   with the stroker.  It returns the number of points and
-   *   contours necessary to export all points/borders from the stroked
-   *   outline/path.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   * @output:
-   *   anum_points ::
-   *     The number of points.
-   *
-   *   anum_contours ::
-   *     The number of contours.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Stroker_GetCounts( FT_Stroker  stroker,
-                        FT_UInt    *anum_points,
-                        FT_UInt    *anum_contours );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_Export
-   *
-   * @description:
-   *   Call this function after @FT_Stroker_GetBorderCounts to
-   *   export all borders to your own @FT_Outline structure.
-   *
-   *   Note that this function appends the border points and
-   *   contours to your outline, but does not try to resize its
-   *   arrays.
-   *
-   * @input:
-   *   stroker ::
-   *     The target stroker handle.
-   *
-   *   outline ::
-   *     The target outline handle.
-   */
-  FT_EXPORT( void )
-  FT_Stroker_Export( FT_Stroker   stroker,
-                     FT_Outline*  outline );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Stroker_Done
-   *
-   * @description:
-   *   Destroy a stroker object.
-   *
-   * @input:
-   *   stroker ::
-   *     A stroker handle.  Can be NULL.
-   */
-  FT_EXPORT( void )
-  FT_Stroker_Done( FT_Stroker  stroker );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Glyph_Stroke
-   *
-   * @description:
-   *   Stroke a given outline glyph object with a given stroker.
-   *
-   * @inout:
-   *   pglyph ::
-   *     Source glyph handle on input, new glyph handle on output.
-   *
-   * @input:
-   *   stroker ::
-   *     A stroker handle.
-   *
-   *   destroy ::
-   *     A Boolean.  If~1, the source glyph object is destroyed
-   *     on success.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *   The source glyph is untouched in case of error.
-   *
-   *   Adding stroke may yield a significantly wider and taller glyph
-   *   depending on how large of a radius was used to stroke the glyph.  You
-   *   may need to manually adjust horizontal and vertical advance amounts
-   *   to account for this added size.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Glyph_Stroke( FT_Glyph    *pglyph,
-                   FT_Stroker   stroker,
-                   FT_Bool      destroy );
-
-
-  /**************************************************************
-   *
-   * @function:
-   *   FT_Glyph_StrokeBorder
-   *
-   * @description:
-   *   Stroke a given outline glyph object with a given stroker, but
-   *   only return either its inside or outside border.
-   *
-   * @inout:
-   *   pglyph ::
-   *     Source glyph handle on input, new glyph handle on output.
-   *
-   * @input:
-   *   stroker ::
-   *     A stroker handle.
-   *
-   *   inside ::
-   *     A Boolean.  If~1, return the inside border, otherwise
-   *     the outside border.
-   *
-   *   destroy ::
-   *     A Boolean.  If~1, the source glyph object is destroyed
-   *     on success.
-   *
-   * @return:
-   *    FreeType error code.  0~means success.
-   *
-   * @note:
-   *   The source glyph is untouched in case of error.
-   *
-   *   Adding stroke may yield a significantly wider and taller glyph
-   *   depending on how large of a radius was used to stroke the glyph.  You
-   *   may need to manually adjust horizontal and vertical advance amounts
-   *   to account for this added size.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
-                         FT_Stroker   stroker,
-                         FT_Bool      inside,
-                         FT_Bool      destroy );
-
-  /* */
-
-FT_END_HEADER
-
-#endif /* __FT_STROKE_H__ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/ftwinfnt.h b/third_party/freetype/include/freetype/ftwinfnt.h
deleted file mode 100644
index caedaa1..0000000
--- a/third_party/freetype/include/freetype/ftwinfnt.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftwinfnt.h                                                             */
-/*                                                                         */
-/*    FreeType API for accessing Windows fnt-specific data.                */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __FTWINFNT_H__
-#define __FTWINFNT_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>                                                             */
-  /*    winfnt_fonts                                                       */
-  /*                                                                       */
-  /* <Title>                                                               */
-  /*    Window FNT Files                                                   */
-  /*                                                                       */
-  /* <Abstract>                                                            */
-  /*    Windows FNT specific API.                                          */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This section contains the declaration of Windows FNT specific      */
-  /*    functions.                                                         */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-  /*************************************************************************
-   *
-   * @enum:
-   *   FT_WinFNT_ID_XXX
-   *
-   * @description:
-   *   A list of valid values for the `charset' byte in
-   *   @FT_WinFNT_HeaderRec.  Exact mapping tables for the various cpXXXX
-   *   encodings (except for cp1361) can be found at
-   *   ftp://ftp.unicode.org/Public in the MAPPINGS/VENDORS/MICSFT/WINDOWS
-   *   subdirectory.  cp1361 is roughly a superset of
-   *   MAPPINGS/OBSOLETE/EASTASIA/KSC/JOHAB.TXT.
-   *
-   * @values:
-   *   FT_WinFNT_ID_DEFAULT ::
-   *     This is used for font enumeration and font creation as a
-   *     `don't care' value.  Valid font files don't contain this value.
-   *     When querying for information about the character set of the font
-   *     that is currently selected into a specified device context, this
-   *     return value (of the related Windows API) simply denotes failure.
-   *
-   *   FT_WinFNT_ID_SYMBOL ::
-   *     There is no known mapping table available.
-   *
-   *   FT_WinFNT_ID_MAC ::
-   *     Mac Roman encoding.
-   *
-   *   FT_WinFNT_ID_OEM ::
-   *     From Michael Pöttgen <michael@poettgen.de>:
-   *
-   *       The `Windows Font Mapping' article says that FT_WinFNT_ID_OEM
-   *       is used for the charset of vector fonts, like `modern.fon',
-   *       `roman.fon', and `script.fon' on Windows.
-   *
-   *       The `CreateFont' documentation says: The FT_WinFNT_ID_OEM value
-   *       specifies a character set that is operating-system dependent.
-   *
-   *       The `IFIMETRICS' documentation from the `Windows Driver
-   *       Development Kit' says: This font supports an OEM-specific
-   *       character set.  The OEM character set is system dependent.
-   *
-   *       In general OEM, as opposed to ANSI (i.e., cp1252), denotes the
-   *       second default codepage that most international versions of
-   *       Windows have.  It is one of the OEM codepages from
-   *
-   *         https://msdn.microsoft.com/en-us/goglobal/bb964655,
-   *
-   *       and is used for the `DOS boxes', to support legacy applications.
-   *       A German Windows version for example usually uses ANSI codepage
-   *       1252 and OEM codepage 850.
-   *
-   *   FT_WinFNT_ID_CP874 ::
-   *     A superset of Thai TIS 620 and ISO 8859-11.
-   *
-   *   FT_WinFNT_ID_CP932 ::
-   *     A superset of Japanese Shift-JIS (with minor deviations).
-   *
-   *   FT_WinFNT_ID_CP936 ::
-   *     A superset of simplified Chinese GB 2312-1980 (with different
-   *     ordering and minor deviations).
-   *
-   *   FT_WinFNT_ID_CP949 ::
-   *     A superset of Korean Hangul KS~C 5601-1987 (with different
-   *     ordering and minor deviations).
-   *
-   *   FT_WinFNT_ID_CP950 ::
-   *     A superset of traditional Chinese Big~5 ETen (with different
-   *     ordering and minor deviations).
-   *
-   *   FT_WinFNT_ID_CP1250 ::
-   *     A superset of East European ISO 8859-2 (with slightly different
-   *     ordering).
-   *
-   *   FT_WinFNT_ID_CP1251 ::
-   *     A superset of Russian ISO 8859-5 (with different ordering).
-   *
-   *   FT_WinFNT_ID_CP1252 ::
-   *     ANSI encoding.  A superset of ISO 8859-1.
-   *
-   *   FT_WinFNT_ID_CP1253 ::
-   *     A superset of Greek ISO 8859-7 (with minor modifications).
-   *
-   *   FT_WinFNT_ID_CP1254 ::
-   *     A superset of Turkish ISO 8859-9.
-   *
-   *   FT_WinFNT_ID_CP1255 ::
-   *     A superset of Hebrew ISO 8859-8 (with some modifications).
-   *
-   *   FT_WinFNT_ID_CP1256 ::
-   *     A superset of Arabic ISO 8859-6 (with different ordering).
-   *
-   *   FT_WinFNT_ID_CP1257 ::
-   *     A superset of Baltic ISO 8859-13 (with some deviations).
-   *
-   *   FT_WinFNT_ID_CP1258 ::
-   *     For Vietnamese.  This encoding doesn't cover all necessary
-   *     characters.
-   *
-   *   FT_WinFNT_ID_CP1361 ::
-   *     Korean (Johab).
-   */
-
-#define FT_WinFNT_ID_CP1252    0
-#define FT_WinFNT_ID_DEFAULT   1
-#define FT_WinFNT_ID_SYMBOL    2
-#define FT_WinFNT_ID_MAC      77
-#define FT_WinFNT_ID_CP932   128
-#define FT_WinFNT_ID_CP949   129
-#define FT_WinFNT_ID_CP1361  130
-#define FT_WinFNT_ID_CP936   134
-#define FT_WinFNT_ID_CP950   136
-#define FT_WinFNT_ID_CP1253  161
-#define FT_WinFNT_ID_CP1254  162
-#define FT_WinFNT_ID_CP1258  163
-#define FT_WinFNT_ID_CP1255  177
-#define FT_WinFNT_ID_CP1256  178
-#define FT_WinFNT_ID_CP1257  186
-#define FT_WinFNT_ID_CP1251  204
-#define FT_WinFNT_ID_CP874   222
-#define FT_WinFNT_ID_CP1250  238
-#define FT_WinFNT_ID_OEM     255
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_WinFNT_HeaderRec                                                */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Windows FNT Header info.                                           */
-  /*                                                                       */
-  typedef struct  FT_WinFNT_HeaderRec_
-  {
-    FT_UShort  version;
-    FT_ULong   file_size;
-    FT_Byte    copyright[60];
-    FT_UShort  file_type;
-    FT_UShort  nominal_point_size;
-    FT_UShort  vertical_resolution;
-    FT_UShort  horizontal_resolution;
-    FT_UShort  ascent;
-    FT_UShort  internal_leading;
-    FT_UShort  external_leading;
-    FT_Byte    italic;
-    FT_Byte    underline;
-    FT_Byte    strike_out;
-    FT_UShort  weight;
-    FT_Byte    charset;
-    FT_UShort  pixel_width;
-    FT_UShort  pixel_height;
-    FT_Byte    pitch_and_family;
-    FT_UShort  avg_width;
-    FT_UShort  max_width;
-    FT_Byte    first_char;
-    FT_Byte    last_char;
-    FT_Byte    default_char;
-    FT_Byte    break_char;
-    FT_UShort  bytes_per_row;
-    FT_ULong   device_offset;
-    FT_ULong   face_name_offset;
-    FT_ULong   bits_pointer;
-    FT_ULong   bits_offset;
-    FT_Byte    reserved;
-    FT_ULong   flags;
-    FT_UShort  A_space;
-    FT_UShort  B_space;
-    FT_UShort  C_space;
-    FT_UShort  color_table_offset;
-    FT_ULong   reserved1[4];
-
-  } FT_WinFNT_HeaderRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    FT_WinFNT_Header                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A handle to an @FT_WinFNT_HeaderRec structure.                     */
-  /*                                                                       */
-  typedef struct FT_WinFNT_HeaderRec_*  FT_WinFNT_Header;
-
-
-  /**********************************************************************
-   *
-   * @function:
-   *    FT_Get_WinFNT_Header
-   *
-   * @description:
-   *    Retrieve a Windows FNT font info header.
-   *
-   * @input:
-   *    face    :: A handle to the input face.
-   *
-   * @output:
-   *    aheader :: The WinFNT header.
-   *
-   * @return:
-   *   FreeType error code.  0~means success.
-   *
-   * @note:
-   *   This function only works with Windows FNT faces, returning an error
-   *   otherwise.
-   */
-  FT_EXPORT( FT_Error )
-  FT_Get_WinFNT_Header( FT_Face               face,
-                        FT_WinFNT_HeaderRec  *aheader );
-
-  /* */
-
-
-FT_END_HEADER
-
-#endif /* __FTWINFNT_H__ */
-
-
-/* END */
-
-
-/* Local Variables: */
-/* coding: utf-8    */
-/* End:             */
diff --git a/third_party/freetype/include/freetype/internal/fttrace.h b/third_party/freetype/include/freetype/internal/fttrace.h
deleted file mode 100644
index 9d28d21..0000000
--- a/third_party/freetype/include/freetype/internal/fttrace.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  fttrace.h                                                              */
-/*                                                                         */
-/*    Tracing handling (specification only).                               */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /* definitions of trace levels for FreeType 2 */
-
-  /* the first level must always be `trace_any' */
-FT_TRACE_DEF( any )
-
-  /* base components */
-FT_TRACE_DEF( calc )      /* calculations            (ftcalc.c)   */
-FT_TRACE_DEF( memory )    /* memory manager          (ftobjs.c)   */
-FT_TRACE_DEF( stream )    /* stream manager          (ftstream.c) */
-FT_TRACE_DEF( io )        /* i/o interface           (ftsystem.c) */
-FT_TRACE_DEF( list )      /* list management         (ftlist.c)   */
-FT_TRACE_DEF( init )      /* initialization          (ftinit.c)   */
-FT_TRACE_DEF( objs )      /* base objects            (ftobjs.c)   */
-FT_TRACE_DEF( outline )   /* outline management      (ftoutln.c)  */
-FT_TRACE_DEF( glyph )     /* glyph management        (ftglyph.c)  */
-FT_TRACE_DEF( gloader )   /* glyph loader            (ftgloadr.c) */
-
-FT_TRACE_DEF( raster )    /* monochrome rasterizer   (ftraster.c) */
-FT_TRACE_DEF( smooth )    /* anti-aliasing raster    (ftgrays.c)  */
-FT_TRACE_DEF( mm )        /* MM interface            (ftmm.c)     */
-FT_TRACE_DEF( raccess )   /* resource fork accessor  (ftrfork.c)  */
-FT_TRACE_DEF( synth )     /* bold/slant synthesizer  (ftsynth.c)  */
-FT_TRACE_DEF( bitmap )    /* bitmap checksum         (ftobjs.c)   */
-
-  /* Cache sub-system */
-FT_TRACE_DEF( cache )     /* cache sub-system        (ftcache.c, etc.) */
-
-  /* SFNT driver components */
-FT_TRACE_DEF( sfdriver )  /* SFNT font driver        (sfdriver.c) */
-FT_TRACE_DEF( sfobjs )    /* SFNT object handler     (sfobjs.c)   */
-FT_TRACE_DEF( ttcmap )    /* charmap handler         (ttcmap.c)   */
-FT_TRACE_DEF( ttkern )    /* kerning handler         (ttkern.c)   */
-FT_TRACE_DEF( ttload )    /* basic TrueType tables   (ttload.c)   */
-FT_TRACE_DEF( ttmtx )     /* metrics-related tables  (ttmtx.c)    */
-FT_TRACE_DEF( ttpost )    /* PS table processing     (ttpost.c)   */
-FT_TRACE_DEF( ttsbit )    /* TrueType sbit handling  (ttsbit.c)   */
-FT_TRACE_DEF( ttbdf )     /* TrueType embedded BDF   (ttbdf.c)    */
-
-  /* TrueType driver components */
-FT_TRACE_DEF( ttdriver )  /* TT font driver          (ttdriver.c) */
-FT_TRACE_DEF( ttgload )   /* TT glyph loader         (ttgload.c)  */
-FT_TRACE_DEF( ttinterp )  /* bytecode interpreter    (ttinterp.c) */
-FT_TRACE_DEF( ttobjs )    /* TT objects manager      (ttobjs.c)   */
-FT_TRACE_DEF( ttpload )   /* TT data/program loader  (ttpload.c)  */
-FT_TRACE_DEF( ttgxvar )   /* TrueType GX var handler (ttgxvar.c)  */
-
-  /* Type 1 driver components */
-FT_TRACE_DEF( t1afm )
-FT_TRACE_DEF( t1driver )
-FT_TRACE_DEF( t1gload )
-FT_TRACE_DEF( t1hint )
-FT_TRACE_DEF( t1load )
-FT_TRACE_DEF( t1objs )
-FT_TRACE_DEF( t1parse )
-
-  /* PostScript helper module `psaux' */
-FT_TRACE_DEF( t1decode )
-FT_TRACE_DEF( psobjs )
-FT_TRACE_DEF( psconv )
-
-  /* PostScript hinting module `pshinter' */
-FT_TRACE_DEF( pshrec )
-FT_TRACE_DEF( pshalgo1 )
-FT_TRACE_DEF( pshalgo2 )
-
-  /* Type 2 driver components */
-FT_TRACE_DEF( cffdriver )
-FT_TRACE_DEF( cffgload )
-FT_TRACE_DEF( cffload )
-FT_TRACE_DEF( cffobjs )
-FT_TRACE_DEF( cffparse )
-
-FT_TRACE_DEF( cf2blues )
-FT_TRACE_DEF( cf2hints )
-FT_TRACE_DEF( cf2interp )
-
-  /* Type 42 driver component */
-FT_TRACE_DEF( t42 )
-
-  /* CID driver components */
-FT_TRACE_DEF( cidafm )
-FT_TRACE_DEF( ciddriver )
-FT_TRACE_DEF( cidgload )
-FT_TRACE_DEF( cidload )
-FT_TRACE_DEF( cidobjs )
-FT_TRACE_DEF( cidparse )
-
-  /* Windows font component */
-FT_TRACE_DEF( winfnt )
-
-  /* PCF font components */
-FT_TRACE_DEF( pcfdriver )
-FT_TRACE_DEF( pcfread )
-
-  /* BDF font components */
-FT_TRACE_DEF( bdfdriver )
-FT_TRACE_DEF( bdflib )
-
-  /* PFR font component */
-FT_TRACE_DEF( pfr )
-
-  /* OpenType validation components */
-FT_TRACE_DEF( otvmodule )
-FT_TRACE_DEF( otvcommon )
-FT_TRACE_DEF( otvbase )
-FT_TRACE_DEF( otvgdef )
-FT_TRACE_DEF( otvgpos )
-FT_TRACE_DEF( otvgsub )
-FT_TRACE_DEF( otvjstf )
-FT_TRACE_DEF( otvmath )
-
-  /* TrueTypeGX/AAT validation components */
-FT_TRACE_DEF( gxvmodule )
-FT_TRACE_DEF( gxvcommon )
-FT_TRACE_DEF( gxvfeat )
-FT_TRACE_DEF( gxvmort )
-FT_TRACE_DEF( gxvmorx )
-FT_TRACE_DEF( gxvbsln )
-FT_TRACE_DEF( gxvjust )
-FT_TRACE_DEF( gxvkern )
-FT_TRACE_DEF( gxvopbd )
-FT_TRACE_DEF( gxvtrak )
-FT_TRACE_DEF( gxvprop )
-FT_TRACE_DEF( gxvlcar )
-
-  /* autofit components */
-FT_TRACE_DEF( afmodule )
-FT_TRACE_DEF( afhints )
-FT_TRACE_DEF( afcjk )
-FT_TRACE_DEF( aflatin )
-FT_TRACE_DEF( aflatin2 )
-FT_TRACE_DEF( afwarp )
-FT_TRACE_DEF( afharfbuzz )
-FT_TRACE_DEF( afglobal )
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svbdf.h b/third_party/freetype/include/freetype/internal/services/svbdf.h
deleted file mode 100644
index 865b536..0000000
--- a/third_party/freetype/include/freetype/internal/services/svbdf.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svbdf.h                                                                */
-/*                                                                         */
-/*    The FreeType BDF services (specification).                           */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __SVBDF_H__
-#define __SVBDF_H__
-
-#include FT_BDF_H
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_BDF  "bdf"
-
-  typedef FT_Error
-  (*FT_BDF_GetCharsetIdFunc)( FT_Face       face,
-                              const char*  *acharset_encoding,
-                              const char*  *acharset_registry );
-
-  typedef FT_Error
-  (*FT_BDF_GetPropertyFunc)( FT_Face           face,
-                             const char*       prop_name,
-                             BDF_PropertyRec  *aproperty );
-
-
-  FT_DEFINE_SERVICE( BDF )
-  {
-    FT_BDF_GetCharsetIdFunc  get_charset_id;
-    FT_BDF_GetPropertyFunc   get_property;
-  };
-
-
-#ifndef FT_CONFIG_OPTION_PIC
-
-#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
-                                  get_charset_id_,                       \
-                                  get_property_ )                        \
-  static const FT_Service_BDFRec  class_ =                               \
-  {                                                                      \
-    get_charset_id_, get_property_                                       \
-  };
-
-#else /* FT_CONFIG_OPTION_PIC */
-
-#define FT_DEFINE_SERVICE_BDFRec( class_,                                \
-                                  get_charset_id_,                       \
-                                  get_property_ )                        \
-  void                                                                   \
-  FT_Init_Class_ ## class_( FT_Service_BDFRec*  clazz )                  \
-  {                                                                      \
-    clazz->get_charset_id = get_charset_id_;                             \
-    clazz->get_property   = get_property_;                               \
-  }
-
-#endif /* FT_CONFIG_OPTION_PIC */
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __SVBDF_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svgxval.h b/third_party/freetype/include/freetype/internal/services/svgxval.h
deleted file mode 100644
index 59cc3b7..0000000
--- a/third_party/freetype/include/freetype/internal/services/svgxval.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svgxval.h                                                              */
-/*                                                                         */
-/*    FreeType API for validating TrueTypeGX/AAT tables (specification).   */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  Masatake YAMATO, Red Hat 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/*                                                                         */
-/* gxvalid is derived from both gxlayout module and otvalid module.        */
-/* Development of gxlayout is supported by the Information-technology      */
-/* Promotion Agency(IPA), Japan.                                           */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __SVGXVAL_H__
-#define __SVGXVAL_H__
-
-#include FT_GX_VALIDATE_H
-#include FT_INTERNAL_VALIDATE_H
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_GX_VALIDATE           "truetypegx-validate"
-#define FT_SERVICE_ID_CLASSICKERN_VALIDATE  "classickern-validate"
-
-  typedef FT_Error
-  (*gxv_validate_func)( FT_Face   face,
-                        FT_UInt   gx_flags,
-                        FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
-                        FT_UInt   table_length );
-
-
-  typedef FT_Error
-  (*ckern_validate_func)( FT_Face   face,
-                          FT_UInt   ckern_flags,
-                          FT_Bytes  *ckern_table );
-
-
-  FT_DEFINE_SERVICE( GXvalidate )
-  {
-    gxv_validate_func  validate;
-  };
-
-  FT_DEFINE_SERVICE( CKERNvalidate )
-  {
-    ckern_validate_func  validate;
-  };
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __SVGXVAL_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svotval.h b/third_party/freetype/include/freetype/internal/services/svotval.h
deleted file mode 100644
index a82a642..0000000
--- a/third_party/freetype/include/freetype/internal/services/svotval.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svotval.h                                                              */
-/*                                                                         */
-/*    The FreeType OpenType validation service (specification).            */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __SVOTVAL_H__
-#define __SVOTVAL_H__
-
-#include FT_OPENTYPE_VALIDATE_H
-#include FT_INTERNAL_VALIDATE_H
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_OPENTYPE_VALIDATE  "opentype-validate"
-
-
-  typedef FT_Error
-  (*otv_validate_func)( FT_Face volatile  face,
-                        FT_UInt           ot_flags,
-                        FT_Bytes         *base,
-                        FT_Bytes         *gdef,
-                        FT_Bytes         *gpos,
-                        FT_Bytes         *gsub,
-                        FT_Bytes         *jstf );
-
-
-  FT_DEFINE_SERVICE( OTvalidate )
-  {
-    otv_validate_func  validate;
-  };
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __SVOTVAL_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svpfr.h b/third_party/freetype/include/freetype/internal/services/svpfr.h
deleted file mode 100644
index d4eb169..0000000
--- a/third_party/freetype/include/freetype/internal/services/svpfr.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svpfr.h                                                                */
-/*                                                                         */
-/*    Internal PFR service functions (specification).                      */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __SVPFR_H__
-#define __SVPFR_H__
-
-#include FT_PFR_H
-#include FT_INTERNAL_SERVICE_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_PFR_METRICS  "pfr-metrics"
-
-
-  typedef FT_Error
-  (*FT_PFR_GetMetricsFunc)( FT_Face    face,
-                            FT_UInt   *aoutline,
-                            FT_UInt   *ametrics,
-                            FT_Fixed  *ax_scale,
-                            FT_Fixed  *ay_scale );
-
-  typedef FT_Error
-  (*FT_PFR_GetKerningFunc)( FT_Face     face,
-                            FT_UInt     left,
-                            FT_UInt     right,
-                            FT_Vector  *avector );
-
-  typedef FT_Error
-  (*FT_PFR_GetAdvanceFunc)( FT_Face   face,
-                            FT_UInt   gindex,
-                            FT_Pos   *aadvance );
-
-
-  FT_DEFINE_SERVICE( PfrMetrics )
-  {
-    FT_PFR_GetMetricsFunc  get_metrics;
-    FT_PFR_GetKerningFunc  get_kerning;
-    FT_PFR_GetAdvanceFunc  get_advance;
-
-  };
-
- /* */
-
-FT_END_HEADER
-
-#endif /* __SVPFR_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/internal/services/svwinfnt.h b/third_party/freetype/include/freetype/internal/services/svwinfnt.h
deleted file mode 100644
index 0036929..0000000
--- a/third_party/freetype/include/freetype/internal/services/svwinfnt.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  svwinfnt.h                                                             */
-/*                                                                         */
-/*    The FreeType Windows FNT/FONT service (specification).               */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __SVWINFNT_H__
-#define __SVWINFNT_H__
-
-#include FT_INTERNAL_SERVICE_H
-#include FT_WINFONTS_H
-
-
-FT_BEGIN_HEADER
-
-
-#define FT_SERVICE_ID_WINFNT  "winfonts"
-
-  typedef FT_Error
-  (*FT_WinFnt_GetHeaderFunc)( FT_Face               face,
-                              FT_WinFNT_HeaderRec  *aheader );
-
-
-  FT_DEFINE_SERVICE( WinFnt )
-  {
-    FT_WinFnt_GetHeaderFunc  get_header;
-  };
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __SVWINFNT_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/include/freetype/ttunpat.h b/third_party/freetype/include/freetype/ttunpat.h
deleted file mode 100644
index 8ea5568..0000000
--- a/third_party/freetype/include/freetype/ttunpat.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttunpat.h                                                              */
-/*                                                                         */
-/*    Definitions for the unpatented TrueType hinting system               */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  Written by Graham Asher <graham.asher@btinternet.com>                  */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __TTUNPAT_H__
-#define __TTUNPAT_H__
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-
-#ifdef FREETYPE_H
-#error "freetype.h of FreeType 1 has been loaded!"
-#error "Please fix the directory search order for header files"
-#error "so that freetype.h of FreeType 2 is found first."
-#endif
-
-
-FT_BEGIN_HEADER
-
-
- /***************************************************************************
-  *
-  * @constant:
-  *   FT_PARAM_TAG_UNPATENTED_HINTING
-  *
-  * @description:
-  *   A constant used as the tag of an @FT_Parameter structure to indicate
-  *   that unpatented methods only should be used by the TrueType bytecode
-  *   interpreter for a typeface opened by @FT_Open_Face.
-  *
-  */
-#define FT_PARAM_TAG_UNPATENTED_HINTING  FT_MAKE_TAG( 'u', 'n', 'p', 'a' )
-
-  /* */
-
-
-FT_END_HEADER
-
-
-#endif /* __TTUNPAT_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/Jamfile b/third_party/freetype/src/base/Jamfile
deleted file mode 100644
index e39fb09..0000000
--- a/third_party/freetype/src/base/Jamfile
+++ /dev/null
@@ -1,87 +0,0 @@
-# FreeType 2 src/base Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) base ;
-
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = basepic
-               ftadvanc
-               ftcalc
-               ftdbgmem
-               ftgloadr
-               ftobjs
-               ftoutln
-               ftpic
-               ftrfork
-               ftsnames
-               ftstream
-               fttrigon
-               ftutil
-               ;
-  }
-  else
-  {
-    _sources = ftbase ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# Add the optional/replaceable files.
-#
-{
-  local  _sources = ftapi
-                    ftbbox
-                    ftbdf
-                    ftbitmap
-                    ftcid
-                    ftdebug
-                    ftfntfmt
-                    ftfstype
-                    ftgasp
-                    ftglyph
-                    ftgxval
-                    ftinit
-                    ftlcdfil
-                    ftmm
-                    ftotval
-                    ftpatent
-                    ftpfr
-                    ftstroke
-                    ftsynth
-                    ftsystem
-                    fttype1
-                    ftwinfnt
-                    ;
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# Add Macintosh-specific file to the library when necessary.
-#
-if $(MAC)
-{
-  Library  $(FT2_LIB) : ftmac.c ;
-}
-else if $(OS) = MACOSX
-{
-  if $(FT2_MULTI)
-  {
-    Library  $(FT2_LIB) : ftmac.c ;
-  }
-}
-
-# end of src/base Jamfile
diff --git a/third_party/freetype/src/base/ftapi.c b/third_party/freetype/src/base/ftapi.c
deleted file mode 100644
index f22a181..0000000
--- a/third_party/freetype/src/base/ftapi.c
+++ /dev/null
@@ -1,121 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftapi.c                                                                */
-/*                                                                         */
-/*    The FreeType compatibility functions (body).                         */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_LIST_H
-#include FT_OUTLINE_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TABLES_H
-#include FT_OUTLINE_H
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /****                 C O M P A T I B I L I T Y                       ****/
-  /****                                                                 ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* backwards compatibility API */
-
-  FT_BASE_DEF( void )
-  FT_New_Memory_Stream( FT_Library  library,
-                        FT_Byte*    base,
-                        FT_ULong    size,
-                        FT_Stream   stream )
-  {
-    FT_UNUSED( library );
-
-    FT_Stream_OpenMemory( stream, base, size );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Seek_Stream( FT_Stream  stream,
-                  FT_ULong   pos )
-  {
-    return FT_Stream_Seek( stream, pos );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Skip_Stream( FT_Stream  stream,
-                  FT_Long    distance )
-  {
-    return FT_Stream_Skip( stream, distance );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Read_Stream( FT_Stream  stream,
-                  FT_Byte*   buffer,
-                  FT_ULong   count )
-  {
-    return FT_Stream_Read( stream, buffer, count );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Read_Stream_At( FT_Stream  stream,
-                     FT_ULong   pos,
-                     FT_Byte*   buffer,
-                     FT_ULong   count )
-  {
-    return FT_Stream_ReadAt( stream, pos, buffer, count );
-  }
-
-
-  FT_BASE_DEF( FT_Error )
-  FT_Extract_Frame( FT_Stream  stream,
-                    FT_ULong   count,
-                    FT_Byte**  pbytes )
-  {
-    return FT_Stream_ExtractFrame( stream, count, pbytes );
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Release_Frame( FT_Stream  stream,
-                    FT_Byte**  pbytes )
-  {
-    FT_Stream_ReleaseFrame( stream, pbytes );
-  }
-
-  FT_BASE_DEF( FT_Error )
-  FT_Access_Frame( FT_Stream  stream,
-                   FT_ULong   count )
-  {
-    return FT_Stream_EnterFrame( stream, count );
-  }
-
-
-  FT_BASE_DEF( void )
-  FT_Forget_Frame( FT_Stream  stream )
-  {
-    FT_Stream_ExitFrame( stream );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftbbox.c b/third_party/freetype/src/base/ftbbox.c
deleted file mode 100644
index 10df98d..0000000
--- a/third_party/freetype/src/base/ftbbox.c
+++ /dev/null
@@ -1,509 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbbox.c                                                               */
-/*                                                                         */
-/*    FreeType bbox computation (body).                                    */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used        */
-/*  modified and distributed under the terms of the FreeType project       */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This component has a _single_ role: to compute exact outline bounding */
-  /* boxes.                                                                */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_BBOX_H
-#include FT_IMAGE_H
-#include FT_OUTLINE_H
-#include FT_INTERNAL_CALC_H
-#include FT_INTERNAL_OBJECTS_H
-
-
-  typedef struct  TBBox_Rec_
-  {
-    FT_Vector  last;
-    FT_BBox    bbox;
-
-  } TBBox_Rec;
-
-
-#define FT_UPDATE_BBOX( p, bbox ) \
-  FT_BEGIN_STMNT                  \
-    if ( p->x < bbox.xMin )       \
-      bbox.xMin = p->x;           \
-    if ( p->x > bbox.xMax )       \
-      bbox.xMax = p->x;           \
-    if ( p->y < bbox.yMin )       \
-      bbox.yMin = p->y;           \
-    if ( p->y > bbox.yMax )       \
-      bbox.yMax = p->y;           \
-  FT_END_STMNT
-
-#define CHECK_X( p, bbox )                         \
-          ( p->x < bbox.xMin || p->x > bbox.xMax )
-
-#define CHECK_Y( p, bbox )                         \
-          ( p->y < bbox.yMin || p->y > bbox.yMax )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Move_To                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used as a `move_to' emitter during                */
-  /*    FT_Outline_Decompose().  It simply records the destination point   */
-  /*    in `user->last'. We also update bbox in case contour starts with   */
-  /*    an implicit `on' point.                                            */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    to   :: A pointer to the destination vector.                       */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user :: A pointer to the current walk context.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always 0.  Needed for the interface only.                          */
-  /*                                                                       */
-  static int
-  BBox_Move_To( FT_Vector*  to,
-                TBBox_Rec*  user )
-  {
-    FT_UPDATE_BBOX( to, user->bbox );
-
-    user->last = *to;
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Line_To                                                       */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used as a `line_to' emitter during                */
-  /*    FT_Outline_Decompose().  It simply records the destination point   */
-  /*    in `user->last'; no further computations are necessary because     */
-  /*    bbox already contains both explicit ends of the line segment.      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    to   :: A pointer to the destination vector.                       */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user :: A pointer to the current walk context.                     */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always 0.  Needed for the interface only.                          */
-  /*                                                                       */
-  static int
-  BBox_Line_To( FT_Vector*  to,
-                TBBox_Rec*  user )
-  {
-    user->last = *to;
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Conic_Check                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Find the extrema of a 1-dimensional conic Bezier curve and update  */
-  /*    a bounding range.  This version uses direct computation, as it     */
-  /*    doesn't need square roots.                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    y1  :: The start coordinate.                                       */
-  /*                                                                       */
-  /*    y2  :: The coordinate of the control point.                        */
-  /*                                                                       */
-  /*    y3  :: The end coordinate.                                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    min :: The address of the current minimum.                         */
-  /*                                                                       */
-  /*    max :: The address of the current maximum.                         */
-  /*                                                                       */
-  static void
-  BBox_Conic_Check( FT_Pos   y1,
-                    FT_Pos   y2,
-                    FT_Pos   y3,
-                    FT_Pos*  min,
-                    FT_Pos*  max )
-  {
-    /* This function is only called when a control off-point is outside */
-    /* the bbox that contains all on-points.  It finds a local extremum */
-    /* within the segment, equal to (y1*y3 - y2*y2)/(y1 - 2*y2 + y3).   */
-    /* Or, offsetting from y2, we get                                   */
-
-    y1 -= y2;
-    y3 -= y2;
-    y2 += FT_MulDiv( y1, y3, y1 + y3 );
-
-    if ( y2 < *min )
-      *min = y2;
-    if ( y2 > *max )
-      *max = y2;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Conic_To                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used as a `conic_to' emitter during               */
-  /*    FT_Outline_Decompose().  It checks a conic Bezier curve with the   */
-  /*    current bounding box, and computes its extrema if necessary to     */
-  /*    update it.                                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    control :: A pointer to a control point.                           */
-  /*                                                                       */
-  /*    to      :: A pointer to the destination vector.                    */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user    :: The address of the current walk context.                */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always 0.  Needed for the interface only.                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    In the case of a non-monotonous arc, we compute directly the       */
-  /*    extremum coordinates, as it is sufficiently fast.                  */
-  /*                                                                       */
-  static int
-  BBox_Conic_To( FT_Vector*  control,
-                 FT_Vector*  to,
-                 TBBox_Rec*  user )
-  {
-    /* in case `to' is implicit and not included in bbox yet */
-    FT_UPDATE_BBOX( to, user->bbox );
-
-    if ( CHECK_X( control, user->bbox ) )
-      BBox_Conic_Check( user->last.x,
-                        control->x,
-                        to->x,
-                        &user->bbox.xMin,
-                        &user->bbox.xMax );
-
-    if ( CHECK_Y( control, user->bbox ) )
-      BBox_Conic_Check( user->last.y,
-                        control->y,
-                        to->y,
-                        &user->bbox.yMin,
-                        &user->bbox.yMax );
-
-    user->last = *to;
-
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Cubic_Check                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Find the extrema of a 1-dimensional cubic Bezier curve and         */
-  /*    update a bounding range.  This version uses iterative splitting    */
-  /*    because it is faster than the exact solution with square roots.    */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    p1  :: The start coordinate.                                       */
-  /*                                                                       */
-  /*    p2  :: The coordinate of the first control point.                  */
-  /*                                                                       */
-  /*    p3  :: The coordinate of the second control point.                 */
-  /*                                                                       */
-  /*    p4  :: The end coordinate.                                         */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    min :: The address of the current minimum.                         */
-  /*                                                                       */
-  /*    max :: The address of the current maximum.                         */
-  /*                                                                       */
-  static FT_Pos
-  cubic_peak( FT_Pos  q1,
-              FT_Pos  q2,
-              FT_Pos  q3,
-              FT_Pos  q4 )
-  {
-    FT_Pos  peak = 0;
-    FT_Int  shift;
-
-
-    /* This function finds a peak of a cubic segment if it is above 0    */
-    /* using iterative bisection of the segment, or returns 0.           */
-    /* The fixed-point arithmetic of bisection is inherently stable      */
-    /* but may loose accuracy in the two lowest bits.  To compensate,    */
-    /* we upscale the segment if there is room.  Large values may need   */
-    /* to be downscaled to avoid overflows during bisection.             */
-    /* It is called with either q2 or q3 positive, which is necessary    */
-    /* for the peak to exist and avoids undefined FT_MSB.                */
-
-    shift = 27 - FT_MSB( (FT_UInt32)( FT_ABS( q1 ) |
-                                      FT_ABS( q2 ) |
-                                      FT_ABS( q3 ) |
-                                      FT_ABS( q4 ) ) );
-
-    if ( shift > 0 )
-    {
-      /* upscaling too much just wastes time */
-      if ( shift > 2 )
-        shift = 2;
-
-      q1 <<=  shift;
-      q2 <<=  shift;
-      q3 <<=  shift;
-      q4 <<=  shift;
-    }
-    else
-    {
-      q1 >>= -shift;
-      q2 >>= -shift;
-      q3 >>= -shift;
-      q4 >>= -shift;
-    }
-
-    /* for a peak to exist above 0, the cubic segment must have */
-    /* at least one of its control off-points above 0.          */
-    while ( q2 > 0 || q3 > 0 )
-    {
-      /* determine which half contains the maximum and split */
-      if ( q1 + q2 > q3 + q4 ) /* first half */
-      {
-        q4 = q4 + q3;
-        q3 = q3 + q2;
-        q2 = q2 + q1;
-        q4 = q4 + q3;
-        q3 = q3 + q2;
-        q4 = ( q4 + q3 ) / 8;
-        q3 = q3 / 4;
-        q2 = q2 / 2;
-      }
-      else                     /* second half */
-      {
-        q1 = q1 + q2;
-        q2 = q2 + q3;
-        q3 = q3 + q4;
-        q1 = q1 + q2;
-        q2 = q2 + q3;
-        q1 = ( q1 + q2 ) / 8;
-        q2 = q2 / 4;
-        q3 = q3 / 2;
-      }
-
-      /* check whether either end reached the maximum */
-      if ( q1 == q2 && q1 >= q3 )
-      {
-        peak = q1;
-        break;
-      }
-      if ( q3 == q4 && q2 <= q4 )
-      {
-        peak = q4;
-        break;
-      }
-    }
-
-    if ( shift > 0 )
-      peak >>=  shift;
-    else
-      peak <<= -shift;
-
-    return peak;
-  }
-
-
-  static void
-  BBox_Cubic_Check( FT_Pos   p1,
-                    FT_Pos   p2,
-                    FT_Pos   p3,
-                    FT_Pos   p4,
-                    FT_Pos*  min,
-                    FT_Pos*  max )
-  {
-    /* This function is only called when a control off-point is outside  */
-    /* the bbox that contains all on-points.  So at least one of the     */
-    /* conditions below holds and cubic_peak is called with at least one */
-    /* non-zero argument.                                                */
-
-    if ( p2 > *max || p3 > *max )
-      *max += cubic_peak( p1 - *max, p2 - *max, p3 - *max, p4 - *max );
-
-    /* now flip the signs to update the minimum */
-    if ( p2 < *min || p3 < *min )
-      *min -= cubic_peak( *min - p1, *min - p2, *min - p3, *min - p4 );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    BBox_Cubic_To                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This function is used as a `cubic_to' emitter during               */
-  /*    FT_Outline_Decompose().  It checks a cubic Bezier curve with the   */
-  /*    current bounding box, and computes its extrema if necessary to     */
-  /*    update it.                                                         */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    control1 :: A pointer to the first control point.                  */
-  /*                                                                       */
-  /*    control2 :: A pointer to the second control point.                 */
-  /*                                                                       */
-  /*    to       :: A pointer to the destination vector.                   */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    user     :: The address of the current walk context.               */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    Always 0.  Needed for the interface only.                          */
-  /*                                                                       */
-  /* <Note>                                                                */
-  /*    In the case of a non-monotonous arc, we don't compute directly     */
-  /*    extremum coordinates, we subdivide instead.                        */
-  /*                                                                       */
-  static int
-  BBox_Cubic_To( FT_Vector*  control1,
-                 FT_Vector*  control2,
-                 FT_Vector*  to,
-                 TBBox_Rec*  user )
-  {
-    /* We don't need to check `to' since it is always an on-point,    */
-    /* thus within the bbox.  Only segments with an off-point outside */
-    /* the bbox can possibly reach new extreme values.                */
-
-    if ( CHECK_X( control1, user->bbox ) ||
-         CHECK_X( control2, user->bbox ) )
-      BBox_Cubic_Check( user->last.x,
-                        control1->x,
-                        control2->x,
-                        to->x,
-                        &user->bbox.xMin,
-                        &user->bbox.xMax );
-
-    if ( CHECK_Y( control1, user->bbox ) ||
-         CHECK_Y( control2, user->bbox ) )
-      BBox_Cubic_Check( user->last.y,
-                        control1->y,
-                        control2->y,
-                        to->y,
-                        &user->bbox.yMin,
-                        &user->bbox.yMax );
-
-    user->last = *to;
-
-    return 0;
-  }
-
-
-  FT_DEFINE_OUTLINE_FUNCS(bbox_interface,
-    (FT_Outline_MoveTo_Func) BBox_Move_To,
-    (FT_Outline_LineTo_Func) BBox_Line_To,
-    (FT_Outline_ConicTo_Func)BBox_Conic_To,
-    (FT_Outline_CubicTo_Func)BBox_Cubic_To,
-    0, 0
-  )
-
-
-  /* documentation is in ftbbox.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Outline_Get_BBox( FT_Outline*  outline,
-                       FT_BBox     *abbox )
-  {
-    FT_BBox     cbox = {  0x7FFFFFFFL,  0x7FFFFFFFL,
-                         -0x7FFFFFFFL, -0x7FFFFFFFL };
-    FT_BBox     bbox = {  0x7FFFFFFFL,  0x7FFFFFFFL,
-                         -0x7FFFFFFFL, -0x7FFFFFFFL };
-    FT_Vector*  vec;
-    FT_UShort   n;
-
-
-    if ( !abbox )
-      return FT_THROW( Invalid_Argument );
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    /* if outline is empty, return (0,0,0,0) */
-    if ( outline->n_points == 0 || outline->n_contours <= 0 )
-    {
-      abbox->xMin = abbox->xMax = 0;
-      abbox->yMin = abbox->yMax = 0;
-      return 0;
-    }
-
-    /* We compute the control box as well as the bounding box of  */
-    /* all `on' points in the outline.  Then, if the two boxes    */
-    /* coincide, we exit immediately.                             */
-
-    vec = outline->points;
-
-    for ( n = 0; n < outline->n_points; n++ )
-    {
-      FT_UPDATE_BBOX( vec, cbox);
-
-      if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON )
-        FT_UPDATE_BBOX( vec, bbox);
-
-      vec++;
-    }
-
-    /* test two boxes for equality */
-    if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax ||
-         cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax )
-    {
-      /* the two boxes are different, now walk over the outline to */
-      /* get the Bezier arc extrema.                               */
-
-      FT_Error   error;
-      TBBox_Rec  user;
-
-#ifdef FT_CONFIG_OPTION_PIC
-      FT_Outline_Funcs bbox_interface;
-      Init_Class_bbox_interface(&bbox_interface);
-#endif
-
-      user.bbox = bbox;
-
-      error = FT_Outline_Decompose( outline, &bbox_interface, &user );
-      if ( error )
-        return error;
-
-      *abbox = user.bbox;
-    }
-    else
-      *abbox = bbox;
-
-    return FT_Err_Ok;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftbdf.c b/third_party/freetype/src/base/ftbdf.c
deleted file mode 100644
index aa72ddc..0000000
--- a/third_party/freetype/src/base/ftbdf.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftbdf.c                                                                */
-/*                                                                         */
-/*    FreeType API for accessing BDF-specific strings (body).              */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_BDF_H
-
-
-  /* documentation is in ftbdf.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_BDF_Charset_ID( FT_Face       face,
-                         const char*  *acharset_encoding,
-                         const char*  *acharset_registry )
-  {
-    FT_Error     error;
-    const char*  encoding = NULL;
-    const char*  registry = NULL;
-
-    FT_Service_BDF  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    FT_FACE_FIND_SERVICE( face, service, BDF );
-
-    if ( service && service->get_charset_id )
-      error = service->get_charset_id( face, &encoding, &registry );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    if ( acharset_encoding )
-      *acharset_encoding = encoding;
-
-    if ( acharset_registry )
-      *acharset_registry = registry;
-
-    return error;
-  }
-
-
-  /* documentation is in ftbdf.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_BDF_Property( FT_Face           face,
-                       const char*       prop_name,
-                       BDF_PropertyRec  *aproperty )
-  {
-    FT_Error  error;
-
-    FT_Service_BDF  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !aproperty )
-      return FT_THROW( Invalid_Argument );
-
-    aproperty->type = BDF_PROPERTY_TYPE_NONE;
-
-    FT_FACE_FIND_SERVICE( face, service, BDF );
-
-    if ( service && service->get_property )
-      error = service->get_property( face, prop_name, aproperty );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftcid.c b/third_party/freetype/src/base/ftcid.c
deleted file mode 100644
index 0734881..0000000
--- a/third_party/freetype/src/base/ftcid.c
+++ /dev/null
@@ -1,118 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftcid.c                                                                */
-/*                                                                         */
-/*    FreeType API for accessing CID font information.                     */
-/*                                                                         */
-/*  Copyright 2007-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_CID_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_CID_H
-
-
-  /* documentation is in ftcid.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_CID_Registry_Ordering_Supplement( FT_Face       face,
-                                           const char*  *registry,
-                                           const char*  *ordering,
-                                           FT_Int       *supplement)
-  {
-    FT_Error     error;
-    const char*  r = NULL;
-    const char*  o = NULL;
-    FT_Int       s = 0;
-
-
-    error = FT_ERR( Invalid_Argument );
-
-    if ( face )
-    {
-      FT_Service_CID  service;
-
-
-      FT_FACE_FIND_SERVICE( face, service, CID );
-
-      if ( service && service->get_ros )
-        error = service->get_ros( face, &r, &o, &s );
-    }
-
-    if ( registry )
-      *registry = r;
-
-    if ( ordering )
-      *ordering = o;
-
-    if ( supplement )
-      *supplement = s;
-
-    return error;
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_CID_Is_Internally_CID_Keyed( FT_Face   face,
-                                      FT_Bool  *is_cid )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-    FT_Bool   ic = 0;
-
-
-    if ( face )
-    {
-      FT_Service_CID  service;
-
-
-      FT_FACE_FIND_SERVICE( face, service, CID );
-
-      if ( service && service->get_is_cid )
-        error = service->get_is_cid( face, &ic);
-    }
-
-    if ( is_cid )
-      *is_cid = ic;
-
-    return error;
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_CID_From_Glyph_Index( FT_Face   face,
-                               FT_UInt   glyph_index,
-                               FT_UInt  *cid )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-    FT_UInt   c = 0;
-
-
-    if ( face )
-    {
-      FT_Service_CID  service;
-
-
-      FT_FACE_FIND_SERVICE( face, service, CID );
-
-      if ( service && service->get_cid_from_glyph_index )
-        error = service->get_cid_from_glyph_index( face, glyph_index, &c);
-    }
-
-    if ( cid )
-      *cid = c;
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftdebug.c b/third_party/freetype/src/base/ftdebug.c
deleted file mode 100644
index 03e18a8..0000000
--- a/third_party/freetype/src/base/ftdebug.c
+++ /dev/null
@@ -1,266 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftdebug.c                                                              */
-/*                                                                         */
-/*    Debugging and logging component (body).                              */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* This component contains various macros and functions used to ease the */
-  /* debugging of the FreeType engine.  Its main purpose is in assertion   */
-  /* checking, tracing, and error detection.                               */
-  /*                                                                       */
-  /* There are now three debugging modes:                                  */
-  /*                                                                       */
-  /* - trace mode                                                          */
-  /*                                                                       */
-  /*   Error and trace messages are sent to the log file (which can be the */
-  /*   standard error output).                                             */
-  /*                                                                       */
-  /* - error mode                                                          */
-  /*                                                                       */
-  /*   Only error messages are generated.                                  */
-  /*                                                                       */
-  /* - release mode:                                                       */
-  /*                                                                       */
-  /*   No error message is sent or generated.  The code is free from any   */
-  /*   debugging parts.                                                    */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_INTERNAL_DEBUG_H
-
-
-#ifdef FT_DEBUG_LEVEL_ERROR
-
-  /* documentation is in ftdebug.h */
-
-  FT_BASE_DEF( void )
-  FT_Message( const char*  fmt,
-              ... )
-  {
-    va_list  ap;
-
-
-    va_start( ap, fmt );
-    vfprintf( stderr, fmt, ap );
-    va_end( ap );
-  }
-
-
-  /* documentation is in ftdebug.h */
-
-  FT_BASE_DEF( void )
-  FT_Panic( const char*  fmt,
-            ... )
-  {
-    va_list  ap;
-
-
-    va_start( ap, fmt );
-    vfprintf( stderr, fmt, ap );
-    va_end( ap );
-
-    exit( EXIT_FAILURE );
-  }
-
-
-  /* documentation is in ftdebug.h */
-
-  FT_BASE_DEF( int )
-  FT_Throw( FT_Error     error,
-            int          line,
-            const char*  file )
-  {
-    FT_UNUSED( error );
-    FT_UNUSED( line );
-    FT_UNUSED( file );
-
-    return 0;
-  }
-
-#endif /* FT_DEBUG_LEVEL_ERROR */
-
-
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-
-  /* array of trace levels, initialized to 0 */
-  int  ft_trace_levels[trace_count];
-
-
-  /* define array of trace toggle names */
-#define FT_TRACE_DEF( x )  #x ,
-
-  static const char*  ft_trace_toggles[trace_count + 1] =
-  {
-#include FT_INTERNAL_TRACE_H
-    NULL
-  };
-
-#undef FT_TRACE_DEF
-
-
-  /* documentation is in ftdebug.h */
-
-  FT_BASE_DEF( FT_Int )
-  FT_Trace_Get_Count( void )
-  {
-    return trace_count;
-  }
-
-
-  /* documentation is in ftdebug.h */
-
-  FT_BASE_DEF( const char * )
-  FT_Trace_Get_Name( FT_Int  idx )
-  {
-    int  max = FT_Trace_Get_Count();
-
-
-    if ( idx < max )
-      return ft_trace_toggles[idx];
-    else
-      return NULL;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Initialize the tracing sub-system.  This is done by retrieving the    */
-  /* value of the `FT2_DEBUG' environment variable.  It must be a list of  */
-  /* toggles, separated by spaces, `;', or `,'.  Example:                  */
-  /*                                                                       */
-  /*    export FT2_DEBUG="any:3 memory:7 stream:5"                         */
-  /*                                                                       */
-  /* This requests that all levels be set to 3, except the trace level for */
-  /* the memory and stream components which are set to 7 and 5,            */
-  /* respectively.                                                         */
-  /*                                                                       */
-  /* See the file `include/freetype/internal/fttrace.h' for details of     */
-  /* the available toggle names.                                           */
-  /*                                                                       */
-  /* The level must be between 0 and 7; 0 means quiet (except for serious  */
-  /* runtime errors), and 7 means _very_ verbose.                          */
-  /*                                                                       */
-  FT_BASE_DEF( void )
-  ft_debug_init( void )
-  {
-    const char*  ft2_debug = getenv( "FT2_DEBUG" );
-
-
-    if ( ft2_debug )
-    {
-      const char*  p = ft2_debug;
-      const char*  q;
-
-
-      for ( ; *p; p++ )
-      {
-        /* skip leading whitespace and separators */
-        if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' )
-          continue;
-
-        /* read toggle name, followed by ':' */
-        q = p;
-        while ( *p && *p != ':' )
-          p++;
-
-        if ( !*p )
-          break;
-
-        if ( *p == ':' && p > q )
-        {
-          FT_Int  n, i, len = (FT_Int)( p - q );
-          FT_Int  level = -1, found = -1;
-
-
-          for ( n = 0; n < trace_count; n++ )
-          {
-            const char*  toggle = ft_trace_toggles[n];
-
-
-            for ( i = 0; i < len; i++ )
-            {
-              if ( toggle[i] != q[i] )
-                break;
-            }
-
-            if ( i == len && toggle[i] == 0 )
-            {
-              found = n;
-              break;
-            }
-          }
-
-          /* read level */
-          p++;
-          if ( *p )
-          {
-            level = *p - '0';
-            if ( level < 0 || level > 7 )
-              level = -1;
-          }
-
-          if ( found >= 0 && level >= 0 )
-          {
-            if ( found == trace_any )
-            {
-              /* special case for `any' */
-              for ( n = 0; n < trace_count; n++ )
-                ft_trace_levels[n] = level;
-            }
-            else
-              ft_trace_levels[found] = level;
-          }
-        }
-      }
-    }
-  }
-
-
-#else  /* !FT_DEBUG_LEVEL_TRACE */
-
-
-  FT_BASE_DEF( void )
-  ft_debug_init( void )
-  {
-    /* nothing */
-  }
-
-
-  FT_BASE_DEF( FT_Int )
-  FT_Trace_Get_Count( void )
-  {
-    return 0;
-  }
-
-
-  FT_BASE_DEF( const char * )
-  FT_Trace_Get_Name( FT_Int  idx )
-  {
-    FT_UNUSED( idx );
-
-    return NULL;
-  }
-
-
-#endif /* !FT_DEBUG_LEVEL_TRACE */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftgasp.c b/third_party/freetype/src/base/ftgasp.c
deleted file mode 100644
index bbd257c..0000000
--- a/third_party/freetype/src/base/ftgasp.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgasp.c                                                               */
-/*                                                                         */
-/*    Access of TrueType's `gasp' table (body).                            */
-/*                                                                         */
-/*  Copyright 2007-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_GASP_H
-#include FT_INTERNAL_TRUETYPE_TYPES_H
-
-
-  FT_EXPORT_DEF( FT_Int )
-  FT_Get_Gasp( FT_Face  face,
-               FT_UInt  ppem )
-  {
-    FT_Int  result = FT_GASP_NO_TABLE;
-
-
-    if ( face && FT_IS_SFNT( face ) )
-    {
-      TT_Face  ttface = (TT_Face)face;
-
-
-      if ( ttface->gasp.numRanges > 0 )
-      {
-        TT_GaspRange  range     = ttface->gasp.gaspRanges;
-        TT_GaspRange  range_end = range + ttface->gasp.numRanges;
-
-
-        while ( ppem > range->maxPPEM )
-        {
-          range++;
-          if ( range >= range_end )
-            goto Exit;
-        }
-
-        result = range->gaspFlag;
-
-        /* ensure that we don't have spurious bits */
-        if ( ttface->gasp.version == 0 )
-          result &= 3;
-      }
-    }
-  Exit:
-    return result;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftgxval.c b/third_party/freetype/src/base/ftgxval.c
deleted file mode 100644
index 58868f2..0000000
--- a/third_party/freetype/src/base/ftgxval.c
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftgxval.c                                                              */
-/*                                                                         */
-/*    FreeType API for validating TrueTyepGX/AAT tables (body).            */
-/*                                                                         */
-/*  Copyright 2004-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-/***************************************************************************/
-/*                                                                         */
-/* gxvalid is derived from both gxlayout module and otvalid module.        */
-/* Development of gxlayout is supported by the Information-technology      */
-/* Promotion Agency(IPA), Japan.                                           */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_GX_VALIDATE_H
-
-
-  /* documentation is in ftgxval.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_TrueTypeGX_Validate( FT_Face   face,
-                          FT_UInt   validation_flags,
-                          FT_Bytes  tables[FT_VALIDATE_GX_LENGTH],
-                          FT_UInt   table_length )
-  {
-    FT_Service_GXvalidate  service;
-    FT_Error               error;
-
-
-    if ( !face )
-    {
-      error = FT_THROW( Invalid_Face_Handle );
-      goto Exit;
-    }
-
-    if ( !tables )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE );
-
-    if ( service )
-      error = service->validate( face,
-                                 validation_flags,
-                                 tables,
-                                 table_length );
-    else
-      error = FT_THROW( Unimplemented_Feature );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_EXPORT_DEF( void )
-  FT_TrueTypeGX_Free( FT_Face   face,
-                      FT_Bytes  table )
-  {
-    FT_Memory  memory;
-
-
-    if ( !face )
-      return;
-
-    memory = FT_FACE_MEMORY( face );
-
-    FT_FREE( table );
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_ClassicKern_Validate( FT_Face    face,
-                           FT_UInt    validation_flags,
-                           FT_Bytes  *ckern_table )
-  {
-    FT_Service_CKERNvalidate  service;
-    FT_Error                  error;
-
-
-    if ( !face )
-    {
-      error = FT_THROW( Invalid_Face_Handle );
-      goto Exit;
-    }
-
-    if ( !ckern_table )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE );
-
-    if ( service )
-      error = service->validate( face,
-                                 validation_flags,
-                                 ckern_table );
-    else
-      error = FT_THROW( Unimplemented_Feature );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_EXPORT_DEF( void )
-  FT_ClassicKern_Free( FT_Face   face,
-                       FT_Bytes  table )
-  {
-    FT_Memory  memory;
-
-
-    if ( !face )
-      return;
-
-    memory = FT_FACE_MEMORY( face );
-
-
-    FT_FREE( table );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftmac.c b/third_party/freetype/src/base/ftmac.c
deleted file mode 100644
index 114bbb6..0000000
--- a/third_party/freetype/src/base/ftmac.c
+++ /dev/null
@@ -1,1080 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmac.c                                                                */
-/*                                                                         */
-/*    Mac FOND support.  Written by just@letterror.com.                    */
-/*  Heavily modified by mpsuzuki, George Williams, and Sean McBride.       */
-/*                                                                         */
-/*  This file is for Mac OS X only; see builds/mac/ftoldmac.c for          */
-/*  classic platforms built by MPW.                                        */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  Just van Rossum, 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*
-    Notes
-
-    Mac suitcase files can (and often do!) contain multiple fonts.  To
-    support this I use the face_index argument of FT_(Open|New)_Face()
-    functions, and pretend the suitcase file is a collection.
-
-    Warning: fbit and NFNT bitmap resources are not supported yet.  In old
-    sfnt fonts, bitmap glyph data for each size is stored in each `NFNT'
-    resources instead of the `bdat' table in the sfnt resource.  Therefore,
-    face->num_fixed_sizes is set to 0, because bitmap data in `NFNT'
-    resource is unavailable at present.
-
-    The Mac FOND support works roughly like this:
-
-    - Check whether the offered stream points to a Mac suitcase file.  This
-      is done by checking the file type: it has to be 'FFIL' or 'tfil'.  The
-      stream that gets passed to our init_face() routine is a stdio stream,
-      which isn't usable for us, since the FOND resources live in the
-      resource fork.  So we just grab the stream->pathname field.
-
-    - Read the FOND resource into memory, then check whether there is a
-      TrueType font and/or(!) a Type 1 font available.
-
-    - If there is a Type 1 font available (as a separate `LWFN' file), read
-      its data into memory, massage it slightly so it becomes PFB data, wrap
-      it into a memory stream, load the Type 1 driver and delegate the rest
-      of the work to it by calling FT_Open_Face().  (XXX TODO: after this
-      has been done, the kerning data from the FOND resource should be
-      appended to the face: On the Mac there are usually no AFM files
-      available.  However, this is tricky since we need to map Mac char
-      codes to ps glyph names to glyph ID's...)
-
-    - If there is a TrueType font (an `sfnt' resource), read it into memory,
-      wrap it into a memory stream, load the TrueType driver and delegate
-      the rest of the work to it, by calling FT_Open_Face().
-
-    - Some suitcase fonts (notably Onyx) might point the `LWFN' file to
-      itself, even though it doesn't contains `POST' resources.  To handle
-      this special case without opening the file an extra time, we just
-      ignore errors from the `LWFN' and fallback to the `sfnt' if both are
-      available.
-  */
-
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_INTERNAL_STREAM_H
-#include "ftbase.h"
-
-  /* This is for Mac OS X.  Without redefinition, OS_INLINE */
-  /* expands to `static inline' which doesn't survive the   */
-  /* -ansi compilation flag of GCC.                         */
-#if !HAVE_ANSI_OS_INLINE
-#undef  OS_INLINE
-#define OS_INLINE  static __inline__
-#endif
-
-  /* `configure' checks the availability of `ResourceIndex' strictly */
-  /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always.  If it is      */
-  /* not set (e.g., a build without `configure'), the availability   */
-  /* is guessed from the SDK version.                                */
-#ifndef HAVE_TYPE_RESOURCE_INDEX
-#if !defined( MAC_OS_X_VERSION_10_5 ) || \
-    ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 )
-#define HAVE_TYPE_RESOURCE_INDEX 0
-#else
-#define HAVE_TYPE_RESOURCE_INDEX 1
-#endif
-#endif /* !HAVE_TYPE_RESOURCE_INDEX */
-
-#if ( HAVE_TYPE_RESOURCE_INDEX == 0 )
-  typedef short  ResourceIndex;
-#endif
-
-#include <CoreServices/CoreServices.h>
-#include <ApplicationServices/ApplicationServices.h>
-#include <sys/syslimits.h> /* PATH_MAX */
-
-  /* Don't want warnings about our own use of deprecated functions. */
-#define FT_DEPRECATED_ATTRIBUTE
-
-#include FT_MAC_H
-
-#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */
-#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault
-#endif
-
-
-  /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over
-     TrueType in case *both* are available (this is not common,
-     but it *is* possible). */
-#ifndef PREFER_LWFN
-#define PREFER_LWFN  1
-#endif
-
-
-#ifdef FT_MACINTOSH
-
-  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
-  FT_EXPORT_DEF( FT_Error )
-  FT_GetFile_From_Mac_Name( const char*  fontName,
-                            FSSpec*      pathSpec,
-                            FT_Long*     face_index )
-  {
-    FT_UNUSED( fontName );
-    FT_UNUSED( pathSpec );
-    FT_UNUSED( face_index );
-
-    return FT_THROW( Unimplemented_Feature );
-  }
-
-
-  /* Private function.                                         */
-  /* The FSSpec type has been discouraged for a long time,     */
-  /* unfortunately an FSRef replacement API for                */
-  /* ATSFontGetFileSpecification() is only available in        */
-  /* Mac OS X 10.5 and later.                                  */
-  static OSStatus
-  FT_ATSFontGetFileReference( ATSFontRef  ats_font_id,
-                              FSRef*      ats_font_ref )
-  {
-#if defined( MAC_OS_X_VERSION_10_5 ) && \
-    ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 )
-
-    OSStatus  err;
-
-    err = ATSFontGetFileReference( ats_font_id, ats_font_ref );
-
-    return err;
-#elif __LP64__ /* No 64bit Carbon API on legacy platforms */
-    FT_UNUSED( ats_font_id );
-    FT_UNUSED( ats_font_ref );
-
-
-    return fnfErr;
-#else /* 32bit Carbon API on legacy platforms */
-    OSStatus  err;
-    FSSpec    spec;
-
-
-    err = ATSFontGetFileSpecification( ats_font_id, &spec );
-    if ( noErr == err )
-      err = FSpMakeFSRef( &spec, ats_font_ref );
-
-    return err;
-#endif
-  }
-
-
-  static FT_Error
-  FT_GetFileRef_From_Mac_ATS_Name( const char*  fontName,
-                                   FSRef*       ats_font_ref,
-                                   FT_Long*     face_index )
-  {
-    CFStringRef  cf_fontName;
-    ATSFontRef   ats_font_id;
-
-
-    *face_index = 0;
-
-    cf_fontName = CFStringCreateWithCString( NULL, fontName,
-                                             kCFStringEncodingMacRoman );
-    ats_font_id = ATSFontFindFromName( cf_fontName,
-                                       kATSOptionFlagsUnRestrictedScope );
-    CFRelease( cf_fontName );
-
-    if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL )
-      return FT_THROW( Unknown_File_Format );
-
-    if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) )
-      return FT_THROW( Unknown_File_Format );
-
-    /* face_index calculation by searching preceding fontIDs */
-    /* with same FSRef                                       */
-    {
-      ATSFontRef  id2 = ats_font_id - 1;
-      FSRef       ref2;
-
-
-      while ( id2 > 0 )
-      {
-        if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) )
-          break;
-        if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) )
-          break;
-
-        id2 --;
-      }
-      *face_index = ats_font_id - ( id2 + 1 );
-    }
-
-    return FT_Err_Ok;
-  }
-
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_GetFilePath_From_Mac_ATS_Name( const char*  fontName,
-                                    UInt8*       path,
-                                    UInt32       maxPathSize,
-                                    FT_Long*     face_index )
-  {
-    FSRef     ref;
-    FT_Error  err;
-
-
-    if ( !fontName || !face_index )
-      return FT_THROW( Invalid_Argument) ;
-
-    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
-    if ( err )
-      return err;
-
-    if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) )
-      return FT_THROW( Unknown_File_Format );
-
-    return FT_Err_Ok;
-  }
-
-
-  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
-  FT_EXPORT_DEF( FT_Error )
-  FT_GetFile_From_Mac_ATS_Name( const char*  fontName,
-                                FSSpec*      pathSpec,
-                                FT_Long*     face_index )
-  {
-#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
-      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
-    FT_UNUSED( fontName );
-    FT_UNUSED( pathSpec );
-    FT_UNUSED( face_index );
-
-    return FT_THROW( Unimplemented_Feature );
-#else
-    FSRef     ref;
-    FT_Error  err;
-
-
-    if ( !fontName || !face_index )
-      return FT_THROW( Invalid_Argument );
-
-    err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index );
-    if ( err )
-      return err;
-
-    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL,
-                                    pathSpec, NULL ) )
-      return FT_THROW( Unknown_File_Format );
-
-    return FT_Err_Ok;
-#endif
-  }
-
-
-  static OSErr
-  FT_FSPathMakeRes( const UInt8*    pathname,
-                    ResFileRefNum*  res )
-  {
-    OSErr  err;
-    FSRef  ref;
-
-
-    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
-      return FT_THROW( Cannot_Open_Resource );
-
-    /* at present, no support for dfont format */
-    err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res );
-    if ( noErr == err )
-      return err;
-
-    /* fallback to original resource-fork font */
-    *res = FSOpenResFile( &ref, fsRdPerm );
-    err  = ResError();
-
-    return err;
-  }
-
-
-  /* Return the file type for given pathname */
-  static OSType
-  get_file_type_from_path( const UInt8*  pathname )
-  {
-    FSRef          ref;
-    FSCatalogInfo  info;
-
-
-    if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) )
-      return ( OSType ) 0;
-
-    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info,
-                                    NULL, NULL, NULL ) )
-      return ( OSType ) 0;
-
-    return ((FInfo *)(info.finderInfo))->fdType;
-  }
-
-
-  /* Given a PostScript font name, create the Macintosh LWFN file name. */
-  static void
-  create_lwfn_name( char*   ps_name,
-                    Str255  lwfn_file_name )
-  {
-    int       max = 5, count = 0;
-    FT_Byte*  p = lwfn_file_name;
-    FT_Byte*  q = (FT_Byte*)ps_name;
-
-
-    lwfn_file_name[0] = 0;
-
-    while ( *q )
-    {
-      if ( ft_isupper( *q ) )
-      {
-        if ( count )
-          max = 3;
-        count = 0;
-      }
-      if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) )
-      {
-        *++p = *q;
-        lwfn_file_name[0]++;
-        count++;
-      }
-      q++;
-    }
-  }
-
-
-  static short
-  count_faces_sfnt( char*  fond_data )
-  {
-    /* The count is 1 greater than the value in the FOND.  */
-    /* Isn't that cute? :-)                                */
-
-    return EndianS16_BtoN( *( (short*)( fond_data +
-                                        sizeof ( FamRec ) ) ) ) + 1;
-  }
-
-
-  static short
-  count_faces_scalable( char*  fond_data )
-  {
-    AsscEntry*  assoc;
-    short       i, face, face_all;
-
-
-    face_all = EndianS16_BtoN( *( (short *)( fond_data +
-                                             sizeof ( FamRec ) ) ) ) + 1;
-    assoc    = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
-    face     = 0;
-
-    for ( i = 0; i < face_all; i++ )
-    {
-      if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) )
-        face++;
-    }
-    return face;
-  }
-
-
-  /* Look inside the FOND data, answer whether there should be an SFNT
-     resource, and answer the name of a possible LWFN Type 1 file.
-
-     Thanks to Paul Miller (paulm@profoundeffects.com) for the fix
-     to load a face OTHER than the first one in the FOND!
-  */
-
-
-  static void
-  parse_fond( char*   fond_data,
-              short*  have_sfnt,
-              ResID*  sfnt_id,
-              Str255  lwfn_file_name,
-              short   face_index )
-  {
-    AsscEntry*  assoc;
-    AsscEntry*  base_assoc;
-    FamRec*     fond;
-
-
-    *sfnt_id          = 0;
-    *have_sfnt        = 0;
-    lwfn_file_name[0] = 0;
-
-    fond       = (FamRec*)fond_data;
-    assoc      = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 );
-    base_assoc = assoc;
-
-    /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */
-    if ( 47 < face_index )
-      return;
-
-    /* Let's do a little range checking before we get too excited here */
-    if ( face_index < count_faces_sfnt( fond_data ) )
-    {
-      assoc += face_index;        /* add on the face_index! */
-
-      /* if the face at this index is not scalable,
-         fall back to the first one (old behavior) */
-      if ( EndianS16_BtoN( assoc->fontSize ) == 0 )
-      {
-        *have_sfnt = 1;
-        *sfnt_id   = EndianS16_BtoN( assoc->fontID );
-      }
-      else if ( base_assoc->fontSize == 0 )
-      {
-        *have_sfnt = 1;
-        *sfnt_id   = EndianS16_BtoN( base_assoc->fontID );
-      }
-    }
-
-    if ( EndianS32_BtoN( fond->ffStylOff ) )
-    {
-      unsigned char*  p = (unsigned char*)fond_data;
-      StyleTable*     style;
-      unsigned short  string_count;
-      char            ps_name[256];
-      unsigned char*  names[64];
-      int             i;
-
-
-      p += EndianS32_BtoN( fond->ffStylOff );
-      style = (StyleTable*)p;
-      p += sizeof ( StyleTable );
-      string_count = EndianS16_BtoN( *(short*)(p) );
-      string_count = FT_MIN( 64, string_count );
-      p += sizeof ( short );
-
-      for ( i = 0; i < string_count; i++ )
-      {
-        names[i] = p;
-        p       += names[i][0];
-        p++;
-      }
-
-      {
-        size_t  ps_name_len = (size_t)names[0][0];
-
-
-        if ( ps_name_len != 0 )
-        {
-          ft_memcpy(ps_name, names[0] + 1, ps_name_len);
-          ps_name[ps_name_len] = 0;
-        }
-        if ( style->indexes[face_index] > 1 &&
-             style->indexes[face_index] <= string_count )
-        {
-          unsigned char*  suffixes = names[style->indexes[face_index] - 1];
-
-
-          for ( i = 1; i <= suffixes[0]; i++ )
-          {
-            unsigned char*  s;
-            size_t          j = suffixes[i] - 1;
-
-
-            if ( j < string_count && ( s = names[j] ) != NULL )
-            {
-              size_t  s_len = (size_t)s[0];
-
-
-              if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) )
-              {
-                ft_memcpy( ps_name + ps_name_len, s + 1, s_len );
-                ps_name_len += s_len;
-                ps_name[ps_name_len] = 0;
-              }
-            }
-          }
-        }
-      }
-
-      create_lwfn_name( ps_name, lwfn_file_name );
-    }
-  }
-
-
-  static  FT_Error
-  lookup_lwfn_by_fond( const UInt8*      path_fond,
-                       ConstStr255Param  base_lwfn,
-                       UInt8*            path_lwfn,
-                       size_t            path_size )
-  {
-    FSRef   ref, par_ref;
-    size_t  dirname_len;
-
-
-    /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */
-    /* We should not extract parent directory by string manipulation.      */
-
-    if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) )
-      return FT_THROW( Invalid_Argument );
-
-    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
-                                    NULL, NULL, NULL, &par_ref ) )
-      return FT_THROW( Invalid_Argument );
-
-    if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) )
-      return FT_THROW( Invalid_Argument );
-
-    if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size )
-      return FT_THROW( Invalid_Argument );
-
-    /* now we have absolute dirname in path_lwfn */
-    ft_strcat( (char *)path_lwfn, "/" );
-    dirname_len = ft_strlen( (char *)path_lwfn );
-    ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 );
-    path_lwfn[dirname_len + base_lwfn[0]] = '\0';
-
-    if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) )
-      return FT_THROW( Cannot_Open_Resource );
-
-    if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone,
-                                    NULL, NULL, NULL, NULL ) )
-      return FT_THROW( Cannot_Open_Resource );
-
-    return FT_Err_Ok;
-  }
-
-
-  static short
-  count_faces( Handle        fond,
-               const UInt8*  pathname )
-  {
-    ResID     sfnt_id;
-    short     have_sfnt, have_lwfn;
-    Str255    lwfn_file_name;
-    UInt8     buff[PATH_MAX];
-    FT_Error  err;
-    short     num_faces;
-
-
-    have_sfnt = have_lwfn = 0;
-
-    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 );
-
-    if ( lwfn_file_name[0] )
-    {
-      err = lookup_lwfn_by_fond( pathname, lwfn_file_name,
-                                 buff, sizeof ( buff )  );
-      if ( !err )
-        have_lwfn = 1;
-    }
-
-    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
-      num_faces = 1;
-    else
-      num_faces = count_faces_scalable( *fond );
-
-    return num_faces;
-  }
-
-
-  /* Read Type 1 data from the POST resources inside the LWFN file,
-     return a PFB buffer.  This is somewhat convoluted because the FT2
-     PFB parser wants the ASCII header as one chunk, and the LWFN
-     chunks are often not organized that way, so we glue chunks
-     of the same type together. */
-  static FT_Error
-  read_lwfn( FT_Memory      memory,
-             ResFileRefNum  res,
-             FT_Byte**      pfb_data,
-             FT_ULong*      size )
-  {
-    FT_Error       error = FT_Err_Ok;
-    ResID          res_id;
-    unsigned char  *buffer, *p, *size_p = NULL;
-    FT_ULong       total_size = 0;
-    FT_ULong       old_total_size = 0;
-    FT_ULong       post_size, pfb_chunk_size;
-    Handle         post_data;
-    char           code, last_code;
-
-
-    UseResFile( res );
-
-    /* First pass: load all POST resources, and determine the size of */
-    /* the output buffer.                                             */
-    res_id    = 501;
-    last_code = -1;
-
-    for (;;)
-    {
-      post_data = Get1Resource( TTAG_POST, res_id++ );
-      if ( post_data == NULL )
-        break;  /* we are done */
-
-      code = (*post_data)[0];
-
-      if ( code != last_code )
-      {
-        if ( code == 5 )
-          total_size += 2; /* just the end code */
-        else
-          total_size += 6; /* code + 4 bytes chunk length */
-      }
-
-      total_size += (FT_ULong)GetHandleSize( post_data ) - 2;
-      last_code = code;
-
-      /* detect resource fork overflow */
-      if ( FT_MAC_RFORK_MAX_LEN < total_size )
-      {
-        error = FT_THROW( Array_Too_Large );
-        goto Error;
-      }
-
-      old_total_size = total_size;
-    }
-
-    if ( FT_ALLOC( buffer, (FT_Long)total_size ) )
-      goto Error;
-
-    /* Second pass: append all POST data to the buffer, add PFB fields. */
-    /* Glue all consecutive chunks of the same type together.           */
-    p              = buffer;
-    res_id         = 501;
-    last_code      = -1;
-    pfb_chunk_size = 0;
-
-    for (;;)
-    {
-      post_data = Get1Resource( TTAG_POST, res_id++ );
-      if ( post_data == NULL )
-        break;  /* we are done */
-
-      post_size = (FT_ULong)GetHandleSize( post_data ) - 2;
-      code = (*post_data)[0];
-
-      if ( code != last_code )
-      {
-        if ( last_code != -1 )
-        {
-          /* we are done adding a chunk, fill in the size field */
-          if ( size_p != NULL )
-          {
-            *size_p++ = (FT_Byte)(   pfb_chunk_size         & 0xFF );
-            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8  ) & 0xFF );
-            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF );
-            *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF );
-          }
-          pfb_chunk_size = 0;
-        }
-
-        *p++ = 0x80;
-        if ( code == 5 )
-          *p++ = 0x03;  /* the end */
-        else if ( code == 2 )
-          *p++ = 0x02;  /* binary segment */
-        else
-          *p++ = 0x01;  /* ASCII segment */
-
-        if ( code != 5 )
-        {
-          size_p = p;   /* save for later */
-          p += 4;       /* make space for size field */
-        }
-      }
-
-      ft_memcpy( p, *post_data + 2, post_size );
-      pfb_chunk_size += post_size;
-      p += post_size;
-      last_code = code;
-    }
-
-    *pfb_data = buffer;
-    *size = total_size;
-
-  Error:
-    CloseResFile( res );
-    return error;
-  }
-
-
-  /* Create a new FT_Face from a file path to an LWFN file. */
-  static FT_Error
-  FT_New_Face_From_LWFN( FT_Library    library,
-                         const UInt8*  pathname,
-                         FT_Long       face_index,
-                         FT_Face*      aface )
-  {
-    FT_Byte*       pfb_data;
-    FT_ULong       pfb_size;
-    FT_Error       error;
-    ResFileRefNum  res;
-
-
-    if ( noErr != FT_FSPathMakeRes( pathname, &res ) )
-      return FT_THROW( Cannot_Open_Resource );
-
-    pfb_data = NULL;
-    pfb_size = 0;
-    error = read_lwfn( library->memory, res, &pfb_data, &pfb_size );
-    CloseResFile( res ); /* PFB is already loaded, useless anymore */
-    if ( error )
-      return error;
-
-    return open_face_from_buffer( library,
-                                  pfb_data,
-                                  pfb_size,
-                                  face_index,
-                                  "type1",
-                                  aface );
-  }
-
-
-  /* Create a new FT_Face from an SFNT resource, specified by res ID. */
-  static FT_Error
-  FT_New_Face_From_SFNT( FT_Library  library,
-                         ResID       sfnt_id,
-                         FT_Long     face_index,
-                         FT_Face*    aface )
-  {
-    Handle     sfnt = NULL;
-    FT_Byte*   sfnt_data;
-    size_t     sfnt_size;
-    FT_Error   error  = FT_Err_Ok;
-    FT_Memory  memory = library->memory;
-    int        is_cff, is_sfnt_ps;
-
-
-    sfnt = GetResource( TTAG_sfnt, sfnt_id );
-    if ( sfnt == NULL )
-      return FT_THROW( Invalid_Handle );
-
-    sfnt_size = (FT_ULong)GetHandleSize( sfnt );
-
-    /* detect resource fork overflow */
-    if ( FT_MAC_RFORK_MAX_LEN < sfnt_size )
-      return FT_THROW( Array_Too_Large );
-
-    if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) )
-    {
-      ReleaseResource( sfnt );
-      return error;
-    }
-
-    ft_memcpy( sfnt_data, *sfnt, sfnt_size );
-    ReleaseResource( sfnt );
-
-    is_cff     = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 );
-    is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 );
-
-    if ( is_sfnt_ps )
-    {
-      FT_Stream  stream;
-
-
-      if ( FT_NEW( stream ) )
-        goto Try_OpenType;
-
-      FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size );
-      if ( !open_face_PS_from_sfnt_stream( library,
-                                           stream,
-                                           face_index,
-                                           0, NULL,
-                                           aface ) )
-      {
-        FT_Stream_Close( stream );
-        FT_FREE( stream );
-        FT_FREE( sfnt_data );
-        goto Exit;
-      }
-
-      FT_FREE( stream );
-    }
-  Try_OpenType:
-    error = open_face_from_buffer( library,
-                                   sfnt_data,
-                                   sfnt_size,
-                                   face_index,
-                                   is_cff ? "cff" : "truetype",
-                                   aface );
-  Exit:
-    return error;
-  }
-
-
-  /* Create a new FT_Face from a file path to a suitcase file. */
-  static FT_Error
-  FT_New_Face_From_Suitcase( FT_Library    library,
-                             const UInt8*  pathname,
-                             FT_Long       face_index,
-                             FT_Face*      aface )
-  {
-    FT_Error       error = FT_ERR( Cannot_Open_Resource );
-    ResFileRefNum  res_ref;
-    ResourceIndex  res_index;
-    Handle         fond;
-    short          num_faces_in_res;
-
-
-    if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) )
-      return FT_THROW( Cannot_Open_Resource );
-
-    UseResFile( res_ref );
-    if ( ResError() )
-      return FT_THROW( Cannot_Open_Resource );
-
-    num_faces_in_res = 0;
-    for ( res_index = 1; ; ++res_index )
-    {
-      short  num_faces_in_fond;
-
-
-      fond = Get1IndResource( TTAG_FOND, res_index );
-      if ( ResError() )
-        break;
-
-      num_faces_in_fond  = count_faces( fond, pathname );
-      num_faces_in_res  += num_faces_in_fond;
-
-      if ( 0 <= face_index && face_index < num_faces_in_fond && error )
-        error = FT_New_Face_From_FOND( library, fond, face_index, aface );
-
-      face_index -= num_faces_in_fond;
-    }
-
-    CloseResFile( res_ref );
-    if ( !error && aface && *aface )
-      (*aface)->num_faces = num_faces_in_res;
-    return error;
-  }
-
-
-  /* documentation is in ftmac.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Face_From_FOND( FT_Library  library,
-                         Handle      fond,
-                         FT_Long     face_index,
-                         FT_Face*    aface )
-  {
-    short     have_sfnt, have_lwfn = 0;
-    ResID     sfnt_id, fond_id;
-    OSType    fond_type;
-    Str255    fond_name;
-    Str255    lwfn_file_name;
-    UInt8     path_lwfn[PATH_MAX];
-    OSErr     err;
-    FT_Error  error = FT_Err_Ok;
-
-
-    /* check of `library' and `aface' delayed to `FT_New_Face_From_XXX' */
-
-    GetResInfo( fond, &fond_id, &fond_type, fond_name );
-    if ( ResError() != noErr || fond_type != TTAG_FOND )
-      return FT_THROW( Invalid_File_Format );
-
-    parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index );
-
-    if ( lwfn_file_name[0] )
-    {
-      ResFileRefNum  res;
-
-
-      res = HomeResFile( fond );
-      if ( noErr != ResError() )
-        goto found_no_lwfn_file;
-
-      {
-        UInt8  path_fond[PATH_MAX];
-        FSRef  ref;
-
-
-        err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum,
-                               NULL, NULL, NULL, &ref, NULL );
-        if ( noErr != err )
-          goto found_no_lwfn_file;
-
-        err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) );
-        if ( noErr != err )
-          goto found_no_lwfn_file;
-
-        error = lookup_lwfn_by_fond( path_fond, lwfn_file_name,
-                                     path_lwfn, sizeof ( path_lwfn ) );
-        if ( !error )
-          have_lwfn = 1;
-      }
-    }
-
-    if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) )
-      error = FT_New_Face_From_LWFN( library,
-                                     path_lwfn,
-                                     face_index,
-                                     aface );
-    else
-      error = FT_THROW( Unknown_File_Format );
-
-  found_no_lwfn_file:
-    if ( have_sfnt && error )
-      error = FT_New_Face_From_SFNT( library,
-                                     sfnt_id,
-                                     face_index,
-                                     aface );
-
-    return error;
-  }
-
-
-  /* Common function to load a new FT_Face from a resource file. */
-  static FT_Error
-  FT_New_Face_From_Resource( FT_Library    library,
-                             const UInt8*  pathname,
-                             FT_Long       face_index,
-                             FT_Face*      aface )
-  {
-    OSType    file_type;
-    FT_Error  error;
-
-
-    /* LWFN is a (very) specific file format, check for it explicitly */
-    file_type = get_file_type_from_path( pathname );
-    if ( file_type == TTAG_LWFN )
-      return FT_New_Face_From_LWFN( library, pathname, face_index, aface );
-
-    /* Otherwise the file type doesn't matter (there are more than  */
-    /* `FFIL' and `tfil').  Just try opening it as a font suitcase; */
-    /* if it works, fine.                                           */
-
-    error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface );
-    if ( error == 0 )
-      return error;
-
-    /* let it fall through to normal loader (.ttf, .otf, etc.); */
-    /* we signal this by returning no error and no FT_Face      */
-    *aface = NULL;
-    return 0;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    This is the Mac-specific implementation of FT_New_Face.  In        */
-  /*    addition to the standard FT_New_Face() functionality, it also      */
-  /*    accepts pathnames to Mac suitcase files.  For further              */
-  /*    documentation see the original FT_New_Face() 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;
-    FT_Error      error;
-
-
-    /* test for valid `library' and `aface' delayed to FT_Open_Face() */
-    if ( !pathname )
-      return FT_THROW( Invalid_Argument );
-
-    *aface = NULL;
-
-    /* try resourcefork based font: LWFN, FFIL */
-    error = FT_New_Face_From_Resource( library, (UInt8 *)pathname,
-                                       face_index, aface );
-    if ( error != 0 || *aface != NULL )
-      return error;
-
-    /* let it fall through to normal loader (.ttf, .otf, etc.) */
-    args.flags    = FT_OPEN_PATHNAME;
-    args.pathname = (char*)pathname;
-    return FT_Open_Face( library, &args, face_index, aface );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face_From_FSRef                                             */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FT_New_Face_From_FSRef is identical to FT_New_Face except it       */
-  /*    accepts an FSRef instead of a path.                                */
-  /*                                                                       */
-  /* This function is deprecated because Carbon data types (FSRef)         */
-  /* are not cross-platform, and thus not suitable for the freetype API.   */
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Face_From_FSRef( FT_Library    library,
-                          const FSRef*  ref,
-                          FT_Long       face_index,
-                          FT_Face*      aface )
-  {
-    FT_Error      error;
-    FT_Open_Args  args;
-
-    OSErr  err;
-    UInt8  pathname[PATH_MAX];
-
-
-    /* check of `library' and `aface' delayed to */
-    /* `FT_New_Face_From_Resource'               */
-
-    if ( !ref )
-      return FT_THROW( Invalid_Argument );
-
-    err = FSRefMakePath( ref, pathname, sizeof ( pathname ) );
-    if ( err )
-      error = FT_THROW( Cannot_Open_Resource );
-
-    error = FT_New_Face_From_Resource( library, pathname, face_index, aface );
-    if ( error != 0 || *aface != NULL )
-      return error;
-
-    /* fallback to datafork font */
-    args.flags    = FT_OPEN_PATHNAME;
-    args.pathname = (char*)pathname;
-    return FT_Open_Face( library, &args, face_index, aface );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    FT_New_Face_From_FSSpec                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    FT_New_Face_From_FSSpec is identical to FT_New_Face except it      */
-  /*    accepts an FSSpec instead of a path.                               */
-  /*                                                                       */
-  /* This function is deprecated because FSSpec is deprecated in Mac OS X  */
-  FT_EXPORT_DEF( FT_Error )
-  FT_New_Face_From_FSSpec( FT_Library     library,
-                           const FSSpec*  spec,
-                           FT_Long        face_index,
-                           FT_Face*       aface )
-  {
-#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \
-      ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) )
-    FT_UNUSED( library );
-    FT_UNUSED( spec );
-    FT_UNUSED( face_index );
-    FT_UNUSED( aface );
-
-    return FT_THROW( Unimplemented_Feature );
-#else
-    FSRef  ref;
-
-
-    /* check of `library' and `aface' delayed to `FT_New_Face_From_FSRef' */
-
-    if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr )
-      return FT_THROW( Invalid_Argument );
-    else
-      return FT_New_Face_From_FSRef( library, &ref, face_index, aface );
-#endif
-  }
-
-#endif /* FT_MACINTOSH */
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftotval.c b/third_party/freetype/src/base/ftotval.c
deleted file mode 100644
index 786457b..0000000
--- a/third_party/freetype/src/base/ftotval.c
+++ /dev/null
@@ -1,91 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftotval.c                                                              */
-/*                                                                         */
-/*    FreeType API for validating OpenType tables (body).                  */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_OPENTYPE_VALIDATE_H
-#include FT_OPENTYPE_VALIDATE_H
-
-
-  /* documentation is in ftotval.h */
-
-  FT_EXPORT_DEF( 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 )
-  {
-    FT_Service_OTvalidate  service;
-    FT_Error               error;
-
-
-    if ( !face )
-    {
-      error = FT_THROW( Invalid_Face_Handle );
-      goto Exit;
-    }
-
-    if ( !( BASE_table &&
-            GDEF_table &&
-            GPOS_table &&
-            GSUB_table &&
-            JSTF_table ) )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE );
-
-    if ( service )
-      error = service->validate( face,
-                                 validation_flags,
-                                 BASE_table,
-                                 GDEF_table,
-                                 GPOS_table,
-                                 GSUB_table,
-                                 JSTF_table );
-    else
-      error = FT_THROW( Unimplemented_Feature );
-
-  Exit:
-    return error;
-  }
-
-
-  FT_EXPORT_DEF( void )
-  FT_OpenType_Free( FT_Face   face,
-                    FT_Bytes  table )
-  {
-    FT_Memory  memory;
-
-
-    if ( !face )
-      return;
-
-    memory = FT_FACE_MEMORY( face );
-
-    FT_FREE( table );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftpatent.c b/third_party/freetype/src/base/ftpatent.c
deleted file mode 100644
index bf2b085..0000000
--- a/third_party/freetype/src/base/ftpatent.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpatent.c                                                             */
-/*                                                                         */
-/*    FreeType API for checking patented TrueType bytecode instructions    */
-/*    (body).                                                              */
-/*                                                                         */
-/*  Copyright 2007-2015 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.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_INTERNAL_STREAM_H
-#include FT_SERVICE_SFNT_H
-#include FT_SERVICE_TRUETYPE_GLYF_H
-
-
-  static FT_Bool
-  _tt_check_patents_in_range( FT_Stream  stream,
-                              FT_ULong   size )
-  {
-    FT_Bool   result = FALSE;
-    FT_Error  error;
-    FT_Bytes  p, end;
-
-
-    if ( FT_FRAME_ENTER( size ) )
-      return 0;
-
-    p   = stream->cursor;
-    end = p + size;
-
-    while ( p < end )
-    {
-      switch (p[0])
-      {
-      case 0x06:  /* SPvTL // */
-      case 0x07:  /* SPvTL +  */
-      case 0x08:  /* SFvTL // */
-      case 0x09:  /* SFvTL +  */
-      case 0x0A:  /* SPvFS    */
-      case 0x0B:  /* SFvFS    */
-        result = TRUE;
-        goto Exit;
-
-      case 0x40:
-        if ( p + 1 >= end )
-          goto Exit;
-
-        p += p[1] + 2;
-        break;
-
-      case 0x41:
-        if ( p + 1 >= end )
-          goto Exit;
-
-        p += p[1] * 2 + 2;
-        break;
-
-      case 0x71:  /* DELTAP2 */
-      case 0x72:  /* DELTAP3 */
-      case 0x73:  /* DELTAC0 */
-      case 0x74:  /* DELTAC1 */
-      case 0x75:  /* DELTAC2 */
-        result = TRUE;
-        goto Exit;
-
-      case 0xB0:
-      case 0xB1:
-      case 0xB2:
-      case 0xB3:
-      case 0xB4:
-      case 0xB5:
-      case 0xB6:
-      case 0xB7:
-        p += ( p[0] - 0xB0 ) + 2;
-        break;
-
-      case 0xB8:
-      case 0xB9:
-      case 0xBA:
-      case 0xBB:
-      case 0xBC:
-      case 0xBD:
-      case 0xBE:
-      case 0xBF:
-        p += ( p[0] - 0xB8 ) * 2 + 3;
-        break;
-
-      default:
-        p += 1;
-        break;
-      }
-    }
-
-  Exit:
-    FT_UNUSED( error );
-    FT_FRAME_EXIT();
-    return result;
-  }
-
-
-  static FT_Bool
-  _tt_check_patents_in_table( FT_Face   face,
-                              FT_ULong  tag )
-  {
-    FT_Stream              stream = face->stream;
-    FT_Error               error  = FT_Err_Ok;
-    FT_Service_SFNT_Table  service;
-    FT_Bool                result = FALSE;
-
-
-    FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE );
-
-    if ( service )
-    {
-      FT_UInt   i = 0;
-      FT_ULong  tag_i = 0, offset_i = 0, length_i = 0;
-
-
-      for ( i = 0; !error && tag_i != tag ; i++ )
-        error = service->table_info( face, i,
-                                     &tag_i, &offset_i, &length_i );
-
-      if ( error                      ||
-           FT_STREAM_SEEK( offset_i ) )
-        goto Exit;
-
-      result = _tt_check_patents_in_range( stream, length_i );
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  static FT_Bool
-  _tt_face_check_patents( FT_Face  face )
-  {
-    FT_Stream  stream = face->stream;
-    FT_UInt    gindex;
-    FT_Error   error;
-    FT_Bool    result;
-
-    FT_Service_TTGlyf  service;
-
-
-    result = _tt_check_patents_in_table( face, TTAG_fpgm );
-    if ( result )
-      goto Exit;
-
-    result = _tt_check_patents_in_table( face, TTAG_prep );
-    if ( result )
-      goto Exit;
-
-    FT_FACE_FIND_SERVICE( face, service, TT_GLYF );
-    if ( service == NULL )
-      goto Exit;
-
-    for ( gindex = 0; gindex < (FT_UInt)face->num_glyphs; gindex++ )
-    {
-      FT_ULong  offset, num_ins, size;
-      FT_Int    num_contours;
-
-
-      offset = service->get_location( face, gindex, &size );
-      if ( size == 0 )
-        continue;
-
-      if ( FT_STREAM_SEEK( offset )      ||
-           FT_READ_SHORT( num_contours ) )
-        continue;
-
-      if ( num_contours >= 0 )  /* simple glyph */
-      {
-        if ( FT_STREAM_SKIP( 8 + num_contours * 2 ) )
-          continue;
-      }
-      else  /* compound glyph */
-      {
-        FT_Bool  has_instr = 0;
-
-
-        if ( FT_STREAM_SKIP( 8 ) )
-          continue;
-
-        /* now read each component */
-        for (;;)
-        {
-          FT_UInt  flags, toskip;
-
-
-          if( FT_READ_USHORT( flags ) )
-            break;
-
-          toskip = 2 + 1 + 1;
-
-          if ( ( flags & ( 1 << 0 ) ) != 0 )       /* ARGS_ARE_WORDS */
-            toskip += 2;
-
-          if ( ( flags & ( 1 << 3 ) ) != 0 )       /* WE_HAVE_A_SCALE */
-            toskip += 2;
-          else if ( ( flags & ( 1 << 6 ) ) != 0 )  /* WE_HAVE_X_Y_SCALE */
-            toskip += 4;
-          else if ( ( flags & ( 1 << 7 ) ) != 0 )  /* WE_HAVE_A_2x2 */
-            toskip += 8;
-
-          if ( ( flags & ( 1 << 8 ) ) != 0 )       /* WE_HAVE_INSTRUCTIONS */
-            has_instr = 1;
-
-          if ( FT_STREAM_SKIP( toskip ) )
-            goto NextGlyph;
-
-          if ( ( flags & ( 1 << 5 ) ) == 0 )       /* MORE_COMPONENTS */
-            break;
-        }
-
-        if ( !has_instr )
-          goto NextGlyph;
-      }
-
-      if ( FT_READ_USHORT( num_ins ) )
-        continue;
-
-      result = _tt_check_patents_in_range( stream, num_ins );
-      if ( result )
-        goto Exit;
-
-    NextGlyph:
-      ;
-    }
-
-  Exit:
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Bool )
-  FT_Face_CheckTrueTypePatents( FT_Face  face )
-  {
-    FT_Bool  result = FALSE;
-
-
-    if ( face && FT_IS_SFNT( face ) )
-      result = _tt_face_check_patents( face );
-
-    return result;
-  }
-
-
-  /* documentation is in freetype.h */
-
-  FT_EXPORT_DEF( FT_Bool )
-  FT_Face_SetUnpatentedHinting( FT_Face  face,
-                                FT_Bool  value )
-  {
-    FT_Bool  result = FALSE;
-
-
-#if defined( TT_CONFIG_OPTION_UNPATENTED_HINTING ) && \
-    !defined( TT_CONFIG_OPTION_BYTECODE_INTERPRETER )
-    if ( face && FT_IS_SFNT( face ) )
-    {
-      result = !face->internal->ignore_unpatented_hinter;
-      face->internal->ignore_unpatented_hinter = !value;
-    }
-#else
-    FT_UNUSED( face );
-    FT_UNUSED( value );
-#endif
-
-    return result;
-  }
-
-/* END */
diff --git a/third_party/freetype/src/base/ftpfr.c b/third_party/freetype/src/base/ftpfr.c
deleted file mode 100644
index 39f089e..0000000
--- a/third_party/freetype/src/base/ftpfr.c
+++ /dev/null
@@ -1,153 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftpfr.c                                                                */
-/*                                                                         */
-/*    FreeType API for accessing PFR-specific data (body).                 */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_PFR_H
-
-
-  /* check the format */
-  static FT_Service_PfrMetrics
-  ft_pfr_check( FT_Face  face )
-  {
-    FT_Service_PfrMetrics  service = NULL;
-
-
-    if ( face )
-      FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
-
-    return service;
-  }
-
-
-  /* documentation is in ftpfr.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_PFR_Metrics( FT_Face    face,
-                      FT_UInt   *aoutline_resolution,
-                      FT_UInt   *ametrics_resolution,
-                      FT_Fixed  *ametrics_x_scale,
-                      FT_Fixed  *ametrics_y_scale )
-  {
-    FT_Error               error = FT_Err_Ok;
-    FT_Service_PfrMetrics  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    service = ft_pfr_check( face );
-    if ( service )
-    {
-      error = service->get_metrics( face,
-                                    aoutline_resolution,
-                                    ametrics_resolution,
-                                    ametrics_x_scale,
-                                    ametrics_y_scale );
-    }
-    else
-    {
-      FT_Fixed  x_scale, y_scale;
-
-
-      /* this is not a PFR font */
-      if ( aoutline_resolution )
-        *aoutline_resolution = face->units_per_EM;
-
-      if ( ametrics_resolution )
-        *ametrics_resolution = face->units_per_EM;
-
-      x_scale = y_scale = 0x10000L;
-      if ( face->size )
-      {
-        x_scale = face->size->metrics.x_scale;
-        y_scale = face->size->metrics.y_scale;
-      }
-
-      if ( ametrics_x_scale )
-        *ametrics_x_scale = x_scale;
-
-      if ( ametrics_y_scale )
-        *ametrics_y_scale = y_scale;
-
-      error = FT_THROW( Unknown_File_Format );
-    }
-
-    return error;
-  }
-
-
-  /* documentation is in ftpfr.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_PFR_Kerning( FT_Face     face,
-                      FT_UInt     left,
-                      FT_UInt     right,
-                      FT_Vector  *avector )
-  {
-    FT_Error               error;
-    FT_Service_PfrMetrics  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !avector )
-      return FT_THROW( Invalid_Argument );
-
-    service = ft_pfr_check( face );
-    if ( service )
-      error = service->get_kerning( face, left, right, avector );
-    else
-      error = FT_Get_Kerning( face, left, right,
-                              FT_KERNING_UNSCALED, avector );
-
-    return error;
-  }
-
-
-  /* documentation is in ftpfr.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_PFR_Advance( FT_Face   face,
-                      FT_UInt   gindex,
-                      FT_Pos   *aadvance )
-  {
-    FT_Error               error;
-    FT_Service_PfrMetrics  service;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !aadvance )
-      return FT_THROW( Invalid_Argument );
-
-    service = ft_pfr_check( face );
-    if ( service )
-      error = service->get_advance( face, gindex, aadvance );
-    else
-      /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftstroke.c b/third_party/freetype/src/base/ftstroke.c
deleted file mode 100644
index fecb3cc..0000000
--- a/third_party/freetype/src/base/ftstroke.c
+++ /dev/null
@@ -1,2468 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftstroke.c                                                             */
-/*                                                                         */
-/*    FreeType path stroker (body).                                        */
-/*                                                                         */
-/*  Copyright 2002-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_STROKER_H
-#include FT_TRIGONOMETRY_H
-#include FT_OUTLINE_H
-#include FT_INTERNAL_MEMORY_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-
-#include "basepic.h"
-
-
-  /* declare an extern to access `ft_outline_glyph_class' globally     */
-  /* allocated  in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */
-  /* macro to access it when FT_CONFIG_OPTION_PIC is defined           */
-#ifndef FT_CONFIG_OPTION_PIC
-  FT_CALLBACK_TABLE const FT_Glyph_Class  ft_outline_glyph_class;
-#endif
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_StrokerBorder )
-  FT_Outline_GetInsideBorder( FT_Outline*  outline )
-  {
-    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
-
-
-    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT
-                                        : FT_STROKER_BORDER_LEFT;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_StrokerBorder )
-  FT_Outline_GetOutsideBorder( FT_Outline*  outline )
-  {
-    FT_Orientation  o = FT_Outline_Get_Orientation( outline );
-
-
-    return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT
-                                        : FT_STROKER_BORDER_RIGHT;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                      BEZIER COMPUTATIONS                      *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#define FT_SMALL_CONIC_THRESHOLD  ( FT_ANGLE_PI / 6 )
-#define FT_SMALL_CUBIC_THRESHOLD  ( FT_ANGLE_PI / 8 )
-
-#define FT_EPSILON  2
-
-#define FT_IS_SMALL( x )  ( (x) > -FT_EPSILON && (x) < FT_EPSILON )
-
-
-  static FT_Pos
-  ft_pos_abs( FT_Pos  x )
-  {
-    return x >= 0 ? x : -x;
-  }
-
-
-  static void
-  ft_conic_split( FT_Vector*  base )
-  {
-    FT_Pos  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 FT_Bool
-  ft_conic_is_small_enough( FT_Vector*  base,
-                            FT_Angle   *angle_in,
-                            FT_Angle   *angle_out )
-  {
-    FT_Vector  d1, d2;
-    FT_Angle   theta;
-    FT_Int     close1, close2;
-
-
-    d1.x = base[1].x - base[2].x;
-    d1.y = base[1].y - base[2].y;
-    d2.x = base[0].x - base[1].x;
-    d2.y = base[0].y - base[1].y;
-
-    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
-    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
-
-    if ( close1 )
-    {
-      if ( close2 )
-      {
-        /* basically a point;                      */
-        /* do nothing to retain original direction */
-      }
-      else
-      {
-        *angle_in  =
-        *angle_out = FT_Atan2( d2.x, d2.y );
-      }
-    }
-    else /* !close1 */
-    {
-      if ( close2 )
-      {
-        *angle_in  =
-        *angle_out = FT_Atan2( d1.x, d1.y );
-      }
-      else
-      {
-        *angle_in  = FT_Atan2( d1.x, d1.y );
-        *angle_out = FT_Atan2( d2.x, d2.y );
-      }
-    }
-
-    theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) );
-
-    return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD );
-  }
-
-
-  static void
-  ft_cubic_split( FT_Vector*  base )
-  {
-    FT_Pos  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;
-  }
-
-
-  /* Return the average of `angle1' and `angle2'.            */
-  /* This gives correct result even if `angle1' and `angle2' */
-  /* have opposite signs.                                    */
-  static FT_Angle
-  ft_angle_mean( FT_Angle  angle1,
-                 FT_Angle  angle2 )
-  {
-    return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2;
-  }
-
-
-  static FT_Bool
-  ft_cubic_is_small_enough( FT_Vector*  base,
-                            FT_Angle   *angle_in,
-                            FT_Angle   *angle_mid,
-                            FT_Angle   *angle_out )
-  {
-    FT_Vector  d1, d2, d3;
-    FT_Angle   theta1, theta2;
-    FT_Int     close1, close2, close3;
-
-
-    d1.x = base[2].x - base[3].x;
-    d1.y = base[2].y - base[3].y;
-    d2.x = base[1].x - base[2].x;
-    d2.y = base[1].y - base[2].y;
-    d3.x = base[0].x - base[1].x;
-    d3.y = base[0].y - base[1].y;
-
-    close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y );
-    close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y );
-    close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y );
-
-    if ( close1 )
-    {
-      if ( close2 )
-      {
-        if ( close3 )
-        {
-          /* basically a point;                      */
-          /* do nothing to retain original direction */
-        }
-        else /* !close3 */
-        {
-          *angle_in  =
-          *angle_mid =
-          *angle_out = FT_Atan2( d3.x, d3.y );
-        }
-      }
-      else /* !close2 */
-      {
-        if ( close3 )
-        {
-          *angle_in  =
-          *angle_mid =
-          *angle_out = FT_Atan2( d2.x, d2.y );
-        }
-        else /* !close3 */
-        {
-          *angle_in  =
-          *angle_mid = FT_Atan2( d2.x, d2.y );
-          *angle_out = FT_Atan2( d3.x, d3.y );
-        }
-      }
-    }
-    else /* !close1 */
-    {
-      if ( close2 )
-      {
-        if ( close3 )
-        {
-          *angle_in  =
-          *angle_mid =
-          *angle_out = FT_Atan2( d1.x, d1.y );
-        }
-        else /* !close3 */
-        {
-          *angle_in  = FT_Atan2( d1.x, d1.y );
-          *angle_out = FT_Atan2( d3.x, d3.y );
-          *angle_mid = ft_angle_mean( *angle_in, *angle_out );
-        }
-      }
-      else /* !close2 */
-      {
-        if ( close3 )
-        {
-          *angle_in  = FT_Atan2( d1.x, d1.y );
-          *angle_mid =
-          *angle_out = FT_Atan2( d2.x, d2.y );
-        }
-        else /* !close3 */
-        {
-          *angle_in  = FT_Atan2( d1.x, d1.y );
-          *angle_mid = FT_Atan2( d2.x, d2.y );
-          *angle_out = FT_Atan2( d3.x, d3.y );
-        }
-      }
-    }
-
-    theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in,  *angle_mid ) );
-    theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) );
-
-    return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD &&
-                    theta2 < FT_SMALL_CUBIC_THRESHOLD );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       STROKE BORDERS                          *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  typedef enum  FT_StrokeTags_
-  {
-    FT_STROKE_TAG_ON    = 1,   /* on-curve point  */
-    FT_STROKE_TAG_CUBIC = 2,   /* cubic off-point */
-    FT_STROKE_TAG_BEGIN = 4,   /* sub-path start  */
-    FT_STROKE_TAG_END   = 8    /* sub-path end    */
-
-  } FT_StrokeTags;
-
-#define  FT_STROKE_TAG_BEGIN_END  ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END )
-
-  typedef struct  FT_StrokeBorderRec_
-  {
-    FT_UInt     num_points;
-    FT_UInt     max_points;
-    FT_Vector*  points;
-    FT_Byte*    tags;
-    FT_Bool     movable;  /* TRUE for ends of lineto borders */
-    FT_Int      start;    /* index of current sub-path start point */
-    FT_Memory   memory;
-    FT_Bool     valid;
-
-  } FT_StrokeBorderRec, *FT_StrokeBorder;
-
-
-  static FT_Error
-  ft_stroke_border_grow( FT_StrokeBorder  border,
-                         FT_UInt          new_points )
-  {
-    FT_UInt   old_max = border->max_points;
-    FT_UInt   new_max = border->num_points + new_points;
-    FT_Error  error   = FT_Err_Ok;
-
-
-    if ( new_max > old_max )
-    {
-      FT_UInt    cur_max = old_max;
-      FT_Memory  memory  = border->memory;
-
-
-      while ( cur_max < new_max )
-        cur_max += ( cur_max >> 1 ) + 16;
-
-      if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) ||
-           FT_RENEW_ARRAY( border->tags,   old_max, cur_max ) )
-        goto Exit;
-
-      border->max_points = cur_max;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  ft_stroke_border_close( FT_StrokeBorder  border,
-                          FT_Bool          reverse )
-  {
-    FT_UInt  start = (FT_UInt)border->start;
-    FT_UInt  count = border->num_points;
-
-
-    FT_ASSERT( border->start >= 0 );
-
-    /* don't record empty paths! */
-    if ( count <= start + 1U )
-      border->num_points = start;
-    else
-    {
-      /* copy the last point to the start of this sub-path, since */
-      /* it contains the `adjusted' starting coordinates          */
-      border->num_points    = --count;
-      border->points[start] = border->points[count];
-
-      if ( reverse )
-      {
-        /* reverse the points */
-        {
-          FT_Vector*  vec1 = border->points + start + 1;
-          FT_Vector*  vec2 = border->points + count - 1;
-
-
-          for ( ; vec1 < vec2; vec1++, vec2-- )
-          {
-            FT_Vector  tmp;
-
-
-            tmp   = *vec1;
-            *vec1 = *vec2;
-            *vec2 = tmp;
-          }
-        }
-
-        /* then the tags */
-        {
-          FT_Byte*  tag1 = border->tags + start + 1;
-          FT_Byte*  tag2 = border->tags + count - 1;
-
-
-          for ( ; tag1 < tag2; tag1++, tag2-- )
-          {
-            FT_Byte  tmp;
-
-
-            tmp   = *tag1;
-            *tag1 = *tag2;
-            *tag2 = tmp;
-          }
-        }
-      }
-
-      border->tags[start    ] |= FT_STROKE_TAG_BEGIN;
-      border->tags[count - 1] |= FT_STROKE_TAG_END;
-    }
-
-    border->start   = -1;
-    border->movable = FALSE;
-  }
-
-
-  static FT_Error
-  ft_stroke_border_lineto( FT_StrokeBorder  border,
-                           FT_Vector*       to,
-                           FT_Bool          movable )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    FT_ASSERT( border->start >= 0 );
-
-    if ( border->movable )
-    {
-      /* move last point */
-      border->points[border->num_points - 1] = *to;
-    }
-    else
-    {
-      /* don't add zero-length lineto */
-      if ( border->num_points > 0                                          &&
-           FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) &&
-           FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) )
-        return error;
-
-      /* add one point */
-      error = ft_stroke_border_grow( border, 1 );
-      if ( !error )
-      {
-        FT_Vector*  vec = border->points + border->num_points;
-        FT_Byte*    tag = border->tags   + border->num_points;
-
-
-        vec[0] = *to;
-        tag[0] = FT_STROKE_TAG_ON;
-
-        border->num_points += 1;
-      }
-    }
-    border->movable = movable;
-    return error;
-  }
-
-
-  static FT_Error
-  ft_stroke_border_conicto( FT_StrokeBorder  border,
-                            FT_Vector*       control,
-                            FT_Vector*       to )
-  {
-    FT_Error  error;
-
-
-    FT_ASSERT( border->start >= 0 );
-
-    error = ft_stroke_border_grow( border, 2 );
-    if ( !error )
-    {
-      FT_Vector*  vec = border->points + border->num_points;
-      FT_Byte*    tag = border->tags   + border->num_points;
-
-
-      vec[0] = *control;
-      vec[1] = *to;
-
-      tag[0] = 0;
-      tag[1] = FT_STROKE_TAG_ON;
-
-      border->num_points += 2;
-    }
-
-    border->movable = FALSE;
-
-    return error;
-  }
-
-
-  static FT_Error
-  ft_stroke_border_cubicto( FT_StrokeBorder  border,
-                            FT_Vector*       control1,
-                            FT_Vector*       control2,
-                            FT_Vector*       to )
-  {
-    FT_Error  error;
-
-
-    FT_ASSERT( border->start >= 0 );
-
-    error = ft_stroke_border_grow( border, 3 );
-    if ( !error )
-    {
-      FT_Vector*  vec = border->points + border->num_points;
-      FT_Byte*    tag = border->tags   + border->num_points;
-
-
-      vec[0] = *control1;
-      vec[1] = *control2;
-      vec[2] = *to;
-
-      tag[0] = FT_STROKE_TAG_CUBIC;
-      tag[1] = FT_STROKE_TAG_CUBIC;
-      tag[2] = FT_STROKE_TAG_ON;
-
-      border->num_points += 3;
-    }
-
-    border->movable = FALSE;
-
-    return error;
-  }
-
-
-#define FT_ARC_CUBIC_ANGLE  ( FT_ANGLE_PI / 2 )
-
-
-  static FT_Error
-  ft_stroke_border_arcto( FT_StrokeBorder  border,
-                          FT_Vector*       center,
-                          FT_Fixed         radius,
-                          FT_Angle         angle_start,
-                          FT_Angle         angle_diff )
-  {
-    FT_Angle   total, angle, step, rotate, next, theta;
-    FT_Vector  a, b, a2, b2;
-    FT_Fixed   length;
-    FT_Error   error = FT_Err_Ok;
-
-
-    /* compute start point */
-    FT_Vector_From_Polar( &a, radius, angle_start );
-    a.x += center->x;
-    a.y += center->y;
-
-    total  = angle_diff;
-    angle  = angle_start;
-    rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2;
-
-    while ( total != 0 )
-    {
-      step = total;
-      if ( step > FT_ARC_CUBIC_ANGLE )
-        step = FT_ARC_CUBIC_ANGLE;
-
-      else if ( step < -FT_ARC_CUBIC_ANGLE )
-        step = -FT_ARC_CUBIC_ANGLE;
-
-      next  = angle + step;
-      theta = step;
-      if ( theta < 0 )
-        theta = -theta;
-
-      theta >>= 1;
-
-      /* compute end point */
-      FT_Vector_From_Polar( &b, radius, next );
-      b.x += center->x;
-      b.y += center->y;
-
-      /* compute first and second control points */
-      length = FT_MulDiv( radius, FT_Sin( theta ) * 4,
-                          ( 0x10000L + FT_Cos( theta ) ) * 3 );
-
-      FT_Vector_From_Polar( &a2, length, angle + rotate );
-      a2.x += a.x;
-      a2.y += a.y;
-
-      FT_Vector_From_Polar( &b2, length, next - rotate );
-      b2.x += b.x;
-      b2.y += b.y;
-
-      /* add cubic arc */
-      error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
-      if ( error )
-        break;
-
-      /* process the rest of the arc ?? */
-      a      = b;
-      total -= step;
-      angle  = next;
-    }
-
-    return error;
-  }
-
-
-  static FT_Error
-  ft_stroke_border_moveto( FT_StrokeBorder  border,
-                           FT_Vector*       to )
-  {
-    /* close current open path if any ? */
-    if ( border->start >= 0 )
-      ft_stroke_border_close( border, FALSE );
-
-    border->start = (FT_Int)border->num_points;
-    border->movable = FALSE;
-
-    return ft_stroke_border_lineto( border, to, FALSE );
-  }
-
-
-  static void
-  ft_stroke_border_init( FT_StrokeBorder  border,
-                         FT_Memory        memory )
-  {
-    border->memory = memory;
-    border->points = NULL;
-    border->tags   = NULL;
-
-    border->num_points = 0;
-    border->max_points = 0;
-    border->start      = -1;
-    border->valid      = FALSE;
-  }
-
-
-  static void
-  ft_stroke_border_reset( FT_StrokeBorder  border )
-  {
-    border->num_points = 0;
-    border->start      = -1;
-    border->valid      = FALSE;
-  }
-
-
-  static void
-  ft_stroke_border_done( FT_StrokeBorder  border )
-  {
-    FT_Memory  memory = border->memory;
-
-
-    FT_FREE( border->points );
-    FT_FREE( border->tags );
-
-    border->num_points = 0;
-    border->max_points = 0;
-    border->start      = -1;
-    border->valid      = FALSE;
-  }
-
-
-  static FT_Error
-  ft_stroke_border_get_counts( FT_StrokeBorder  border,
-                               FT_UInt         *anum_points,
-                               FT_UInt         *anum_contours )
-  {
-    FT_Error  error        = FT_Err_Ok;
-    FT_UInt   num_points   = 0;
-    FT_UInt   num_contours = 0;
-
-    FT_UInt     count      = border->num_points;
-    FT_Vector*  point      = border->points;
-    FT_Byte*    tags       = border->tags;
-    FT_Int      in_contour = 0;
-
-
-    for ( ; count > 0; count--, num_points++, point++, tags++ )
-    {
-      if ( tags[0] & FT_STROKE_TAG_BEGIN )
-      {
-        if ( in_contour != 0 )
-          goto Fail;
-
-        in_contour = 1;
-      }
-      else if ( in_contour == 0 )
-        goto Fail;
-
-      if ( tags[0] & FT_STROKE_TAG_END )
-      {
-        in_contour = 0;
-        num_contours++;
-      }
-    }
-
-    if ( in_contour != 0 )
-      goto Fail;
-
-    border->valid = TRUE;
-
-  Exit:
-    *anum_points   = num_points;
-    *anum_contours = num_contours;
-    return error;
-
-  Fail:
-    num_points   = 0;
-    num_contours = 0;
-    goto Exit;
-  }
-
-
-  static void
-  ft_stroke_border_export( FT_StrokeBorder  border,
-                           FT_Outline*      outline )
-  {
-    /* copy point locations */
-    FT_ARRAY_COPY( outline->points + outline->n_points,
-                   border->points,
-                   border->num_points );
-
-    /* copy tags */
-    {
-      FT_UInt   count = border->num_points;
-      FT_Byte*  read  = border->tags;
-      FT_Byte*  write = (FT_Byte*)outline->tags + outline->n_points;
-
-
-      for ( ; count > 0; count--, read++, write++ )
-      {
-        if ( *read & FT_STROKE_TAG_ON )
-          *write = FT_CURVE_TAG_ON;
-        else if ( *read & FT_STROKE_TAG_CUBIC )
-          *write = FT_CURVE_TAG_CUBIC;
-        else
-          *write = FT_CURVE_TAG_CONIC;
-      }
-    }
-
-    /* copy contours */
-    {
-      FT_UInt    count = border->num_points;
-      FT_Byte*   tags  = border->tags;
-      FT_Short*  write = outline->contours + outline->n_contours;
-      FT_Short   idx   = (FT_Short)outline->n_points;
-
-
-      for ( ; count > 0; count--, tags++, idx++ )
-      {
-        if ( *tags & FT_STROKE_TAG_END )
-        {
-          *write++ = idx;
-          outline->n_contours++;
-        }
-      }
-    }
-
-    outline->n_points += (short)border->num_points;
-
-    FT_ASSERT( FT_Outline_Check( outline ) == 0 );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                           STROKER                             *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-#define FT_SIDE_TO_ROTATE( s )   ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI )
-
-  typedef struct  FT_StrokerRec_
-  {
-    FT_Angle             angle_in;             /* direction into curr join */
-    FT_Angle             angle_out;            /* direction out of join  */
-    FT_Vector            center;               /* current position */
-    FT_Fixed             line_length;          /* length of last lineto */
-    FT_Bool              first_point;          /* is this the start? */
-    FT_Bool              subpath_open;         /* is the subpath open? */
-    FT_Angle             subpath_angle;        /* subpath start direction */
-    FT_Vector            subpath_start;        /* subpath start position */
-    FT_Fixed             subpath_line_length;  /* subpath start lineto len */
-    FT_Bool              handle_wide_strokes;  /* use wide strokes logic? */
-
-    FT_Stroker_LineCap   line_cap;
-    FT_Stroker_LineJoin  line_join;
-    FT_Stroker_LineJoin  line_join_saved;
-    FT_Fixed             miter_limit;
-    FT_Fixed             radius;
-
-    FT_StrokeBorderRec   borders[2];
-    FT_Library           library;
-
-  } FT_StrokerRec;
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_New( FT_Library   library,
-                  FT_Stroker  *astroker )
-  {
-    FT_Error    error;           /* assigned in FT_NEW */
-    FT_Memory   memory;
-    FT_Stroker  stroker = NULL;
-
-
-    if ( !library )
-      return FT_THROW( Invalid_Library_Handle );
-
-    if ( !astroker )
-      return FT_THROW( Invalid_Argument );
-
-    memory = library->memory;
-
-    if ( !FT_NEW( stroker ) )
-    {
-      stroker->library = library;
-
-      ft_stroke_border_init( &stroker->borders[0], memory );
-      ft_stroke_border_init( &stroker->borders[1], memory );
-    }
-
-    *astroker = stroker;
-
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Stroker_Set( FT_Stroker           stroker,
-                  FT_Fixed             radius,
-                  FT_Stroker_LineCap   line_cap,
-                  FT_Stroker_LineJoin  line_join,
-                  FT_Fixed             miter_limit )
-  {
-    if ( !stroker )
-      return;
-
-    stroker->radius      = radius;
-    stroker->line_cap    = line_cap;
-    stroker->line_join   = line_join;
-    stroker->miter_limit = miter_limit;
-
-    /* ensure miter limit has sensible value */
-    if ( stroker->miter_limit < 0x10000L )
-      stroker->miter_limit = 0x10000L;
-
-    /* save line join style:                                           */
-    /* line join style can be temporarily changed when stroking curves */
-    stroker->line_join_saved = line_join;
-
-    FT_Stroker_Rewind( stroker );
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Stroker_Rewind( FT_Stroker  stroker )
-  {
-    if ( stroker )
-    {
-      ft_stroke_border_reset( &stroker->borders[0] );
-      ft_stroke_border_reset( &stroker->borders[1] );
-    }
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Stroker_Done( FT_Stroker  stroker )
-  {
-    if ( stroker )
-    {
-      FT_Memory  memory = stroker->library->memory;
-
-
-      ft_stroke_border_done( &stroker->borders[0] );
-      ft_stroke_border_done( &stroker->borders[1] );
-
-      stroker->library = NULL;
-      FT_FREE( stroker );
-    }
-  }
-
-
-  /* create a circular arc at a corner or cap */
-  static FT_Error
-  ft_stroker_arcto( FT_Stroker  stroker,
-                    FT_Int      side )
-  {
-    FT_Angle         total, rotate;
-    FT_Fixed         radius = stroker->radius;
-    FT_Error         error  = FT_Err_Ok;
-    FT_StrokeBorder  border = stroker->borders + side;
-
-
-    rotate = FT_SIDE_TO_ROTATE( side );
-
-    total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
-    if ( total == FT_ANGLE_PI )
-      total = -rotate * 2;
-
-    error = ft_stroke_border_arcto( border,
-                                    &stroker->center,
-                                    radius,
-                                    stroker->angle_in + rotate,
-                                    total );
-    border->movable = FALSE;
-    return error;
-  }
-
-
-  /* add a cap at the end of an opened path */
-  static FT_Error
-  ft_stroker_cap( FT_Stroker  stroker,
-                  FT_Angle    angle,
-                  FT_Int      side )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND )
-    {
-      /* add a round cap */
-      stroker->angle_in  = angle;
-      stroker->angle_out = angle + FT_ANGLE_PI;
-
-      error = ft_stroker_arcto( stroker, side );
-    }
-    else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE )
-    {
-      /* add a square cap */
-      FT_Vector        delta, delta2;
-      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
-      FT_Fixed         radius = stroker->radius;
-      FT_StrokeBorder  border = stroker->borders + side;
-
-
-      FT_Vector_From_Polar( &delta2, radius, angle + rotate );
-      FT_Vector_From_Polar( &delta,  radius, angle );
-
-      delta.x += stroker->center.x + delta2.x;
-      delta.y += stroker->center.y + delta2.y;
-
-      error = ft_stroke_border_lineto( border, &delta, FALSE );
-      if ( error )
-        goto Exit;
-
-      FT_Vector_From_Polar( &delta2, radius, angle - rotate );
-      FT_Vector_From_Polar( &delta,  radius, angle );
-
-      delta.x += delta2.x + stroker->center.x;
-      delta.y += delta2.y + stroker->center.y;
-
-      error = ft_stroke_border_lineto( border, &delta, FALSE );
-    }
-    else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT )
-    {
-      /* add a butt ending */
-      FT_Vector        delta;
-      FT_Angle         rotate = FT_SIDE_TO_ROTATE( side );
-      FT_Fixed         radius = stroker->radius;
-      FT_StrokeBorder  border = stroker->borders + side;
-
-
-      FT_Vector_From_Polar( &delta, radius, angle + rotate );
-
-      delta.x += stroker->center.x;
-      delta.y += stroker->center.y;
-
-      error = ft_stroke_border_lineto( border, &delta, FALSE );
-      if ( error )
-        goto Exit;
-
-      FT_Vector_From_Polar( &delta, radius, angle - rotate );
-
-      delta.x += stroker->center.x;
-      delta.y += stroker->center.y;
-
-      error = ft_stroke_border_lineto( border, &delta, FALSE );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* process an inside corner, i.e. compute intersection */
-  static FT_Error
-  ft_stroker_inside( FT_Stroker  stroker,
-                     FT_Int      side,
-                     FT_Fixed    line_length )
-  {
-    FT_StrokeBorder  border = stroker->borders + side;
-    FT_Angle         phi, theta, rotate;
-    FT_Fixed         length, thcos;
-    FT_Vector        delta;
-    FT_Error         error = FT_Err_Ok;
-    FT_Bool          intersect;          /* use intersection of lines? */
-
-
-    rotate = FT_SIDE_TO_ROTATE( side );
-
-    theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
-
-    /* Only intersect borders if between two lineto's and both */
-    /* lines are long enough (line_length is zero for curves). */
-    /* Also avoid U-turns of nearly 180 degree.                */
-    if ( !border->movable || line_length == 0  ||
-         theta > 0x59C000 || theta < -0x59C000 )
-      intersect = FALSE;
-    else
-    {
-      /* compute minimum required length of lines */
-      FT_Fixed  min_length = ft_pos_abs( FT_MulFix( stroker->radius,
-                                                    FT_Tan( theta ) ) );
-
-
-      intersect = FT_BOOL( min_length                         &&
-                           stroker->line_length >= min_length &&
-                           line_length          >= min_length );
-    }
-
-    if ( !intersect )
-    {
-      FT_Vector_From_Polar( &delta, stroker->radius,
-                            stroker->angle_out + rotate );
-      delta.x += stroker->center.x;
-      delta.y += stroker->center.y;
-
-      border->movable = FALSE;
-    }
-    else
-    {
-      /* compute median angle */
-      phi = stroker->angle_in + theta;
-
-      thcos = FT_Cos( theta );
-
-      length = FT_DivFix( stroker->radius, thcos );
-
-      FT_Vector_From_Polar( &delta, length, phi + rotate );
-      delta.x += stroker->center.x;
-      delta.y += stroker->center.y;
-    }
-
-    error = ft_stroke_border_lineto( border, &delta, FALSE );
-
-    return error;
-  }
-
-
-  /* process an outside corner, i.e. compute bevel/miter/round */
-  static FT_Error
-  ft_stroker_outside( FT_Stroker  stroker,
-                      FT_Int      side,
-                      FT_Fixed    line_length )
-  {
-    FT_StrokeBorder  border = stroker->borders + side;
-    FT_Error         error;
-    FT_Angle         rotate;
-
-
-    if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND )
-      error = ft_stroker_arcto( stroker, side );
-    else
-    {
-      /* this is a mitered (pointed) or beveled (truncated) corner */
-      FT_Fixed  sigma = 0, radius = stroker->radius;
-      FT_Angle  theta = 0, phi = 0;
-      FT_Fixed  thcos = 0;
-      FT_Bool   bevel, fixed_bevel;
-
-
-      rotate = FT_SIDE_TO_ROTATE( side );
-
-      bevel =
-        FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL );
-
-      fixed_bevel =
-        FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE );
-
-      if ( !bevel )
-      {
-        theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
-
-        if ( theta == FT_ANGLE_PI )
-        {
-          theta = rotate;
-          phi   = stroker->angle_in;
-        }
-        else
-        {
-          theta /= 2;
-          phi    = stroker->angle_in + theta + rotate;
-        }
-
-        thcos = FT_Cos( theta );
-        sigma = FT_MulFix( stroker->miter_limit, thcos );
-
-        /* is miter limit exceeded? */
-        if ( sigma < 0x10000L )
-        {
-          /* don't create variable bevels for very small deviations; */
-          /* FT_Sin(x) = 0 for x <= 57                               */
-          if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
-            bevel = TRUE;
-        }
-      }
-
-      if ( bevel )  /* this is a bevel (broken angle) */
-      {
-        if ( fixed_bevel )
-        {
-          /* the outer corners are simply joined together */
-          FT_Vector  delta;
-
-
-          /* add bevel */
-          FT_Vector_From_Polar( &delta,
-                                radius,
-                                stroker->angle_out + rotate );
-          delta.x += stroker->center.x;
-          delta.y += stroker->center.y;
-
-          border->movable = FALSE;
-          error = ft_stroke_border_lineto( border, &delta, FALSE );
-        }
-        else /* variable bevel */
-        {
-          /* the miter is truncated */
-          FT_Vector  middle, delta;
-          FT_Fixed   length;
-
-
-          /* compute middle point */
-          FT_Vector_From_Polar( &middle,
-                                FT_MulFix( radius, stroker->miter_limit ),
-                                phi );
-          middle.x += stroker->center.x;
-          middle.y += stroker->center.y;
-
-          /* compute first angle point */
-          length = FT_MulDiv( radius, 0x10000L - sigma,
-                              ft_pos_abs( FT_Sin( theta ) ) );
-
-          FT_Vector_From_Polar( &delta, length, phi + rotate );
-          delta.x += middle.x;
-          delta.y += middle.y;
-
-          error = ft_stroke_border_lineto( border, &delta, FALSE );
-          if ( error )
-            goto Exit;
-
-          /* compute second angle point */
-          FT_Vector_From_Polar( &delta, length, phi - rotate );
-          delta.x += middle.x;
-          delta.y += middle.y;
-
-          error = ft_stroke_border_lineto( border, &delta, FALSE );
-          if ( error )
-            goto Exit;
-
-          /* finally, add an end point; only needed if not lineto */
-          /* (line_length is zero for curves)                     */
-          if ( line_length == 0 )
-          {
-            FT_Vector_From_Polar( &delta,
-                                  radius,
-                                  stroker->angle_out + rotate );
-
-            delta.x += stroker->center.x;
-            delta.y += stroker->center.y;
-
-            error = ft_stroke_border_lineto( border, &delta, FALSE );
-          }
-        }
-      }
-      else /* this is a miter (intersection) */
-      {
-        FT_Fixed   length;
-        FT_Vector  delta;
-
-
-        length = FT_DivFix( stroker->radius, thcos );
-
-        FT_Vector_From_Polar( &delta, length, phi );
-        delta.x += stroker->center.x;
-        delta.y += stroker->center.y;
-
-        error = ft_stroke_border_lineto( border, &delta, FALSE );
-        if ( error )
-          goto Exit;
-
-        /* now add an end point; only needed if not lineto */
-        /* (line_length is zero for curves)                */
-        if ( line_length == 0 )
-        {
-          FT_Vector_From_Polar( &delta,
-                                stroker->radius,
-                                stroker->angle_out + rotate );
-          delta.x += stroker->center.x;
-          delta.y += stroker->center.y;
-
-          error = ft_stroke_border_lineto( border, &delta, FALSE );
-        }
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  ft_stroker_process_corner( FT_Stroker  stroker,
-                             FT_Fixed    line_length )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_Angle  turn;
-    FT_Int    inside_side;
-
-
-    turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
-
-    /* no specific corner processing is required if the turn is 0 */
-    if ( turn == 0 )
-      goto Exit;
-
-    /* when we turn to the right, the inside side is 0 */
-    /* otherwise, the inside side is 1 */
-    inside_side = ( turn < 0 );
-
-    /* process the inside side */
-    error = ft_stroker_inside( stroker, inside_side, line_length );
-    if ( error )
-      goto Exit;
-
-    /* process the outside side */
-    error = ft_stroker_outside( stroker, !inside_side, line_length );
-
-  Exit:
-    return error;
-  }
-
-
-  /* add two points to the left and right borders corresponding to the */
-  /* start of the subpath                                              */
-  static FT_Error
-  ft_stroker_subpath_start( FT_Stroker  stroker,
-                            FT_Angle    start_angle,
-                            FT_Fixed    line_length )
-  {
-    FT_Vector        delta;
-    FT_Vector        point;
-    FT_Error         error;
-    FT_StrokeBorder  border;
-
-
-    FT_Vector_From_Polar( &delta, stroker->radius,
-                          start_angle + FT_ANGLE_PI2 );
-
-    point.x = stroker->center.x + delta.x;
-    point.y = stroker->center.y + delta.y;
-
-    border = stroker->borders;
-    error = ft_stroke_border_moveto( border, &point );
-    if ( error )
-      goto Exit;
-
-    point.x = stroker->center.x - delta.x;
-    point.y = stroker->center.y - delta.y;
-
-    border++;
-    error = ft_stroke_border_moveto( border, &point );
-
-    /* save angle, position, and line length for last join */
-    /* (line_length is zero for curves)                    */
-    stroker->subpath_angle       = start_angle;
-    stroker->first_point         = FALSE;
-    stroker->subpath_line_length = line_length;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_LineTo( FT_Stroker  stroker,
-                     FT_Vector*  to )
-  {
-    FT_Error         error = FT_Err_Ok;
-    FT_StrokeBorder  border;
-    FT_Vector        delta;
-    FT_Angle         angle;
-    FT_Int           side;
-    FT_Fixed         line_length;
-
-
-    if ( !stroker || !to )
-      return FT_THROW( Invalid_Argument );
-
-    delta.x = to->x - stroker->center.x;
-    delta.y = to->y - stroker->center.y;
-
-    /* a zero-length lineto is a no-op; avoid creating a spurious corner */
-    if ( delta.x == 0 && delta.y == 0 )
-       goto Exit;
-
-    /* compute length of line */
-    line_length = FT_Vector_Length( &delta );
-
-    angle = FT_Atan2( delta.x, delta.y );
-    FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 );
-
-    /* process corner if necessary */
-    if ( stroker->first_point )
-    {
-      /* This is the first segment of a subpath.  We need to     */
-      /* add a point to each border at their respective starting */
-      /* point locations.                                        */
-      error = ft_stroker_subpath_start( stroker, angle, line_length );
-      if ( error )
-        goto Exit;
-    }
-    else
-    {
-      /* process the current corner */
-      stroker->angle_out = angle;
-      error = ft_stroker_process_corner( stroker, line_length );
-      if ( error )
-        goto Exit;
-    }
-
-    /* now add a line segment to both the `inside' and `outside' paths */
-    for ( border = stroker->borders, side = 1; side >= 0; side--, border++ )
-    {
-      FT_Vector  point;
-
-
-      point.x = to->x + delta.x;
-      point.y = to->y + delta.y;
-
-      /* the ends of lineto borders are movable */
-      error = ft_stroke_border_lineto( border, &point, TRUE );
-      if ( error )
-        goto Exit;
-
-      delta.x = -delta.x;
-      delta.y = -delta.y;
-    }
-
-    stroker->angle_in    = angle;
-    stroker->center      = *to;
-    stroker->line_length = line_length;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_ConicTo( FT_Stroker  stroker,
-                      FT_Vector*  control,
-                      FT_Vector*  to )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_Vector   bez_stack[34];
-    FT_Vector*  arc;
-    FT_Vector*  limit = bez_stack + 30;
-    FT_Bool     first_arc = TRUE;
-
-
-    if ( !stroker || !control || !to )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* if all control points are coincident, this is a no-op; */
-    /* avoid creating a spurious corner                       */
-    if ( FT_IS_SMALL( stroker->center.x - control->x ) &&
-         FT_IS_SMALL( stroker->center.y - control->y ) &&
-         FT_IS_SMALL( control->x        - to->x      ) &&
-         FT_IS_SMALL( control->y        - to->y      ) )
-    {
-       stroker->center = *to;
-       goto Exit;
-    }
-
-    arc    = bez_stack;
-    arc[0] = *to;
-    arc[1] = *control;
-    arc[2] = stroker->center;
-
-    while ( arc >= bez_stack )
-    {
-      FT_Angle  angle_in, angle_out;
-
-
-      /* initialize with current direction */
-      angle_in = angle_out = stroker->angle_in;
-
-      if ( arc < limit                                             &&
-           !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
-      {
-        if ( stroker->first_point )
-          stroker->angle_in = angle_in;
-
-        ft_conic_split( arc );
-        arc += 2;
-        continue;
-      }
-
-      if ( first_arc )
-      {
-        first_arc = FALSE;
-
-        /* process corner if necessary */
-        if ( stroker->first_point )
-          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
-        else
-        {
-          stroker->angle_out = angle_in;
-          error = ft_stroker_process_corner( stroker, 0 );
-        }
-      }
-      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
-                  FT_SMALL_CONIC_THRESHOLD / 4                             )
-      {
-        /* if the deviation from one arc to the next is too great, */
-        /* add a round corner                                      */
-        stroker->center    = arc[2];
-        stroker->angle_out = angle_in;
-        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
-
-        error = ft_stroker_process_corner( stroker, 0 );
-
-        /* reinstate line join style */
-        stroker->line_join = stroker->line_join_saved;
-      }
-
-      if ( error )
-        goto Exit;
-
-      /* the arc's angle is small enough; we can add it directly to each */
-      /* border                                                          */
-      {
-        FT_Vector        ctrl, end;
-        FT_Angle         theta, phi, rotate, alpha0 = 0;
-        FT_Fixed         length;
-        FT_StrokeBorder  border;
-        FT_Int           side;
-
-
-        theta  = FT_Angle_Diff( angle_in, angle_out ) / 2;
-        phi    = angle_in + theta;
-        length = FT_DivFix( stroker->radius, FT_Cos( theta ) );
-
-        /* compute direction of original arc */
-        if ( stroker->handle_wide_strokes )
-          alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y );
-
-        for ( border = stroker->borders, side = 0;
-              side <= 1;
-              side++, border++ )
-        {
-          rotate = FT_SIDE_TO_ROTATE( side );
-
-          /* compute control point */
-          FT_Vector_From_Polar( &ctrl, length, phi + rotate );
-          ctrl.x += arc[1].x;
-          ctrl.y += arc[1].y;
-
-          /* compute end point */
-          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
-          end.x += arc[0].x;
-          end.y += arc[0].y;
-
-          if ( stroker->handle_wide_strokes )
-          {
-            FT_Vector  start;
-            FT_Angle   alpha1;
-
-
-            /* determine whether the border radius is greater than the */
-            /* radius of curvature of the original arc                 */
-            start = border->points[border->num_points - 1];
-
-            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
-
-            /* is the direction of the border arc opposite to */
-            /* that of the original arc? */
-            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
-                   FT_ANGLE_PI / 2                             )
-            {
-              FT_Angle   beta, gamma;
-              FT_Vector  bvec, delta;
-              FT_Fixed   blen, sinA, sinB, alen;
-
-
-              /* use the sine rule to find the intersection point */
-              beta  = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y );
-              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
-
-              bvec.x = end.x - start.x;
-              bvec.y = end.y - start.y;
-
-              blen = FT_Vector_Length( &bvec );
-
-              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
-              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
-
-              alen = FT_MulDiv( blen, sinA, sinB );
-
-              FT_Vector_From_Polar( &delta, alen, beta );
-              delta.x += start.x;
-              delta.y += start.y;
-
-              /* circumnavigate the negative sector backwards */
-              border->movable = FALSE;
-              error = ft_stroke_border_lineto( border, &delta, FALSE );
-              if ( error )
-                goto Exit;
-              error = ft_stroke_border_lineto( border, &end, FALSE );
-              if ( error )
-                goto Exit;
-              error = ft_stroke_border_conicto( border, &ctrl, &start );
-              if ( error )
-                goto Exit;
-              /* and then move to the endpoint */
-              error = ft_stroke_border_lineto( border, &end, FALSE );
-              if ( error )
-                goto Exit;
-
-              continue;
-            }
-
-            /* else fall through */
-          }
-
-          /* simply add an arc */
-          error = ft_stroke_border_conicto( border, &ctrl, &end );
-          if ( error )
-            goto Exit;
-        }
-      }
-
-      arc -= 2;
-
-      stroker->angle_in = angle_out;
-    }
-
-    stroker->center = *to;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_CubicTo( FT_Stroker  stroker,
-                      FT_Vector*  control1,
-                      FT_Vector*  control2,
-                      FT_Vector*  to )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_Vector   bez_stack[37];
-    FT_Vector*  arc;
-    FT_Vector*  limit = bez_stack + 32;
-    FT_Bool     first_arc = TRUE;
-
-
-    if ( !stroker || !control1 || !control2 || !to )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    /* if all control points are coincident, this is a no-op; */
-    /* avoid creating a spurious corner */
-    if ( FT_IS_SMALL( stroker->center.x - control1->x ) &&
-         FT_IS_SMALL( stroker->center.y - control1->y ) &&
-         FT_IS_SMALL( control1->x       - control2->x ) &&
-         FT_IS_SMALL( control1->y       - control2->y ) &&
-         FT_IS_SMALL( control2->x       - to->x       ) &&
-         FT_IS_SMALL( control2->y       - to->y       ) )
-    {
-       stroker->center = *to;
-       goto Exit;
-    }
-
-    arc    = bez_stack;
-    arc[0] = *to;
-    arc[1] = *control2;
-    arc[2] = *control1;
-    arc[3] = stroker->center;
-
-    while ( arc >= bez_stack )
-    {
-      FT_Angle  angle_in, angle_mid, angle_out;
-
-
-      /* initialize with current direction */
-      angle_in = angle_out = angle_mid = stroker->angle_in;
-
-      if ( arc < limit                                         &&
-           !ft_cubic_is_small_enough( arc, &angle_in,
-                                      &angle_mid, &angle_out ) )
-      {
-        if ( stroker->first_point )
-          stroker->angle_in = angle_in;
-
-        ft_cubic_split( arc );
-        arc += 3;
-        continue;
-      }
-
-      if ( first_arc )
-      {
-        first_arc = FALSE;
-
-        /* process corner if necessary */
-        if ( stroker->first_point )
-          error = ft_stroker_subpath_start( stroker, angle_in, 0 );
-        else
-        {
-          stroker->angle_out = angle_in;
-          error = ft_stroker_process_corner( stroker, 0 );
-        }
-      }
-      else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
-                  FT_SMALL_CUBIC_THRESHOLD / 4                             )
-      {
-        /* if the deviation from one arc to the next is too great, */
-        /* add a round corner                                      */
-        stroker->center    = arc[3];
-        stroker->angle_out = angle_in;
-        stroker->line_join = FT_STROKER_LINEJOIN_ROUND;
-
-        error = ft_stroker_process_corner( stroker, 0 );
-
-        /* reinstate line join style */
-        stroker->line_join = stroker->line_join_saved;
-      }
-
-      if ( error )
-        goto Exit;
-
-      /* the arc's angle is small enough; we can add it directly to each */
-      /* border                                                          */
-      {
-        FT_Vector        ctrl1, ctrl2, end;
-        FT_Angle         theta1, phi1, theta2, phi2, rotate, alpha0 = 0;
-        FT_Fixed         length1, length2;
-        FT_StrokeBorder  border;
-        FT_Int           side;
-
-
-        theta1  = FT_Angle_Diff( angle_in,  angle_mid ) / 2;
-        theta2  = FT_Angle_Diff( angle_mid, angle_out ) / 2;
-        phi1    = ft_angle_mean( angle_in,  angle_mid );
-        phi2    = ft_angle_mean( angle_mid, angle_out );
-        length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) );
-        length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) );
-
-        /* compute direction of original arc */
-        if ( stroker->handle_wide_strokes )
-          alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y );
-
-        for ( border = stroker->borders, side = 0;
-              side <= 1;
-              side++, border++ )
-        {
-          rotate = FT_SIDE_TO_ROTATE( side );
-
-          /* compute control points */
-          FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate );
-          ctrl1.x += arc[2].x;
-          ctrl1.y += arc[2].y;
-
-          FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate );
-          ctrl2.x += arc[1].x;
-          ctrl2.y += arc[1].y;
-
-          /* compute end point */
-          FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate );
-          end.x += arc[0].x;
-          end.y += arc[0].y;
-
-          if ( stroker->handle_wide_strokes )
-          {
-            FT_Vector  start;
-            FT_Angle   alpha1;
-
-
-            /* determine whether the border radius is greater than the */
-            /* radius of curvature of the original arc                 */
-            start = border->points[border->num_points - 1];
-
-            alpha1 = FT_Atan2( end.x - start.x, end.y - start.y );
-
-            /* is the direction of the border arc opposite to */
-            /* that of the original arc? */
-            if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) >
-                   FT_ANGLE_PI / 2                             )
-            {
-              FT_Angle   beta, gamma;
-              FT_Vector  bvec, delta;
-              FT_Fixed   blen, sinA, sinB, alen;
-
-
-              /* use the sine rule to find the intersection point */
-              beta  = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y );
-              gamma = FT_Atan2( arc[0].x - end.x,   arc[0].y - end.y );
-
-              bvec.x = end.x - start.x;
-              bvec.y = end.y - start.y;
-
-              blen = FT_Vector_Length( &bvec );
-
-              sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) );
-              sinB = ft_pos_abs( FT_Sin( beta - gamma ) );
-
-              alen = FT_MulDiv( blen, sinA, sinB );
-
-              FT_Vector_From_Polar( &delta, alen, beta );
-              delta.x += start.x;
-              delta.y += start.y;
-
-              /* circumnavigate the negative sector backwards */
-              border->movable = FALSE;
-              error = ft_stroke_border_lineto( border, &delta, FALSE );
-              if ( error )
-                goto Exit;
-              error = ft_stroke_border_lineto( border, &end, FALSE );
-              if ( error )
-                goto Exit;
-              error = ft_stroke_border_cubicto( border,
-                                                &ctrl2,
-                                                &ctrl1,
-                                                &start );
-              if ( error )
-                goto Exit;
-              /* and then move to the endpoint */
-              error = ft_stroke_border_lineto( border, &end, FALSE );
-              if ( error )
-                goto Exit;
-
-              continue;
-            }
-
-            /* else fall through */
-          }
-
-          /* simply add an arc */
-          error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
-          if ( error )
-            goto Exit;
-        }
-      }
-
-      arc -= 3;
-
-      stroker->angle_in = angle_out;
-    }
-
-    stroker->center = *to;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_BeginSubPath( FT_Stroker  stroker,
-                           FT_Vector*  to,
-                           FT_Bool     open )
-  {
-    if ( !stroker || !to )
-      return FT_THROW( Invalid_Argument );
-
-    /* We cannot process the first point, because there is not enough      */
-    /* information regarding its corner/cap.  The latter will be processed */
-    /* in the `FT_Stroker_EndSubPath' routine.                             */
-    /*                                                                     */
-    stroker->first_point  = TRUE;
-    stroker->center       = *to;
-    stroker->subpath_open = open;
-
-    /* Determine if we need to check whether the border radius is greater */
-    /* than the radius of curvature of a curve, to handle this case       */
-    /* specially.  This is only required if bevel joins or butt caps may  */
-    /* be created, because round & miter joins and round & square caps    */
-    /* cover the negative sector created with wide strokes.               */
-    stroker->handle_wide_strokes =
-      FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND  ||
-               ( stroker->subpath_open                        &&
-                 stroker->line_cap == FT_STROKER_LINECAP_BUTT ) );
-
-    /* record the subpath start point for each border */
-    stroker->subpath_start = *to;
-
-    stroker->angle_in = 0;
-
-    return FT_Err_Ok;
-  }
-
-
-  static FT_Error
-  ft_stroker_add_reverse_left( FT_Stroker  stroker,
-                               FT_Bool     open )
-  {
-    FT_StrokeBorder  right = stroker->borders + 0;
-    FT_StrokeBorder  left  = stroker->borders + 1;
-    FT_Int           new_points;
-    FT_Error         error = FT_Err_Ok;
-
-
-    FT_ASSERT( left->start >= 0 );
-
-    new_points = (FT_Int)left->num_points - left->start;
-    if ( new_points > 0 )
-    {
-      error = ft_stroke_border_grow( right, (FT_UInt)new_points );
-      if ( error )
-        goto Exit;
-
-      {
-        FT_Vector*  dst_point = right->points + right->num_points;
-        FT_Byte*    dst_tag   = right->tags   + right->num_points;
-        FT_Vector*  src_point = left->points  + left->num_points - 1;
-        FT_Byte*    src_tag   = left->tags    + left->num_points - 1;
-
-
-        while ( src_point >= left->points + left->start )
-        {
-          *dst_point = *src_point;
-          *dst_tag   = *src_tag;
-
-          if ( open )
-            dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END;
-          else
-          {
-            FT_Byte  ttag =
-                       (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END );
-
-
-            /* switch begin/end tags if necessary */
-            if ( ttag == FT_STROKE_TAG_BEGIN ||
-                 ttag == FT_STROKE_TAG_END   )
-              dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END;
-          }
-
-          src_point--;
-          src_tag--;
-          dst_point++;
-          dst_tag++;
-        }
-      }
-
-      left->num_points   = (FT_UInt)left->start;
-      right->num_points += (FT_UInt)new_points;
-
-      right->movable = FALSE;
-      left->movable  = FALSE;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  /* there's a lot of magic in this function! */
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_EndSubPath( FT_Stroker  stroker )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    if ( !stroker )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( stroker->subpath_open )
-    {
-      FT_StrokeBorder  right = stroker->borders;
-
-
-      /* All right, this is an opened path, we need to add a cap between */
-      /* right & left, add the reverse of left, then add a final cap     */
-      /* between left & right.                                           */
-      error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
-      if ( error )
-        goto Exit;
-
-      /* add reversed points from `left' to `right' */
-      error = ft_stroker_add_reverse_left( stroker, TRUE );
-      if ( error )
-        goto Exit;
-
-      /* now add the final cap */
-      stroker->center = stroker->subpath_start;
-      error = ft_stroker_cap( stroker,
-                              stroker->subpath_angle + FT_ANGLE_PI, 0 );
-      if ( error )
-        goto Exit;
-
-      /* Now end the right subpath accordingly.  The left one is */
-      /* rewind and doesn't need further processing.             */
-      ft_stroke_border_close( right, FALSE );
-    }
-    else
-    {
-      FT_Angle  turn;
-      FT_Int    inside_side;
-
-
-      /* close the path if needed */
-      if ( stroker->center.x != stroker->subpath_start.x ||
-           stroker->center.y != stroker->subpath_start.y )
-      {
-         error = FT_Stroker_LineTo( stroker, &stroker->subpath_start );
-         if ( error )
-           goto Exit;
-      }
-
-      /* process the corner */
-      stroker->angle_out = stroker->subpath_angle;
-      turn               = FT_Angle_Diff( stroker->angle_in,
-                                          stroker->angle_out );
-
-      /* no specific corner processing is required if the turn is 0 */
-      if ( turn != 0 )
-      {
-        /* when we turn to the right, the inside side is 0 */
-        /* otherwise, the inside side is 1 */
-        inside_side = ( turn < 0 );
-
-        error = ft_stroker_inside( stroker,
-                                   inside_side,
-                                   stroker->subpath_line_length );
-        if ( error )
-          goto Exit;
-
-        /* process the outside side */
-        error = ft_stroker_outside( stroker,
-                                    !inside_side,
-                                    stroker->subpath_line_length );
-        if ( error )
-          goto Exit;
-      }
-
-      /* then end our two subpaths */
-      ft_stroke_border_close( stroker->borders + 0, FALSE );
-      ft_stroke_border_close( stroker->borders + 1, TRUE );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_GetBorderCounts( FT_Stroker        stroker,
-                              FT_StrokerBorder  border,
-                              FT_UInt          *anum_points,
-                              FT_UInt          *anum_contours )
-  {
-    FT_UInt   num_points = 0, num_contours = 0;
-    FT_Error  error;
-
-
-    if ( !stroker || border > 1 )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    error = ft_stroke_border_get_counts( stroker->borders + border,
-                                         &num_points, &num_contours );
-  Exit:
-    if ( anum_points )
-      *anum_points = num_points;
-
-    if ( anum_contours )
-      *anum_contours = num_contours;
-
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_GetCounts( FT_Stroker  stroker,
-                        FT_UInt    *anum_points,
-                        FT_UInt    *anum_contours )
-  {
-    FT_UInt   count1, count2, num_points   = 0;
-    FT_UInt   count3, count4, num_contours = 0;
-    FT_Error  error;
-
-
-    if ( !stroker )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    error = ft_stroke_border_get_counts( stroker->borders + 0,
-                                         &count1, &count2 );
-    if ( error )
-      goto Exit;
-
-    error = ft_stroke_border_get_counts( stroker->borders + 1,
-                                         &count3, &count4 );
-    if ( error )
-      goto Exit;
-
-    num_points   = count1 + count3;
-    num_contours = count2 + count4;
-
-  Exit:
-    if ( anum_points )
-      *anum_points   = num_points;
-
-    if ( anum_contours )
-      *anum_contours = num_contours;
-
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Stroker_ExportBorder( FT_Stroker        stroker,
-                           FT_StrokerBorder  border,
-                           FT_Outline*       outline )
-  {
-    if ( !stroker || !outline )
-      return;
-
-    if ( border == FT_STROKER_BORDER_LEFT  ||
-         border == FT_STROKER_BORDER_RIGHT )
-    {
-      FT_StrokeBorder  sborder = & stroker->borders[border];
-
-
-      if ( sborder->valid )
-        ft_stroke_border_export( sborder, outline );
-    }
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( void )
-  FT_Stroker_Export( FT_Stroker   stroker,
-                     FT_Outline*  outline )
-  {
-    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline );
-    FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline );
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  /*
-   *  The following is very similar to FT_Outline_Decompose, except
-   *  that we do support opened paths, and do not scale the outline.
-   */
-  FT_EXPORT_DEF( FT_Error )
-  FT_Stroker_ParseOutline( FT_Stroker   stroker,
-                           FT_Outline*  outline,
-                           FT_Bool      opened )
-  {
-    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           */
-
-
-    if ( !outline )
-      return FT_THROW( Invalid_Outline );
-
-    if ( !stroker )
-      return FT_THROW( Invalid_Argument );
-
-    FT_Stroker_Rewind( stroker );
-
-    first = 0;
-
-    for ( n = 0; n < outline->n_contours; n++ )
-    {
-      FT_UInt  last;  /* index of last point in contour */
-
-
-      last  = (FT_UInt)outline->contours[n];
-      limit = outline->points + last;
-
-      /* skip empty points; we don't stroke these */
-      if ( last <= first )
-      {
-        first = last + 1;
-        continue;
-      }
-
-      v_start = outline->points[first];
-      v_last  = outline->points[last];
-
-      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                    */
-          v_start.x = ( v_start.x + v_last.x ) / 2;
-          v_start.y = ( v_start.y + v_last.y ) / 2;
-        }
-        point--;
-        tags--;
-      }
-
-      error = FT_Stroker_BeginSubPath( stroker, &v_start, opened );
-      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 = point->x;
-            vec.y = point->y;
-
-            error = FT_Stroker_LineTo( stroker, &vec );
-            if ( error )
-              goto Exit;
-            continue;
-          }
-
-        case FT_CURVE_TAG_CONIC:  /* consume conic arcs */
-          v_control.x = point->x;
-          v_control.y = point->y;
-
-        Do_Conic:
-          if ( point < limit )
-          {
-            FT_Vector  vec;
-            FT_Vector  v_middle;
-
-
-            point++;
-            tags++;
-            tag = FT_CURVE_TAG( tags[0] );
-
-            vec = point[0];
-
-            if ( tag == FT_CURVE_TAG_ON )
-            {
-              error = FT_Stroker_ConicTo( stroker, &v_control, &vec );
-              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;
-
-            error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle );
-            if ( error )
-              goto Exit;
-
-            v_control = vec;
-            goto Do_Conic;
-          }
-
-          error = FT_Stroker_ConicTo( stroker, &v_control, &v_start );
-          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 = point[-2];
-            vec2 = point[-1];
-
-            if ( point <= limit )
-            {
-              FT_Vector  vec;
-
-
-              vec = point[0];
-
-              error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec );
-              if ( error )
-                goto Exit;
-              continue;
-            }
-
-            error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start );
-            goto Close;
-          }
-        }
-      }
-
-    Close:
-      if ( error )
-        goto Exit;
-
-      /* don't try to end the path if no segments have been generated */
-      if ( !stroker->first_point )
-      {
-        error = FT_Stroker_EndSubPath( stroker );
-        if ( error )
-          goto Exit;
-      }
-
-      first = last + 1;
-    }
-
-    return FT_Err_Ok;
-
-  Exit:
-    return error;
-
-  Invalid_Outline:
-    return FT_THROW( Invalid_Outline );
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Glyph_Stroke( FT_Glyph    *pglyph,
-                   FT_Stroker   stroker,
-                   FT_Bool      destroy )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-    FT_Glyph  glyph = NULL;
-
-    /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */
-    FT_Library  library = stroker->library;
-
-    FT_UNUSED( library );
-
-
-    if ( !pglyph )
-      goto Exit;
-
-    glyph = *pglyph;
-    if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
-      goto Exit;
-
-    {
-      FT_Glyph  copy;
-
-
-      error = FT_Glyph_Copy( glyph, &copy );
-      if ( error )
-        goto Exit;
-
-      glyph = copy;
-    }
-
-    {
-      FT_OutlineGlyph  oglyph  = (FT_OutlineGlyph)glyph;
-      FT_Outline*      outline = &oglyph->outline;
-      FT_UInt          num_points, num_contours;
-
-
-      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
-      if ( error )
-        goto Fail;
-
-      FT_Stroker_GetCounts( stroker, &num_points, &num_contours );
-
-      FT_Outline_Done( glyph->library, outline );
-
-      error = FT_Outline_New( glyph->library,
-                              num_points,
-                              (FT_Int)num_contours,
-                              outline );
-      if ( error )
-        goto Fail;
-
-      outline->n_points   = 0;
-      outline->n_contours = 0;
-
-      FT_Stroker_Export( stroker, outline );
-    }
-
-    if ( destroy )
-      FT_Done_Glyph( *pglyph );
-
-    *pglyph = glyph;
-    goto Exit;
-
-  Fail:
-    FT_Done_Glyph( glyph );
-    glyph = NULL;
-
-    if ( !destroy )
-      *pglyph = NULL;
-
-  Exit:
-    return error;
-  }
-
-
-  /* documentation is in ftstroke.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Glyph_StrokeBorder( FT_Glyph    *pglyph,
-                         FT_Stroker   stroker,
-                         FT_Bool      inside,
-                         FT_Bool      destroy )
-  {
-    FT_Error  error = FT_ERR( Invalid_Argument );
-    FT_Glyph  glyph = NULL;
-
-    /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */
-    FT_Library  library = stroker->library;
-
-    FT_UNUSED( library );
-
-
-    if ( !pglyph )
-      goto Exit;
-
-    glyph = *pglyph;
-    if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET )
-      goto Exit;
-
-    {
-      FT_Glyph  copy;
-
-
-      error = FT_Glyph_Copy( glyph, &copy );
-      if ( error )
-        goto Exit;
-
-      glyph = copy;
-    }
-
-    {
-      FT_OutlineGlyph   oglyph  = (FT_OutlineGlyph)glyph;
-      FT_StrokerBorder  border;
-      FT_Outline*       outline = &oglyph->outline;
-      FT_UInt           num_points, num_contours;
-
-
-      border = FT_Outline_GetOutsideBorder( outline );
-      if ( inside )
-      {
-        if ( border == FT_STROKER_BORDER_LEFT )
-          border = FT_STROKER_BORDER_RIGHT;
-        else
-          border = FT_STROKER_BORDER_LEFT;
-      }
-
-      error = FT_Stroker_ParseOutline( stroker, outline, FALSE );
-      if ( error )
-        goto Fail;
-
-      FT_Stroker_GetBorderCounts( stroker, border,
-                                  &num_points, &num_contours );
-
-      FT_Outline_Done( glyph->library, outline );
-
-      error = FT_Outline_New( glyph->library,
-                              num_points,
-                              (FT_Int)num_contours,
-                              outline );
-      if ( error )
-        goto Fail;
-
-      outline->n_points   = 0;
-      outline->n_contours = 0;
-
-      FT_Stroker_ExportBorder( stroker, border, outline );
-    }
-
-    if ( destroy )
-      FT_Done_Glyph( *pglyph );
-
-    *pglyph = glyph;
-    goto Exit;
-
-  Fail:
-    FT_Done_Glyph( glyph );
-    glyph = NULL;
-
-    if ( !destroy )
-      *pglyph = NULL;
-
-  Exit:
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftsynth.c b/third_party/freetype/src/base/ftsynth.c
deleted file mode 100644
index cd68533..0000000
--- a/third_party/freetype/src/base/ftsynth.c
+++ /dev/null
@@ -1,163 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftsynth.c                                                              */
-/*                                                                         */
-/*    FreeType synthesizing code for emboldening and slanting (body).      */
-/*                                                                         */
-/*  Copyright 2000-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_SYNTHESIS_H
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_OUTLINE_H
-#include FT_BITMAP_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_synth
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****   EXPERIMENTAL OBLIQUING SUPPORT                                ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-  /* documentation is in ftsynth.h */
-
-  FT_EXPORT_DEF( void )
-  FT_GlyphSlot_Oblique( FT_GlyphSlot  slot )
-  {
-    FT_Matrix    transform;
-    FT_Outline*  outline;
-
-
-    if ( !slot )
-      return;
-
-    outline = &slot->outline;
-
-    /* only oblique outline glyphs */
-    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE )
-      return;
-
-    /* we don't touch the advance width */
-
-    /* For italic, simply apply a shear transform, with an angle */
-    /* of about 12 degrees.                                      */
-
-    transform.xx = 0x10000L;
-    transform.yx = 0x00000L;
-
-    transform.xy = 0x0366AL;
-    transform.yy = 0x10000L;
-
-    FT_Outline_Transform( outline, &transform );
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /****                                                                 ****/
-  /****   EXPERIMENTAL EMBOLDENING SUPPORT                              ****/
-  /****                                                                 ****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /* documentation is in ftsynth.h */
-
-  FT_EXPORT_DEF( void )
-  FT_GlyphSlot_Embolden( FT_GlyphSlot  slot )
-  {
-    FT_Library  library;
-    FT_Face     face;
-    FT_Error    error;
-    FT_Pos      xstr, ystr;
-
-
-    if ( !slot )
-      return;
-
-    library = slot->library;
-    face    = slot->face;
-
-    if ( slot->format != FT_GLYPH_FORMAT_OUTLINE &&
-         slot->format != FT_GLYPH_FORMAT_BITMAP  )
-      return;
-
-    /* some reasonable strength */
-    xstr = FT_MulFix( face->units_per_EM,
-                      face->size->metrics.y_scale ) / 24;
-    ystr = xstr;
-
-    if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
-      FT_Outline_EmboldenXY( &slot->outline, xstr, ystr );
-
-    else /* slot->format == FT_GLYPH_FORMAT_BITMAP */
-    {
-      /* round to full pixels */
-      xstr &= ~63;
-      if ( xstr == 0 )
-        xstr = 1 << 6;
-      ystr &= ~63;
-
-      /*
-       * XXX: overflow check for 16-bit system, for compatibility
-       *      with FT_GlyphSlot_Embolden() since freetype-2.1.10.
-       *      unfortunately, this function return no informations
-       *      about the cause of error.
-       */
-      if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN )
-      {
-        FT_TRACE1(( "FT_GlyphSlot_Embolden:" ));
-        FT_TRACE1(( "too strong embolding parameter ystr=%d\n", ystr ));
-        return;
-      }
-      error = FT_GlyphSlot_Own_Bitmap( slot );
-      if ( error )
-        return;
-
-      error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr );
-      if ( error )
-        return;
-    }
-
-    if ( slot->advance.x )
-      slot->advance.x += xstr;
-
-    if ( slot->advance.y )
-      slot->advance.y += ystr;
-
-    slot->metrics.width        += xstr;
-    slot->metrics.height       += ystr;
-    slot->metrics.horiAdvance  += xstr;
-    slot->metrics.vertAdvance  += ystr;
-    slot->metrics.horiBearingY += ystr;
-
-    /* XXX: 16-bit overflow case must be excluded before here */
-    if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
-      slot->bitmap_top += (FT_Int)( ystr >> 6 );
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/ftwinfnt.c b/third_party/freetype/src/base/ftwinfnt.c
deleted file mode 100644
index 76a19af..0000000
--- a/third_party/freetype/src/base/ftwinfnt.c
+++ /dev/null
@@ -1,53 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftwinfnt.c                                                             */
-/*                                                                         */
-/*    FreeType API for accessing Windows FNT specific info (body).         */
-/*                                                                         */
-/*  Copyright 2003-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_WINFONTS_H
-#include FT_INTERNAL_OBJECTS_H
-#include FT_SERVICE_WINFNT_H
-
-
-  /* documentation is in ftwinfnt.h */
-
-  FT_EXPORT_DEF( FT_Error )
-  FT_Get_WinFNT_Header( FT_Face               face,
-                        FT_WinFNT_HeaderRec  *header )
-  {
-    FT_Service_WinFnt  service;
-    FT_Error           error;
-
-
-    if ( !face )
-      return FT_THROW( Invalid_Face_Handle );
-
-    if ( !header )
-      return FT_THROW( Invalid_Argument );
-
-    FT_FACE_LOOKUP_SERVICE( face, service, WINFNT );
-
-    if ( service )
-      error = service->get_header( face, header );
-    else
-      error = FT_THROW( Invalid_Argument );
-
-    return error;
-  }
-
-
-/* END */
diff --git a/third_party/freetype/src/base/md5.c b/third_party/freetype/src/base/md5.c
deleted file mode 100644
index 52d96ac..0000000
--- a/third_party/freetype/src/base/md5.c
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
- * MD5 Message-Digest Algorithm (RFC 1321).
- *
- * Homepage:
- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
- *
- * Author:
- * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
- *
- * This software was written by Alexander Peslyak in 2001.  No copyright is
- * claimed, and the software is hereby placed in the public domain.
- * In case this attempt to disclaim copyright and place the software in the
- * public domain is deemed null and void, then the software is
- * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
- * general public under the following terms:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted.
- *
- * There's ABSOLUTELY NO WARRANTY, express or implied.
- *
- * (This is a heavily cut-down "BSD license".)
- *
- * This differs from Colin Plumb's older public domain implementation in that
- * no exactly 32-bit integer data type is required (any 32-bit or wider
- * unsigned integer data type will do), there's no compile-time endianness
- * configuration, and the function prototypes match OpenSSL's.  No code from
- * Colin Plumb's implementation has been reused; this comment merely compares
- * the properties of the two independent implementations.
- *
- * The primary goals of this implementation are portability and ease of use.
- * It is meant to be fast, but not as fast as possible.  Some known
- * optimizations are not included to reduce source code size and avoid
- * compile-time configuration.
- */
-
-#ifndef HAVE_OPENSSL
-
-#include <string.h>
-
-#include "md5.h"
-
-/*
- * The basic MD5 functions.
- *
- * F and G are optimized compared to their RFC 1321 definitions for
- * architectures that lack an AND-NOT instruction, just like in Colin Plumb's
- * implementation.
- */
-#define F(x, y, z)			((z) ^ ((x) & ((y) ^ (z))))
-#define G(x, y, z)			((y) ^ ((z) & ((x) ^ (y))))
-#define H(x, y, z)			(((x) ^ (y)) ^ (z))
-#define H2(x, y, z)			((x) ^ ((y) ^ (z)))
-#define I(x, y, z)			((y) ^ ((x) | ~(z)))
-
-/*
- * The MD5 transformation for all four rounds.
- */
-#define STEP(f, a, b, c, d, x, t, s) \
-	(a) += f((b), (c), (d)) + (x) + (t); \
-	(a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \
-	(a) += (b);
-
-/*
- * SET reads 4 input bytes in little-endian byte order and stores them
- * in a properly aligned word in host byte order.
- *
- * The check for little-endian architectures that tolerate unaligned
- * memory accesses is just an optimization.  Nothing will break if it
- * doesn't work.
- */
-#if defined(__i386__) || defined(__x86_64__) || defined(__vax__)
-#define SET(n) \
-	(*(MD5_u32plus *)&ptr[(n) * 4])
-#define GET(n) \
-	SET(n)
-#else
-#define SET(n) \
-	(ctx->block[(n)] = \
-	(MD5_u32plus)ptr[(n) * 4] | \
-	((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \
-	((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \
-	((MD5_u32plus)ptr[(n) * 4 + 3] << 24))
-#define GET(n) \
-	(ctx->block[(n)])
-#endif
-
-/*
- * This processes one or more 64-byte data blocks, but does NOT update
- * the bit counters.  There are no alignment requirements.
- */
-static const void *body(MD5_CTX *ctx, const void *data, unsigned long size)
-{
-	const unsigned char *ptr;
-	MD5_u32plus a, b, c, d;
-	MD5_u32plus saved_a, saved_b, saved_c, saved_d;
-
-	ptr = (const unsigned char *)data;
-
-	a = ctx->a;
-	b = ctx->b;
-	c = ctx->c;
-	d = ctx->d;
-
-	do {
-		saved_a = a;
-		saved_b = b;
-		saved_c = c;
-		saved_d = d;
-
-/* Round 1 */
-		STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)
-		STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)
-		STEP(F, c, d, a, b, SET(2), 0x242070db, 17)
-		STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)
-		STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)
-		STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)
-		STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)
-		STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)
-		STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)
-		STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)
-		STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)
-		STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)
-		STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)
-		STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)
-		STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)
-		STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)
-
-/* Round 2 */
-		STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)
-		STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)
-		STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)
-		STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)
-		STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)
-		STEP(G, d, a, b, c, GET(10), 0x02441453, 9)
-		STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)
-		STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)
-		STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)
-		STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)
-		STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)
-		STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)
-		STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)
-		STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)
-		STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)
-		STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)
-
-/* Round 3 */
-		STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)
-		STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)
-		STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)
-		STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)
-		STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)
-		STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)
-		STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)
-		STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)
-		STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)
-		STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)
-		STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)
-		STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)
-		STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)
-		STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)
-		STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)
-		STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)
-
-/* Round 4 */
-		STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)
-		STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)
-		STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)
-		STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)
-		STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)
-		STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)
-		STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)
-		STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)
-		STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)
-		STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)
-		STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)
-		STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)
-		STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)
-		STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)
-		STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)
-		STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)
-
-		a += saved_a;
-		b += saved_b;
-		c += saved_c;
-		d += saved_d;
-
-		ptr += 64;
-	} while (size -= 64);
-
-	ctx->a = a;
-	ctx->b = b;
-	ctx->c = c;
-	ctx->d = d;
-
-	return ptr;
-}
-
-void MD5_Init(MD5_CTX *ctx)
-{
-	ctx->a = 0x67452301;
-	ctx->b = 0xefcdab89;
-	ctx->c = 0x98badcfe;
-	ctx->d = 0x10325476;
-
-	ctx->lo = 0;
-	ctx->hi = 0;
-}
-
-void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
-{
-	MD5_u32plus saved_lo;
-	unsigned long used, available;
-
-	saved_lo = ctx->lo;
-	if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
-		ctx->hi++;
-	ctx->hi += size >> 29;
-
-	used = saved_lo & 0x3f;
-
-	if (used) {
-		available = 64 - used;
-
-		if (size < available) {
-			memcpy(&ctx->buffer[used], data, size);
-			return;
-		}
-
-		memcpy(&ctx->buffer[used], data, available);
-		data = (const unsigned char *)data + available;
-		size -= available;
-		body(ctx, ctx->buffer, 64);
-	}
-
-	if (size >= 64) {
-		data = body(ctx, data, size & ~(unsigned long)0x3f);
-		size &= 0x3f;
-	}
-
-	memcpy(ctx->buffer, data, size);
-}
-
-void MD5_Final(unsigned char *result, MD5_CTX *ctx)
-{
-	unsigned long used, available;
-
-	used = ctx->lo & 0x3f;
-
-	ctx->buffer[used++] = 0x80;
-
-	available = 64 - used;
-
-	if (available < 8) {
-		memset(&ctx->buffer[used], 0, available);
-		body(ctx, ctx->buffer, 64);
-		used = 0;
-		available = 64;
-	}
-
-	memset(&ctx->buffer[used], 0, available - 8);
-
-	ctx->lo <<= 3;
-	ctx->buffer[56] = ctx->lo;
-	ctx->buffer[57] = ctx->lo >> 8;
-	ctx->buffer[58] = ctx->lo >> 16;
-	ctx->buffer[59] = ctx->lo >> 24;
-	ctx->buffer[60] = ctx->hi;
-	ctx->buffer[61] = ctx->hi >> 8;
-	ctx->buffer[62] = ctx->hi >> 16;
-	ctx->buffer[63] = ctx->hi >> 24;
-
-	body(ctx, ctx->buffer, 64);
-
-	result[0] = ctx->a;
-	result[1] = ctx->a >> 8;
-	result[2] = ctx->a >> 16;
-	result[3] = ctx->a >> 24;
-	result[4] = ctx->b;
-	result[5] = ctx->b >> 8;
-	result[6] = ctx->b >> 16;
-	result[7] = ctx->b >> 24;
-	result[8] = ctx->c;
-	result[9] = ctx->c >> 8;
-	result[10] = ctx->c >> 16;
-	result[11] = ctx->c >> 24;
-	result[12] = ctx->d;
-	result[13] = ctx->d >> 8;
-	result[14] = ctx->d >> 16;
-	result[15] = ctx->d >> 24;
-
-	memset(ctx, 0, sizeof(*ctx));
-}
-
-#endif
diff --git a/third_party/freetype/src/base/md5.h b/third_party/freetype/src/base/md5.h
deleted file mode 100644
index 2da44bf..0000000
--- a/third_party/freetype/src/base/md5.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc.
- * MD5 Message-Digest Algorithm (RFC 1321).
- *
- * Homepage:
- * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5
- *
- * Author:
- * Alexander Peslyak, better known as Solar Designer <solar at openwall.com>
- *
- * This software was written by Alexander Peslyak in 2001.  No copyright is
- * claimed, and the software is hereby placed in the public domain.
- * In case this attempt to disclaim copyright and place the software in the
- * public domain is deemed null and void, then the software is
- * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the
- * general public under the following terms:
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted.
- *
- * There's ABSOLUTELY NO WARRANTY, express or implied.
- *
- * See md5.c for more information.
- */
-
-#ifdef HAVE_OPENSSL
-#include <openssl/md5.h>
-#elif !defined(_MD5_H)
-#define _MD5_H
-
-/* Any 32-bit or wider unsigned integer data type will do */
-typedef unsigned int MD5_u32plus;
-
-typedef struct {
-	MD5_u32plus lo, hi;
-	MD5_u32plus a, b, c, d;
-	unsigned char buffer[64];
-	MD5_u32plus block[16];
-} MD5_CTX;
-
-extern void MD5_Init(MD5_CTX *ctx);
-extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size);
-extern void MD5_Final(unsigned char *result, MD5_CTX *ctx);
-
-#endif
diff --git a/third_party/freetype/src/cff/Jamfile b/third_party/freetype/src/cff/Jamfile
deleted file mode 100644
index deec079..0000000
--- a/third_party/freetype/src/cff/Jamfile
+++ /dev/null
@@ -1,45 +0,0 @@
-# FreeType 2 src/cff Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) cff ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = cffcmap
-               cffdrivr
-               cffgload
-               cffload
-               cffobjs
-               cffparse
-               cffpic
-               cf2arrst
-               cf2blues
-               cf2error
-               cf2font
-               cf2ft
-               cf2hints
-               cf2intrp
-               cf2read
-               cf2stack
-               ;
-  }
-  else
-  {
-    _sources = cff ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/cff Jamfile
diff --git a/third_party/freetype/src/cid/Jamfile b/third_party/freetype/src/cid/Jamfile
deleted file mode 100644
index 64e1523..0000000
--- a/third_party/freetype/src/cid/Jamfile
+++ /dev/null
@@ -1,34 +0,0 @@
-# FreeType 2 src/cid Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) cid ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = cidgload
-               cidload
-               cidobjs
-               cidparse
-               cidriver
-               ;
-  }
-  else
-  {
-    _sources = type1cid ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/cid Jamfile
diff --git a/third_party/freetype/src/psaux/Jamfile b/third_party/freetype/src/psaux/Jamfile
deleted file mode 100644
index 6793f0d..0000000
--- a/third_party/freetype/src/psaux/Jamfile
+++ /dev/null
@@ -1,35 +0,0 @@
-# FreeType 2 src/psaux Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) psaux ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = afmparse
-               psauxmod
-               psconv
-               psobjs
-               t1cmap
-               t1decode
-               ;
-  }
-  else
-  {
-    _sources = psaux ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/psaux Jamfile
diff --git a/third_party/freetype/src/pshinter/Jamfile b/third_party/freetype/src/pshinter/Jamfile
deleted file mode 100644
index 6fb3be1..0000000
--- a/third_party/freetype/src/pshinter/Jamfile
+++ /dev/null
@@ -1,34 +0,0 @@
-# FreeType 2 src/pshinter Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) pshinter ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = pshalgo
-               pshglob
-               pshmod
-               pshpic
-               pshrec
-               ;
-  }
-  else
-  {
-    _sources = pshinter ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/pshinter Jamfile
diff --git a/third_party/freetype/src/psnames/Jamfile b/third_party/freetype/src/psnames/Jamfile
deleted file mode 100644
index 6dcc8b8..0000000
--- a/third_party/freetype/src/psnames/Jamfile
+++ /dev/null
@@ -1,31 +0,0 @@
-# FreeType 2 src/psnames Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) psnames ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = psmodule
-               pspic
-               ;
-  }
-  else
-  {
-    _sources = psnames ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/psnames Jamfile
diff --git a/third_party/freetype/src/psnames/psnames.c b/third_party/freetype/src/psnames/psnames.c
deleted file mode 100644
index a438596..0000000
--- a/third_party/freetype/src/psnames/psnames.c
+++ /dev/null
@@ -1,26 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  psnames.c                                                              */
-/*                                                                         */
-/*    FreeType PSNames module component (body only).                       */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#define FT_MAKE_OPTION_SINGLE_OBJECT
-
-#include <ft2build.h>
-#include "pspic.c"
-#include "psmodule.c"
-
-
-/* END */
diff --git a/third_party/freetype/src/raster/Jamfile b/third_party/freetype/src/raster/Jamfile
deleted file mode 100644
index 71df568..0000000
--- a/third_party/freetype/src/raster/Jamfile
+++ /dev/null
@@ -1,32 +0,0 @@
-# FreeType 2 src/raster Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) raster ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = ftraster
-               ftrend1
-               rastpic
-               ;
-  }
-  else
-  {
-    _sources = raster ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/raster Jamfile
diff --git a/third_party/freetype/src/raster/ftmisc.h b/third_party/freetype/src/raster/ftmisc.h
deleted file mode 100644
index b87e0b6..0000000
--- a/third_party/freetype/src/raster/ftmisc.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ftmisc.h                                                               */
-/*                                                                         */
-/*    Miscellaneous macros for stand-alone rasterizer (specification       */
-/*    only).                                                               */
-/*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used        */
-/*  modified and distributed under the terms of the FreeType project       */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /***************************************************/
-  /*                                                 */
-  /* This file is *not* portable!  You have to adapt */
-  /* its definitions to your platform.               */
-  /*                                                 */
-  /***************************************************/
-
-#ifndef __FTMISC_H__
-#define __FTMISC_H__
-
-
-  /* memset */
-#include FT_CONFIG_STANDARD_LIBRARY_H
-
-#define FT_BEGIN_HEADER
-#define FT_END_HEADER
-
-#define FT_LOCAL_DEF( x )   static x
-
-
-  /* from include/freetype/fttypes.h */
-
-  typedef unsigned char  FT_Byte;
-  typedef signed int     FT_Int;
-  typedef unsigned int   FT_UInt;
-  typedef signed long    FT_Long;
-  typedef unsigned long  FT_ULong;
-  typedef signed long    FT_F26Dot6;
-  typedef int            FT_Error;
-
-#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \
-          ( ( (FT_ULong)_x1 << 24 ) |     \
-            ( (FT_ULong)_x2 << 16 ) |     \
-            ( (FT_ULong)_x3 <<  8 ) |     \
-              (FT_ULong)_x4         )
-
-
-  /* from include/freetype/ftsystem.h */
-
-  typedef struct FT_MemoryRec_*  FT_Memory;
-
-  typedef void* (*FT_Alloc_Func)( FT_Memory  memory,
-                                  long       size );
-
-  typedef void (*FT_Free_Func)( FT_Memory  memory,
-                                void*      block );
-
-  typedef void* (*FT_Realloc_Func)( FT_Memory  memory,
-                                    long       cur_size,
-                                    long       new_size,
-                                    void*      block );
-
-  typedef struct FT_MemoryRec_
-  {
-    void*            user;
-
-    FT_Alloc_Func    alloc;
-    FT_Free_Func     free;
-    FT_Realloc_Func  realloc;
-
-  } FT_MemoryRec;
-
-
-  /* from src/ftcalc.c */
-
-#if ( defined _WIN32 || defined _WIN64 )
-
-  typedef __int64  FT_Int64;
-
-#else
-
-#include "inttypes.h"
-
-  typedef int64_t  FT_Int64;
-
-#endif
-
-
-  static FT_Long
-  FT_MulDiv( FT_Long  a,
-             FT_Long  b,
-             FT_Long  c )
-  {
-    FT_Int   s;
-    FT_Long  d;
-
-
-    s = 1;
-    if ( a < 0 ) { a = -a; s = -1; }
-    if ( b < 0 ) { b = -b; s = -s; }
-    if ( c < 0 ) { c = -c; s = -s; }
-
-    d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c
-                         : 0x7FFFFFFFL );
-
-    return ( s > 0 ) ? d : -d;
-  }
-
-
-  static FT_Long
-  FT_MulDiv_No_Round( FT_Long  a,
-                      FT_Long  b,
-                      FT_Long  c )
-  {
-    FT_Int   s;
-    FT_Long  d;
-
-
-    s = 1;
-    if ( a < 0 ) { a = -a; s = -1; }
-    if ( b < 0 ) { b = -b; s = -s; }
-    if ( c < 0 ) { c = -c; s = -s; }
-
-    d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c
-                         : 0x7FFFFFFFL );
-
-    return ( s > 0 ) ? d : -d;
-  }
-
-#endif /* __FTMISC_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/Jamfile b/third_party/freetype/src/sfnt/Jamfile
deleted file mode 100644
index cc98d10..0000000
--- a/third_party/freetype/src/sfnt/Jamfile
+++ /dev/null
@@ -1,40 +0,0 @@
-# FreeType 2 src/sfnt Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) sfnt ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = pngshim
-               sfdriver
-               sfntpic
-               sfobjs
-               ttbdf
-               ttcmap
-               ttkern
-               ttload
-               ttmtx
-               ttpost
-               ttsbit
-               ;
-  }
-  else
-  {
-    _sources = sfnt ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/sfnt Jamfile
diff --git a/third_party/freetype/src/sfnt/pngshim.c b/third_party/freetype/src/sfnt/pngshim.c
deleted file mode 100644
index ea60452..0000000
--- a/third_party/freetype/src/sfnt/pngshim.c
+++ /dev/null
@@ -1,378 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pngshim.c                                                              */
-/*                                                                         */
-/*    PNG Bitmap glyph support.                                            */
-/*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
-/*  Google, Inc.                                                           */
-/*  Written by Stuart Gill and Behdad Esfahbod.                            */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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_CONFIG_STANDARD_LIBRARY_H
-
-
-#ifdef FT_CONFIG_OPTION_USE_PNG
-
-  /* We always include <stjmp.h>, so make libpng shut up! */
-#define PNG_SKIP_SETJMP_CHECK 1
-#include <png.h>
-#include "pngshim.h"
-
-#include "sferrors.h"
-
-
-  /* This code is freely based on cairo-png.c.  There's so many ways */
-  /* to call libpng, and the way cairo does it is defacto standard.  */
-
-  static unsigned int
-  multiply_alpha( unsigned int  alpha,
-                  unsigned int  color )
-  {
-    unsigned int  temp = alpha * color + 0x80;
-
-
-    return ( temp + ( temp >> 8 ) ) >> 8;
-  }
-
-
-  /* Premultiplies data and converts RGBA bytes => native endian. */
-  static void
-  premultiply_data( png_structp    png,
-                    png_row_infop  row_info,
-                    png_bytep      data )
-  {
-    unsigned int  i;
-
-    FT_UNUSED( png );
-
-
-    for ( i = 0; i < row_info->rowbytes; i += 4 )
-    {
-      unsigned char*  base  = &data[i];
-      unsigned int    alpha = base[3];
-
-
-      if ( alpha == 0 )
-        base[0] = base[1] = base[2] = base[3] = 0;
-
-      else
-      {
-        unsigned int  red   = base[0];
-        unsigned int  green = base[1];
-        unsigned int  blue  = base[2];
-
-
-        if ( alpha != 0xFF )
-        {
-          red   = multiply_alpha( alpha, red   );
-          green = multiply_alpha( alpha, green );
-          blue  = multiply_alpha( alpha, blue  );
-        }
-
-        base[0] = (unsigned char)blue;
-        base[1] = (unsigned char)green;
-        base[2] = (unsigned char)red;
-        base[3] = (unsigned char)alpha;
-      }
-    }
-  }
-
-
-  /* Converts RGBx bytes to BGRA. */
-  static void
-  convert_bytes_to_data( png_structp    png,
-                         png_row_infop  row_info,
-                         png_bytep      data )
-  {
-    unsigned int  i;
-
-    FT_UNUSED( png );
-
-
-    for ( i = 0; i < row_info->rowbytes; i += 4 )
-    {
-      unsigned char*  base  = &data[i];
-      unsigned int    red   = base[0];
-      unsigned int    green = base[1];
-      unsigned int    blue  = base[2];
-
-
-      base[0] = (unsigned char)blue;
-      base[1] = (unsigned char)green;
-      base[2] = (unsigned char)red;
-      base[3] = 0xFF;
-    }
-  }
-
-
-  /* Use error callback to avoid png writing to stderr. */
-  static void
-  error_callback( png_structp      png,
-                  png_const_charp  error_msg )
-  {
-    FT_Error*  error = (FT_Error*)png_get_error_ptr( png );
-
-    FT_UNUSED( error_msg );
-
-
-    *error = FT_THROW( Out_Of_Memory );
-#ifdef PNG_SETJMP_SUPPORTED
-    ft_longjmp( png_jmpbuf( png ), 1 );
-#endif
-    /* if we get here, then we have no choice but to abort ... */
-  }
-
-
-  /* Use warning callback to avoid png writing to stderr. */
-  static void
-  warning_callback( png_structp      png,
-                    png_const_charp  error_msg )
-  {
-    FT_UNUSED( png );
-    FT_UNUSED( error_msg );
-
-    /* Just ignore warnings. */
-  }
-
-
-  static void
-  read_data_from_FT_Stream( png_structp  png,
-                            png_bytep    data,
-                            png_size_t   length )
-  {
-    FT_Error   error;
-    png_voidp  p      = png_get_io_ptr( png );
-    FT_Stream  stream = (FT_Stream)p;
-
-
-    if ( FT_FRAME_ENTER( length ) )
-    {
-      FT_Error*  e = (FT_Error*)png_get_error_ptr( png );
-
-
-      *e = FT_THROW( Invalid_Stream_Read );
-      png_error( png, NULL );
-
-      return;
-    }
-
-    memcpy( data, stream->cursor, length );
-
-    FT_FRAME_EXIT();
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  Load_SBit_Png( FT_GlyphSlot     slot,
-                 FT_Int           x_offset,
-                 FT_Int           y_offset,
-                 FT_Int           pix_bits,
-                 TT_SBit_Metrics  metrics,
-                 FT_Memory        memory,
-                 FT_Byte*         data,
-                 FT_UInt          png_len,
-                 FT_Bool          populate_map_and_metrics )
-  {
-    FT_Bitmap    *map   = &slot->bitmap;
-    FT_Error      error = FT_Err_Ok;
-    FT_StreamRec  stream;
-
-    png_structp  png;
-    png_infop    info;
-    png_uint_32  imgWidth, imgHeight;
-
-    int         bitdepth, color_type, interlace;
-    FT_Int      i;
-    png_byte*  *rows = NULL; /* pacify compiler */
-
-
-    if ( x_offset < 0 ||
-         y_offset < 0 )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( !populate_map_and_metrics                            &&
-         ( (FT_UInt)x_offset + metrics->width  > map->width ||
-           (FT_UInt)y_offset + metrics->height > map->rows  ||
-           pix_bits != 32                                   ||
-           map->pixel_mode != FT_PIXEL_MODE_BGRA            ) )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    FT_Stream_OpenMemory( &stream, data, png_len );
-
-    png = png_create_read_struct( PNG_LIBPNG_VER_STRING,
-                                  &error,
-                                  error_callback,
-                                  warning_callback );
-    if ( !png )
-    {
-      error = FT_THROW( Out_Of_Memory );
-      goto Exit;
-    }
-
-    info = png_create_info_struct( png );
-    if ( !info )
-    {
-      error = FT_THROW( Out_Of_Memory );
-      png_destroy_read_struct( &png, NULL, NULL );
-      goto Exit;
-    }
-
-    if ( ft_setjmp( png_jmpbuf( png ) ) )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto DestroyExit;
-    }
-
-    png_set_read_fn( png, &stream, read_data_from_FT_Stream );
-
-    png_read_info( png, info );
-    png_get_IHDR( png, info,
-                  &imgWidth, &imgHeight,
-                  &bitdepth, &color_type, &interlace,
-                  NULL, NULL );
-
-    if ( error                                        ||
-         ( !populate_map_and_metrics                &&
-           ( (FT_Int)imgWidth  != metrics->width  ||
-             (FT_Int)imgHeight != metrics->height ) ) )
-      goto DestroyExit;
-
-    if ( populate_map_and_metrics )
-    {
-      FT_ULong  size;
-
-
-      metrics->width  = (FT_UShort)imgWidth;
-      metrics->height = (FT_UShort)imgHeight;
-
-      map->width      = metrics->width;
-      map->rows       = metrics->height;
-      map->pixel_mode = FT_PIXEL_MODE_BGRA;
-      map->pitch      = (int)( map->width * 4 );
-      map->num_grays  = 256;
-
-      /* reject too large bitmaps similarly to the rasterizer */
-      if ( map->rows > 0x7FFF || map->width > 0x7FFF )
-      {
-        error = FT_THROW( Array_Too_Large );
-        goto DestroyExit;
-      }
-
-      /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */
-      size = map->rows * (FT_ULong)map->pitch;
-
-      error = ft_glyphslot_alloc_bitmap( slot, size );
-      if ( error )
-        goto DestroyExit;
-    }
-
-    /* convert palette/gray image to rgb */
-    if ( color_type == PNG_COLOR_TYPE_PALETTE )
-      png_set_palette_to_rgb( png );
-
-    /* expand gray bit depth if needed */
-    if ( color_type == PNG_COLOR_TYPE_GRAY )
-    {
-#if PNG_LIBPNG_VER >= 10209
-      png_set_expand_gray_1_2_4_to_8( png );
-#else
-      png_set_gray_1_2_4_to_8( png );
-#endif
-    }
-
-    /* transform transparency to alpha */
-    if ( png_get_valid(png, info, PNG_INFO_tRNS ) )
-      png_set_tRNS_to_alpha( png );
-
-    if ( bitdepth == 16 )
-      png_set_strip_16( png );
-
-    if ( bitdepth < 8 )
-      png_set_packing( png );
-
-    /* convert grayscale to RGB */
-    if ( color_type == PNG_COLOR_TYPE_GRAY       ||
-         color_type == PNG_COLOR_TYPE_GRAY_ALPHA )
-      png_set_gray_to_rgb( png );
-
-    if ( interlace != PNG_INTERLACE_NONE )
-      png_set_interlace_handling( png );
-
-    png_set_filler( png, 0xFF, PNG_FILLER_AFTER );
-
-    /* recheck header after setting EXPAND options */
-    png_read_update_info(png, info );
-    png_get_IHDR( png, info,
-                  &imgWidth, &imgHeight,
-                  &bitdepth, &color_type, &interlace,
-                  NULL, NULL );
-
-    if ( bitdepth != 8                              ||
-        !( color_type == PNG_COLOR_TYPE_RGB       ||
-           color_type == PNG_COLOR_TYPE_RGB_ALPHA ) )
-    {
-      error = FT_THROW( Invalid_File_Format );
-      goto DestroyExit;
-    }
-
-    switch ( color_type )
-    {
-    default:
-      /* Shouldn't happen, but fall through. */
-
-    case PNG_COLOR_TYPE_RGB_ALPHA:
-      png_set_read_user_transform_fn( png, premultiply_data );
-      break;
-
-    case PNG_COLOR_TYPE_RGB:
-      /* Humm, this smells.  Carry on though. */
-      png_set_read_user_transform_fn( png, convert_bytes_to_data );
-      break;
-    }
-
-    if ( FT_NEW_ARRAY( rows, imgHeight ) )
-    {
-      error = FT_THROW( Out_Of_Memory );
-      goto DestroyExit;
-    }
-
-    for ( i = 0; i < (FT_Int)imgHeight; i++ )
-      rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4;
-
-    png_read_image( png, rows );
-
-    FT_FREE( rows );
-
-    png_read_end( png, info );
-
-  DestroyExit:
-    png_destroy_read_struct( &png, &info, NULL );
-    FT_Stream_Close( &stream );
-
-  Exit:
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_USE_PNG */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/pngshim.h b/third_party/freetype/src/sfnt/pngshim.h
deleted file mode 100644
index 4cc5c2b..0000000
--- a/third_party/freetype/src/sfnt/pngshim.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  pngshim.h                                                              */
-/*                                                                         */
-/*    PNG Bitmap glyph support.                                            */
-/*                                                                         */
-/*  Copyright 2013-2015 by                                                 */
-/*  Google, Inc.                                                           */
-/*  Written by Stuart Gill and Behdad Esfahbod.                            */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 __PNGSHIM_H__
-#define __PNGSHIM_H__
-
-
-#include <ft2build.h>
-#include "ttload.h"
-
-
-FT_BEGIN_HEADER
-
-#ifdef FT_CONFIG_OPTION_USE_PNG
-
-  FT_LOCAL( FT_Error )
-  Load_SBit_Png( FT_GlyphSlot     slot,
-                 FT_Int           x_offset,
-                 FT_Int           y_offset,
-                 FT_Int           pix_bits,
-                 TT_SBit_Metrics  metrics,
-                 FT_Memory        memory,
-                 FT_Byte*         data,
-                 FT_UInt          png_len,
-                 FT_Bool          populate_map_and_metrics );
-
-#endif
-
-FT_END_HEADER
-
-#endif /* __PNGSHIM_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttbdf.c b/third_party/freetype/src/sfnt/ttbdf.c
deleted file mode 100644
index 098b781..0000000
--- a/third_party/freetype/src/sfnt/ttbdf.c
+++ /dev/null
@@ -1,250 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttbdf.c                                                                */
-/*                                                                         */
-/*    TrueType and OpenType embedded BDF properties (body).                */
-/*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_TRUETYPE_TAGS_H
-#include "ttbdf.h"
-
-#include "sferrors.h"
-
-
-#ifdef TT_CONFIG_OPTION_BDF
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_ttbdf
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_free_bdf_props( TT_Face  face )
-  {
-    TT_BDF  bdf = &face->bdf;
-
-
-    if ( bdf->loaded )
-    {
-      FT_Stream  stream = FT_FACE(face)->stream;
-
-
-      if ( bdf->table != NULL )
-        FT_FRAME_RELEASE( bdf->table );
-
-      bdf->table_end    = NULL;
-      bdf->strings      = NULL;
-      bdf->strings_size = 0;
-    }
-  }
-
-
-  static FT_Error
-  tt_face_load_bdf_props( TT_Face    face,
-                          FT_Stream  stream )
-  {
-    TT_BDF    bdf = &face->bdf;
-    FT_ULong  length;
-    FT_Error  error;
-
-
-    FT_ZERO( bdf );
-
-    error = tt_face_goto_table( face, TTAG_BDF, stream, &length );
-    if ( error                                  ||
-         length < 8                             ||
-         FT_FRAME_EXTRACT( length, bdf->table ) )
-    {
-      error = FT_THROW( Invalid_Table );
-      goto Exit;
-    }
-
-    bdf->table_end = bdf->table + length;
-
-    {
-      FT_Byte*   p           = bdf->table;
-      FT_UInt    version     = FT_NEXT_USHORT( p );
-      FT_UInt    num_strikes = FT_NEXT_USHORT( p );
-      FT_ULong   strings     = FT_NEXT_ULONG ( p );
-      FT_UInt    count;
-      FT_Byte*   strike;
-
-
-      if ( version != 0x0001                 ||
-           strings < 8                       ||
-           ( strings - 8 ) / 4 < num_strikes ||
-           strings + 1 > length              )
-      {
-        goto BadTable;
-      }
-
-      bdf->num_strikes  = num_strikes;
-      bdf->strings      = bdf->table + strings;
-      bdf->strings_size = length - strings;
-
-      count  = bdf->num_strikes;
-      p      = bdf->table + 8;
-      strike = p + count * 4;
-
-
-      for ( ; count > 0; count-- )
-      {
-        FT_UInt  num_items = FT_PEEK_USHORT( p + 2 );
-
-        /*
-         *  We don't need to check the value sets themselves, since this
-         *  is done later.
-         */
-        strike += 10 * num_items;
-
-        p += 4;
-      }
-
-      if ( strike > bdf->strings )
-        goto BadTable;
-    }
-
-    bdf->loaded = 1;
-
-  Exit:
-    return error;
-
-  BadTable:
-    FT_FRAME_RELEASE( bdf->table );
-    FT_ZERO( bdf );
-    error = FT_THROW( Invalid_Table );
-    goto Exit;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_find_bdf_prop( TT_Face           face,
-                         const char*       property_name,
-                         BDF_PropertyRec  *aprop )
-  {
-    TT_BDF     bdf   = &face->bdf;
-    FT_Size    size  = FT_FACE(face)->size;
-    FT_Error   error = FT_Err_Ok;
-    FT_Byte*   p;
-    FT_UInt    count;
-    FT_Byte*   strike;
-    FT_Offset  property_len;
-
-
-    aprop->type = BDF_PROPERTY_TYPE_NONE;
-
-    if ( bdf->loaded == 0 )
-    {
-      error = tt_face_load_bdf_props( face, FT_FACE( face )->stream );
-      if ( error )
-        goto Exit;
-    }
-
-    count  = bdf->num_strikes;
-    p      = bdf->table + 8;
-    strike = p + 4 * count;
-
-    error = FT_ERR( Invalid_Argument );
-
-    if ( size == NULL || property_name == NULL )
-      goto Exit;
-
-    property_len = ft_strlen( property_name );
-    if ( property_len == 0 )
-      goto Exit;
-
-    for ( ; count > 0; count-- )
-    {
-      FT_UInt  _ppem  = FT_NEXT_USHORT( p );
-      FT_UInt  _count = FT_NEXT_USHORT( p );
-
-      if ( _ppem == size->metrics.y_ppem )
-      {
-        count = _count;
-        goto FoundStrike;
-      }
-
-      strike += 10 * _count;
-    }
-    goto Exit;
-
-  FoundStrike:
-    p = strike;
-    for ( ; count > 0; count-- )
-    {
-      FT_UInt  type = FT_PEEK_USHORT( p + 4 );
-
-      if ( ( type & 0x10 ) != 0 )
-      {
-        FT_UInt32  name_offset = FT_PEEK_ULONG( p     );
-        FT_UInt32  value       = FT_PEEK_ULONG( p + 6 );
-
-        /* be a bit paranoid for invalid entries here */
-        if ( name_offset < bdf->strings_size                    &&
-             property_len < bdf->strings_size - name_offset     &&
-             ft_strncmp( property_name,
-                         (const char*)bdf->strings + name_offset,
-                         bdf->strings_size - name_offset ) == 0 )
-        {
-          switch ( type & 0x0F )
-          {
-          case 0x00:  /* string */
-          case 0x01:  /* atoms */
-            /* check that the content is really 0-terminated */
-            if ( value < bdf->strings_size &&
-                 ft_memchr( bdf->strings + value, 0, bdf->strings_size ) )
-            {
-              aprop->type   = BDF_PROPERTY_TYPE_ATOM;
-              aprop->u.atom = (const char*)bdf->strings + value;
-              error         = FT_Err_Ok;
-              goto Exit;
-            }
-            break;
-
-          case 0x02:
-            aprop->type      = BDF_PROPERTY_TYPE_INTEGER;
-            aprop->u.integer = (FT_Int32)value;
-            error            = FT_Err_Ok;
-            goto Exit;
-
-          case 0x03:
-            aprop->type       = BDF_PROPERTY_TYPE_CARDINAL;
-            aprop->u.cardinal = value;
-            error             = FT_Err_Ok;
-            goto Exit;
-
-          default:
-            ;
-          }
-        }
-      }
-      p += 10;
-    }
-
-  Exit:
-    return error;
-  }
-
-#endif /* TT_CONFIG_OPTION_BDF */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttbdf.h b/third_party/freetype/src/sfnt/ttbdf.h
deleted file mode 100644
index fe4ba48..0000000
--- a/third_party/freetype/src/sfnt/ttbdf.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttbdf.h                                                                */
-/*                                                                         */
-/*    TrueType and OpenType embedded BDF properties (specification).       */
-/*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __TTBDF_H__
-#define __TTBDF_H__
-
-
-#include <ft2build.h>
-#include "ttload.h"
-#include FT_BDF_H
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( void )
-  tt_face_free_bdf_props( TT_Face  face );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_find_bdf_prop( TT_Face           face,
-                         const char*       property_name,
-                         BDF_PropertyRec  *aprop );
-
-
-FT_END_HEADER
-
-#endif /* __TTBDF_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/sfnt/ttsbit.c b/third_party/freetype/src/sfnt/ttsbit.c
deleted file mode 100644
index 3b351ec..0000000
--- a/third_party/freetype/src/sfnt/ttsbit.c
+++ /dev/null
@@ -1,1472 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttsbit.c                                                               */
-/*                                                                         */
-/*    TrueType and OpenType embedded bitmap support (body).                */
-/*                                                                         */
-/*  Copyright 2005-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  Copyright 2013 by Google, Inc.                                         */
-/*  Google Author(s): Behdad Esfahbod.                                     */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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_BITMAP_H
-#include "ttsbit.h"
-
-#include "sferrors.h"
-
-#include "ttmtx.h"
-#include "pngshim.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_ttsbit
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_sbit( TT_Face    face,
-                     FT_Stream  stream )
-  {
-    FT_Error  error;
-    FT_ULong  table_size;
-
-
-    face->sbit_table       = NULL;
-    face->sbit_table_size  = 0;
-    face->sbit_table_type  = TT_SBIT_TABLE_TYPE_NONE;
-    face->sbit_num_strikes = 0;
-
-    error = face->goto_table( face, TTAG_CBLC, stream, &table_size );
-    if ( !error )
-      face->sbit_table_type = TT_SBIT_TABLE_TYPE_CBLC;
-    else
-    {
-      error = face->goto_table( face, TTAG_EBLC, stream, &table_size );
-      if ( error )
-        error = face->goto_table( face, TTAG_bloc, stream, &table_size );
-      if ( !error )
-        face->sbit_table_type = TT_SBIT_TABLE_TYPE_EBLC;
-    }
-
-    if ( error )
-    {
-      error = face->goto_table( face, TTAG_sbix, stream, &table_size );
-      if ( !error )
-        face->sbit_table_type = TT_SBIT_TABLE_TYPE_SBIX;
-    }
-    if ( error )
-      goto Exit;
-
-    if ( table_size < 8 )
-    {
-      FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    switch ( (FT_UInt)face->sbit_table_type )
-    {
-    case TT_SBIT_TABLE_TYPE_EBLC:
-    case TT_SBIT_TABLE_TYPE_CBLC:
-      {
-        FT_Byte*  p;
-        FT_Fixed  version;
-        FT_ULong  num_strikes;
-        FT_UInt   count;
-
-
-        if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) )
-          goto Exit;
-
-        face->sbit_table_size = table_size;
-
-        p = face->sbit_table;
-
-        version     = FT_NEXT_LONG( p );
-        num_strikes = FT_NEXT_ULONG( p );
-
-        if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL )
-        {
-          error = FT_THROW( Unknown_File_Format );
-          goto Exit;
-        }
-
-        if ( num_strikes >= 0x10000UL )
-        {
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /*
-         *  Count the number of strikes available in the table.  We are a bit
-         *  paranoid there and don't trust the data.
-         */
-        count = (FT_UInt)num_strikes;
-        if ( 8 + 48UL * count > table_size )
-          count = (FT_UInt)( ( table_size - 8 ) / 48 );
-
-        face->sbit_num_strikes = count;
-      }
-      break;
-
-    case TT_SBIT_TABLE_TYPE_SBIX:
-      {
-        FT_UShort  version;
-        FT_UShort  flags;
-        FT_ULong   num_strikes;
-        FT_UInt    count;
-
-
-        if ( FT_FRAME_ENTER( 8 ) )
-          goto Exit;
-
-        version     = FT_GET_USHORT();
-        flags       = FT_GET_USHORT();
-        num_strikes = FT_GET_ULONG();
-
-        FT_FRAME_EXIT();
-
-        if ( version < 1 )
-        {
-          error = FT_THROW( Unknown_File_Format );
-          goto Exit;
-        }
-
-        /* Bit 0 must always be `1'.                            */
-        /* Bit 1 controls the overlay of bitmaps with outlines. */
-        /* All other bits should be zero.                       */
-        if ( !( flags == 1 || flags == 3 ) ||
-             num_strikes >= 0x10000UL      )
-        {
-          error = FT_THROW( Invalid_File_Format );
-          goto Exit;
-        }
-
-        /* we currently don't support bit 1; however, it is better to */
-        /* draw at least something...                                 */
-        if ( flags == 3 )
-          FT_TRACE1(( "tt_face_load_sbit_strikes:"
-                      " sbix overlay not supported yet\n"
-                      "                          "
-                      " expect bad rendering results\n" ));
-
-        /*
-         *  Count the number of strikes available in the table.  We are a bit
-         *  paranoid there and don't trust the data.
-         */
-        count = (FT_UInt)num_strikes;
-        if ( 8 + 4UL * count > table_size )
-          count = (FT_UInt)( ( table_size - 8 ) / 4 );
-
-        if ( FT_STREAM_SEEK( FT_STREAM_POS() - 8 ) )
-          goto Exit;
-
-        face->sbit_table_size = 8 + count * 4;
-        if ( FT_FRAME_EXTRACT( face->sbit_table_size, face->sbit_table ) )
-          goto Exit;
-
-        face->sbit_num_strikes = count;
-      }
-      break;
-
-    default:
-      error = FT_THROW( Unknown_File_Format );
-      break;
-    }
-
-    if ( !error )
-      FT_TRACE3(( "sbit_num_strikes: %u\n", face->sbit_num_strikes ));
-
-    return FT_Err_Ok;
-
-  Exit:
-    if ( error )
-    {
-      if ( face->sbit_table )
-        FT_FRAME_RELEASE( face->sbit_table );
-      face->sbit_table_size = 0;
-      face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE;
-    }
-
-    return error;
-  }
-
-
-  FT_LOCAL_DEF( void )
-  tt_face_free_sbit( TT_Face  face )
-  {
-    FT_Stream  stream = face->root.stream;
-
-
-    FT_FRAME_RELEASE( face->sbit_table );
-    face->sbit_table_size  = 0;
-    face->sbit_table_type  = TT_SBIT_TABLE_TYPE_NONE;
-    face->sbit_num_strikes = 0;
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_set_sbit_strike( TT_Face          face,
-                           FT_Size_Request  req,
-                           FT_ULong*        astrike_index )
-  {
-    return FT_Match_Size( (FT_Face)face, req, 0, astrike_index );
-  }
-
-
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_load_strike_metrics( TT_Face           face,
-                               FT_ULong          strike_index,
-                               FT_Size_Metrics*  metrics )
-  {
-    if ( strike_index >= (FT_ULong)face->sbit_num_strikes )
-      return FT_THROW( Invalid_Argument );
-
-    switch ( (FT_UInt)face->sbit_table_type )
-    {
-    case TT_SBIT_TABLE_TYPE_EBLC:
-    case TT_SBIT_TABLE_TYPE_CBLC:
-      {
-        FT_Byte*  strike;
-
-
-        strike = face->sbit_table + 8 + strike_index * 48;
-
-        metrics->x_ppem = (FT_UShort)strike[44];
-        metrics->y_ppem = (FT_UShort)strike[45];
-
-        metrics->ascender  = (FT_Char)strike[16] * 64;  /* hori.ascender  */
-        metrics->descender = (FT_Char)strike[17] * 64;  /* hori.descender */
-        metrics->height    = metrics->ascender - metrics->descender;
-
-        /* Is this correct? */
-        metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB  */
-                                          strike[18] + /* max_width      */
-                                 (FT_Char)strike[23]   /* min_advance_SB */
-                                                     ) * 64;
-        return FT_Err_Ok;
-      }
-
-    case TT_SBIT_TABLE_TYPE_SBIX:
-      {
-        FT_Stream       stream = face->root.stream;
-        FT_UInt         offset, upem;
-        FT_UShort       ppem, resolution;
-        TT_HoriHeader  *hori;
-        FT_ULong        table_size;
-        FT_Pos          ppem_, upem_; /* to reduce casts */
-
-        FT_Error  error;
-        FT_Byte*  p;
-
-
-        p      = face->sbit_table + 8 + 4 * strike_index;
-        offset = FT_NEXT_ULONG( p );
-
-        error = face->goto_table( face, TTAG_sbix, stream, &table_size );
-        if ( error )
-          return error;
-
-        if ( offset + 4  > table_size )
-          return FT_THROW( Invalid_File_Format );
-
-        if ( FT_STREAM_SEEK( FT_STREAM_POS() + offset ) ||
-             FT_FRAME_ENTER( 4 )                        )
-          return error;
-
-        ppem       = FT_GET_USHORT();
-        resolution = FT_GET_USHORT();
-
-        FT_UNUSED( resolution ); /* What to do with this? */
-
-        FT_FRAME_EXIT();
-
-        upem = face->header.Units_Per_EM;
-        hori = &face->horizontal;
-
-        metrics->x_ppem = ppem;
-        metrics->y_ppem = ppem;
-
-        ppem_ = (FT_Pos)ppem;
-        upem_ = (FT_Pos)upem;
-
-        metrics->ascender    = ppem_ * hori->Ascender * 64 / upem_;
-        metrics->descender   = ppem_ * hori->Descender * 64 / upem_;
-        metrics->height      = ppem_ * ( hori->Ascender -
-                                         hori->Descender +
-                                         hori->Line_Gap ) * 64 / upem_;
-        metrics->max_advance = ppem_ * hori->advance_Width_Max * 64 / upem_;
-
-        return error;
-      }
-
-    default:
-      return FT_THROW( Unknown_File_Format );
-    }
-  }
-
-
-  typedef struct  TT_SBitDecoderRec_
-  {
-    TT_Face          face;
-    FT_Stream        stream;
-    FT_Bitmap*       bitmap;
-    TT_SBit_Metrics  metrics;
-    FT_Bool          metrics_loaded;
-    FT_Bool          bitmap_allocated;
-    FT_Byte          bit_depth;
-
-    FT_ULong         ebdt_start;
-    FT_ULong         ebdt_size;
-
-    FT_ULong         strike_index_array;
-    FT_ULong         strike_index_count;
-    FT_Byte*         eblc_base;
-    FT_Byte*         eblc_limit;
-
-  } TT_SBitDecoderRec, *TT_SBitDecoder;
-
-
-  static FT_Error
-  tt_sbit_decoder_init( TT_SBitDecoder       decoder,
-                        TT_Face              face,
-                        FT_ULong             strike_index,
-                        TT_SBit_MetricsRec*  metrics )
-  {
-    FT_Error   error;
-    FT_Stream  stream = face->root.stream;
-    FT_ULong   ebdt_size;
-
-
-    error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size );
-    if ( error )
-      error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size );
-    if ( error )
-      error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size );
-    if ( error )
-      goto Exit;
-
-    decoder->face    = face;
-    decoder->stream  = stream;
-    decoder->bitmap  = &face->root.glyph->bitmap;
-    decoder->metrics = metrics;
-
-    decoder->metrics_loaded   = 0;
-    decoder->bitmap_allocated = 0;
-
-    decoder->ebdt_start = FT_STREAM_POS();
-    decoder->ebdt_size  = ebdt_size;
-
-    decoder->eblc_base  = face->sbit_table;
-    decoder->eblc_limit = face->sbit_table + face->sbit_table_size;
-
-    /* now find the strike corresponding to the index */
-    {
-      FT_Byte*  p;
-
-
-      if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size )
-      {
-        error = FT_THROW( Invalid_File_Format );
-        goto Exit;
-      }
-
-      p = decoder->eblc_base + 8 + 48 * strike_index;
-
-      decoder->strike_index_array = FT_NEXT_ULONG( p );
-      p                          += 4;
-      decoder->strike_index_count = FT_NEXT_ULONG( p );
-      p                          += 34;
-      decoder->bit_depth          = *p;
-
-      /* decoder->strike_index_array +                               */
-      /*   8 * decoder->strike_index_count > face->sbit_table_size ? */
-      if ( decoder->strike_index_array > face->sbit_table_size           ||
-           decoder->strike_index_count >
-             ( face->sbit_table_size - decoder->strike_index_array ) / 8 )
-        error = FT_THROW( Invalid_File_Format );
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  static void
-  tt_sbit_decoder_done( TT_SBitDecoder  decoder )
-  {
-    FT_UNUSED( decoder );
-  }
-
-
-  static FT_Error
-  tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder  decoder )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_UInt     width, height;
-    FT_Bitmap*  map = decoder->bitmap;
-    FT_ULong    size;
-
-
-    if ( !decoder->metrics_loaded )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    width  = decoder->metrics->width;
-    height = decoder->metrics->height;
-
-    map->width = width;
-    map->rows  = height;
-
-    switch ( decoder->bit_depth )
-    {
-    case 1:
-      map->pixel_mode = FT_PIXEL_MODE_MONO;
-      map->pitch      = (int)( ( map->width + 7 ) >> 3 );
-      map->num_grays  = 2;
-      break;
-
-    case 2:
-      map->pixel_mode = FT_PIXEL_MODE_GRAY2;
-      map->pitch      = (int)( ( map->width + 3 ) >> 2 );
-      map->num_grays  = 4;
-      break;
-
-    case 4:
-      map->pixel_mode = FT_PIXEL_MODE_GRAY4;
-      map->pitch      = (int)( ( map->width + 1 ) >> 1 );
-      map->num_grays  = 16;
-      break;
-
-    case 8:
-      map->pixel_mode = FT_PIXEL_MODE_GRAY;
-      map->pitch      = (int)( map->width );
-      map->num_grays  = 256;
-      break;
-
-    case 32:
-      map->pixel_mode = FT_PIXEL_MODE_BGRA;
-      map->pitch      = (int)( map->width * 4 );
-      map->num_grays  = 256;
-      break;
-
-    default:
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    size = map->rows * (FT_ULong)map->pitch;
-
-    /* check that there is no empty image */
-    if ( size == 0 )
-      goto Exit;     /* exit successfully! */
-
-    error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size );
-    if ( error )
-      goto Exit;
-
-    decoder->bitmap_allocated = 1;
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  tt_sbit_decoder_load_metrics( TT_SBitDecoder  decoder,
-                                FT_Byte*       *pp,
-                                FT_Byte*        limit,
-                                FT_Bool         big )
-  {
-    FT_Byte*         p       = *pp;
-    TT_SBit_Metrics  metrics = decoder->metrics;
-
-
-    if ( p + 5 > limit )
-      goto Fail;
-
-    metrics->height       = p[0];
-    metrics->width        = p[1];
-    metrics->horiBearingX = (FT_Char)p[2];
-    metrics->horiBearingY = (FT_Char)p[3];
-    metrics->horiAdvance  = p[4];
-
-    p += 5;
-    if ( big )
-    {
-      if ( p + 3 > limit )
-        goto Fail;
-
-      metrics->vertBearingX = (FT_Char)p[0];
-      metrics->vertBearingY = (FT_Char)p[1];
-      metrics->vertAdvance  = p[2];
-
-      p += 3;
-    }
-    else
-    {
-      /* avoid uninitialized data in case there is no vertical info -- */
-      metrics->vertBearingX = 0;
-      metrics->vertBearingY = 0;
-      metrics->vertAdvance  = 0;
-    }
-
-    decoder->metrics_loaded = 1;
-    *pp = p;
-    return FT_Err_Ok;
-
-  Fail:
-    FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table\n" ));
-    return FT_THROW( Invalid_Argument );
-  }
-
-
-  /* forward declaration */
-  static FT_Error
-  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
-                              FT_UInt         glyph_index,
-                              FT_Int          x_pos,
-                              FT_Int          y_pos );
-
-  typedef FT_Error  (*TT_SBitDecoder_LoadFunc)( TT_SBitDecoder  decoder,
-                                                FT_Byte*        p,
-                                                FT_Byte*        plimit,
-                                                FT_Int          x_pos,
-                                                FT_Int          y_pos );
-
-
-  static FT_Error
-  tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder  decoder,
-                                     FT_Byte*        p,
-                                     FT_Byte*        limit,
-                                     FT_Int          x_pos,
-                                     FT_Int          y_pos )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_Byte*    line;
-    FT_Int      pitch, width, height, line_bits, h;
-    FT_UInt     bit_height, bit_width;
-    FT_Bitmap*  bitmap;
-
-
-    /* check that we can write the glyph into the bitmap */
-    bitmap     = decoder->bitmap;
-    bit_width  = bitmap->width;
-    bit_height = bitmap->rows;
-    pitch      = bitmap->pitch;
-    line       = bitmap->buffer;
-
-    width  = decoder->metrics->width;
-    height = decoder->metrics->height;
-
-    line_bits = width * decoder->bit_depth;
-
-    if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width   ||
-         y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:"
-                  " invalid bitmap dimensions\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    /* now do the blit */
-    line  += y_pos * pitch + ( x_pos >> 3 );
-    x_pos &= 7;
-
-    if ( x_pos == 0 )  /* the easy one */
-    {
-      for ( h = height; h > 0; h--, line += pitch )
-      {
-        FT_Byte*  pwrite = line;
-        FT_Int    w;
-
-
-        for ( w = line_bits; w >= 8; w -= 8 )
-        {
-          pwrite[0] = (FT_Byte)( pwrite[0] | *p++ );
-          pwrite   += 1;
-        }
-
-        if ( w > 0 )
-          pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) );
-      }
-    }
-    else  /* x_pos > 0 */
-    {
-      for ( h = height; h > 0; h--, line += pitch )
-      {
-        FT_Byte*  pwrite = line;
-        FT_Int    w;
-        FT_UInt   wval = 0;
-
-
-        for ( w = line_bits; w >= 8; w -= 8 )
-        {
-          wval       = (FT_UInt)( wval | *p++ );
-          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
-          pwrite    += 1;
-          wval     <<= 8;
-        }
-
-        if ( w > 0 )
-          wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) );
-
-        /* all bits read and there are `x_pos + w' bits to be written */
-
-        pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
-
-        if ( x_pos + w > 8 )
-        {
-          pwrite++;
-          wval     <<= 8;
-          pwrite[0]  = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) );
-        }
-      }
-    }
-
-  Exit:
-    if ( !error )
-      FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" ));
-    return error;
-  }
-
-
-  /*
-   * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap
-   * (with pointer `pwrite').  In the example below, the width is 3 pixel,
-   * and `x_pos' is 1 pixel.
-   *
-   *       p                               p+1
-   *     |                               |                               |
-   *     | 7   6   5   4   3   2   1   0 | 7   6   5   4   3   2   1   0 |...
-   *     |                               |                               |
-   *       +-------+   +-------+   +-------+ ...
-   *           .           .           .
-   *           .           .           .
-   *           v           .           .
-   *       +-------+       .           .
-   * |                               | .
-   * | 7   6   5   4   3   2   1   0 | .
-   * |                               | .
-   *   pwrite              .           .
-   *                       .           .
-   *                       v           .
-   *                   +-------+       .
-   *             |                               |
-   *             | 7   6   5   4   3   2   1   0 |
-   *             |                               |
-   *               pwrite+1            .
-   *                                   .
-   *                                   v
-   *                               +-------+
-   *                         |                               |
-   *                         | 7   6   5   4   3   2   1   0 |
-   *                         |                               |
-   *                           pwrite+2
-   *
-   */
-
-  static FT_Error
-  tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder  decoder,
-                                    FT_Byte*        p,
-                                    FT_Byte*        limit,
-                                    FT_Int          x_pos,
-                                    FT_Int          y_pos )
-  {
-    FT_Error    error = FT_Err_Ok;
-    FT_Byte*    line;
-    FT_Int      pitch, width, height, line_bits, h, nbits;
-    FT_UInt     bit_height, bit_width;
-    FT_Bitmap*  bitmap;
-    FT_UShort   rval;
-
-
-    /* check that we can write the glyph into the bitmap */
-    bitmap     = decoder->bitmap;
-    bit_width  = bitmap->width;
-    bit_height = bitmap->rows;
-    pitch      = bitmap->pitch;
-    line       = bitmap->buffer;
-
-    width  = decoder->metrics->width;
-    height = decoder->metrics->height;
-
-    line_bits = width * decoder->bit_depth;
-
-    if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width   ||
-         y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:"
-                  " invalid bitmap dimensions\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    /* now do the blit */
-
-    /* adjust `line' to point to the first byte of the bitmap */
-    line  += y_pos * pitch + ( x_pos >> 3 );
-    x_pos &= 7;
-
-    /* the higher byte of `rval' is used as a buffer */
-    rval  = 0;
-    nbits = 0;
-
-    for ( h = height; h > 0; h--, line += pitch )
-    {
-      FT_Byte*  pwrite = line;
-      FT_Int    w      = line_bits;
-
-
-      /* handle initial byte (in target bitmap) specially if necessary */
-      if ( x_pos )
-      {
-        w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos;
-
-        if ( h == height )
-        {
-          rval  = *p++;
-          nbits = x_pos;
-        }
-        else if ( nbits < w )
-        {
-          if ( p < limit )
-            rval |= *p++;
-          nbits += 8 - w;
-        }
-        else
-        {
-          rval  >>= 8;
-          nbits  -= w;
-        }
-
-        *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) &
-                     ( ~( 0xFF << w ) << ( 8 - w - x_pos ) );
-        rval     <<= 8;
-
-        w = line_bits - w;
-      }
-
-      /* handle medial bytes */
-      for ( ; w >= 8; w -= 8 )
-      {
-        rval      |= *p++;
-        *pwrite++ |= ( rval >> nbits ) & 0xFF;
-
-        rval <<= 8;
-      }
-
-      /* handle final byte if necessary */
-      if ( w > 0 )
-      {
-        if ( nbits < w )
-        {
-          if ( p < limit )
-            rval |= *p++;
-          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
-          nbits   += 8 - w;
-
-          rval <<= 8;
-        }
-        else
-        {
-          *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w );
-          nbits   -= w;
-        }
-      }
-    }
-
-  Exit:
-    if ( !error )
-      FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" ));
-    return error;
-  }
-
-
-  static FT_Error
-  tt_sbit_decoder_load_compound( TT_SBitDecoder  decoder,
-                                 FT_Byte*        p,
-                                 FT_Byte*        limit,
-                                 FT_Int          x_pos,
-                                 FT_Int          y_pos )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_UInt   num_components, nn;
-
-    FT_Char  horiBearingX = (FT_Char)decoder->metrics->horiBearingX;
-    FT_Char  horiBearingY = (FT_Char)decoder->metrics->horiBearingY;
-    FT_Byte  horiAdvance  = (FT_Byte)decoder->metrics->horiAdvance;
-    FT_Char  vertBearingX = (FT_Char)decoder->metrics->vertBearingX;
-    FT_Char  vertBearingY = (FT_Char)decoder->metrics->vertBearingY;
-    FT_Byte  vertAdvance  = (FT_Byte)decoder->metrics->vertAdvance;
-
-
-    if ( p + 2 > limit )
-      goto Fail;
-
-    num_components = FT_NEXT_USHORT( p );
-    if ( p + 4 * num_components > limit )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" ));
-      goto Fail;
-    }
-
-    FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d components\n",
-                num_components ));
-
-    for ( nn = 0; nn < num_components; nn++ )
-    {
-      FT_UInt  gindex = FT_NEXT_USHORT( p );
-      FT_Byte  dx     = FT_NEXT_BYTE( p );
-      FT_Byte  dy     = FT_NEXT_BYTE( p );
-
-
-      /* NB: a recursive call */
-      error = tt_sbit_decoder_load_image( decoder, gindex,
-                                          x_pos + dx, y_pos + dy );
-      if ( error )
-        break;
-    }
-
-    FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" ));
-
-    decoder->metrics->horiBearingX = horiBearingX;
-    decoder->metrics->horiBearingY = horiBearingY;
-    decoder->metrics->horiAdvance  = horiAdvance;
-    decoder->metrics->vertBearingX = vertBearingX;
-    decoder->metrics->vertBearingY = vertBearingY;
-    decoder->metrics->vertAdvance  = vertAdvance;
-    decoder->metrics->width        = (FT_Byte)decoder->bitmap->width;
-    decoder->metrics->height       = (FT_Byte)decoder->bitmap->rows;
-
-  Exit:
-    return error;
-
-  Fail:
-    error = FT_THROW( Invalid_File_Format );
-    goto Exit;
-  }
-
-
-#ifdef FT_CONFIG_OPTION_USE_PNG
-
-  static FT_Error
-  tt_sbit_decoder_load_png( TT_SBitDecoder  decoder,
-                            FT_Byte*        p,
-                            FT_Byte*        limit,
-                            FT_Int          x_pos,
-                            FT_Int          y_pos )
-  {
-    FT_Error  error = FT_Err_Ok;
-    FT_ULong  png_len;
-
-
-    if ( limit - p < 4 )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    png_len = FT_NEXT_ULONG( p );
-    if ( (FT_ULong)( limit - p ) < png_len )
-    {
-      FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" ));
-      error = FT_THROW( Invalid_File_Format );
-      goto Exit;
-    }
-
-    error = Load_SBit_Png( decoder->face->root.glyph,
-                           x_pos,
-                           y_pos,
-                           decoder->bit_depth,
-                           decoder->metrics,
-                           decoder->stream->memory,
-                           p,
-                           png_len,
-                           FALSE );
-
-  Exit:
-    if ( !error )
-      FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" ));
-    return error;
-  }
-
-#endif /* FT_CONFIG_OPTION_USE_PNG */
-
-
-  static FT_Error
-  tt_sbit_decoder_load_bitmap( TT_SBitDecoder  decoder,
-                               FT_UInt         glyph_format,
-                               FT_ULong        glyph_start,
-                               FT_ULong        glyph_size,
-                               FT_Int          x_pos,
-                               FT_Int          y_pos )
-  {
-    FT_Error   error;
-    FT_Stream  stream = decoder->stream;
-    FT_Byte*   p;
-    FT_Byte*   p_limit;
-    FT_Byte*   data;
-
-
-    /* seek into the EBDT table now */
-    if ( glyph_start + glyph_size > decoder->ebdt_size )
-    {
-      error = FT_THROW( Invalid_Argument );
-      goto Exit;
-    }
-
-    if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) ||
-         FT_FRAME_EXTRACT( glyph_size, data )                )
-      goto Exit;
-
-    p       = data;
-    p_limit = p + glyph_size;
-
-    /* read the data, depending on the glyph format */
-    switch ( glyph_format )
-    {
-    case 1:
-    case 2:
-    case 8:
-    case 17:
-      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 );
-      break;
-
-    case 6:
-    case 7:
-    case 9:
-    case 18:
-      error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 );
-      break;
-
-    default:
-      error = FT_Err_Ok;
-    }
-
-    if ( error )
-      goto Fail;
-
-    {
-      TT_SBitDecoder_LoadFunc  loader;
-
-
-      switch ( glyph_format )
-      {
-      case 1:
-      case 6:
-        loader = tt_sbit_decoder_load_byte_aligned;
-        break;
-
-      case 2:
-      case 7:
-        {
-          /* Don't trust `glyph_format'.  For example, Apple's main Korean */
-          /* system font, `AppleMyungJo.ttf' (version 7.0d2e6), uses glyph */
-          /* format 7, but the data is format 6.  We check whether we have */
-          /* an excessive number of bytes in the image: If it is equal to  */
-          /* the value for a byte-aligned glyph, use the other loading     */
-          /* routine.                                                      */
-          /*                                                               */
-          /* Note that for some (width,height) combinations, where the     */
-          /* width is not a multiple of 8, the sizes for bit- and          */
-          /* byte-aligned data are equal, for example (7,7) or (15,6).  We */
-          /* then prefer what `glyph_format' specifies.                    */
-
-          FT_UInt  width  = decoder->metrics->width;
-          FT_UInt  height = decoder->metrics->height;
-
-          FT_UInt  bit_size  = ( width * height + 7 ) >> 3;
-          FT_UInt  byte_size = height * ( ( width + 7 ) >> 3 );
-
-
-          if ( bit_size < byte_size                  &&
-               byte_size == (FT_UInt)( p_limit - p ) )
-            loader = tt_sbit_decoder_load_byte_aligned;
-          else
-            loader = tt_sbit_decoder_load_bit_aligned;
-        }
-        break;
-
-      case 5:
-        loader = tt_sbit_decoder_load_bit_aligned;
-        break;
-
-      case 8:
-        if ( p + 1 > p_limit )
-          goto Fail;
-
-        p += 1;  /* skip padding */
-        /* fall-through */
-
-      case 9:
-        loader = tt_sbit_decoder_load_compound;
-        break;
-
-      case 17: /* small metrics, PNG image data   */
-      case 18: /* big metrics, PNG image data     */
-      case 19: /* metrics in EBLC, PNG image data */
-#ifdef FT_CONFIG_OPTION_USE_PNG
-        loader = tt_sbit_decoder_load_png;
-        break;
-#else
-        error = FT_THROW( Unimplemented_Feature );
-        goto Fail;
-#endif /* FT_CONFIG_OPTION_USE_PNG */
-
-      default:
-        error = FT_THROW( Invalid_Table );
-        goto Fail;
-      }
-
-      if ( !decoder->bitmap_allocated )
-      {
-        error = tt_sbit_decoder_alloc_bitmap( decoder );
-        if ( error )
-          goto Fail;
-      }
-
-      error = loader( decoder, p, p_limit, x_pos, y_pos );
-    }
-
-  Fail:
-    FT_FRAME_RELEASE( data );
-
-  Exit:
-    return error;
-  }
-
-
-  static FT_Error
-  tt_sbit_decoder_load_image( TT_SBitDecoder  decoder,
-                              FT_UInt         glyph_index,
-                              FT_Int          x_pos,
-                              FT_Int          y_pos )
-  {
-    /*
-     *  First, we find the correct strike range that applies to this
-     *  glyph index.
-     */
-
-    FT_Byte*  p          = decoder->eblc_base + decoder->strike_index_array;
-    FT_Byte*  p_limit    = decoder->eblc_limit;
-    FT_ULong  num_ranges = decoder->strike_index_count;
-    FT_UInt   start, end, index_format, image_format;
-    FT_ULong  image_start = 0, image_end = 0, image_offset;
-
-
-    for ( ; num_ranges > 0; num_ranges-- )
-    {
-      start = FT_NEXT_USHORT( p );
-      end   = FT_NEXT_USHORT( p );
-
-      if ( glyph_index >= start && glyph_index <= end )
-        goto FoundRange;
-
-      p += 4;  /* ignore index offset */
-    }
-    goto NoBitmap;
-
-  FoundRange:
-    image_offset = FT_NEXT_ULONG( p );
-
-    /* overflow check */
-    p = decoder->eblc_base + decoder->strike_index_array;
-    if ( image_offset > (FT_ULong)( p_limit - p ) )
-      goto Failure;
-
-    p += image_offset;
-    if ( p + 8 > p_limit )
-      goto NoBitmap;
-
-    /* now find the glyph's location and extend within the ebdt table */
-    index_format = FT_NEXT_USHORT( p );
-    image_format = FT_NEXT_USHORT( p );
-    image_offset = FT_NEXT_ULONG ( p );
-
-    switch ( index_format )
-    {
-    case 1: /* 4-byte offsets relative to `image_offset' */
-      p += 4 * ( glyph_index - start );
-      if ( p + 8 > p_limit )
-        goto NoBitmap;
-
-      image_start = FT_NEXT_ULONG( p );
-      image_end   = FT_NEXT_ULONG( p );
-
-      if ( image_start == image_end )  /* missing glyph */
-        goto NoBitmap;
-      break;
-
-    case 2: /* big metrics, constant image size */
-      {
-        FT_ULong  image_size;
-
-
-        if ( p + 12 > p_limit )
-          goto NoBitmap;
-
-        image_size = FT_NEXT_ULONG( p );
-
-        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
-          goto NoBitmap;
-
-        image_start = image_size * ( glyph_index - start );
-        image_end   = image_start + image_size;
-      }
-      break;
-
-    case 3: /* 2-byte offsets relative to 'image_offset' */
-      p += 2 * ( glyph_index - start );
-      if ( p + 4 > p_limit )
-        goto NoBitmap;
-
-      image_start = FT_NEXT_USHORT( p );
-      image_end   = FT_NEXT_USHORT( p );
-
-      if ( image_start == image_end )  /* missing glyph */
-        goto NoBitmap;
-      break;
-
-    case 4: /* sparse glyph array with (glyph,offset) pairs */
-      {
-        FT_ULong  mm, num_glyphs;
-
-
-        if ( p + 4 > p_limit )
-          goto NoBitmap;
-
-        num_glyphs = FT_NEXT_ULONG( p );
-
-        /* overflow check for p + ( num_glyphs + 1 ) * 4 */
-        if ( p + 4 > p_limit                                         ||
-             num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) )
-          goto NoBitmap;
-
-        for ( mm = 0; mm < num_glyphs; mm++ )
-        {
-          FT_UInt  gindex = FT_NEXT_USHORT( p );
-
-
-          if ( gindex == glyph_index )
-          {
-            image_start = FT_NEXT_USHORT( p );
-            p          += 2;
-            image_end   = FT_PEEK_USHORT( p );
-            break;
-          }
-          p += 2;
-        }
-
-        if ( mm >= num_glyphs )
-          goto NoBitmap;
-      }
-      break;
-
-    case 5: /* constant metrics with sparse glyph codes */
-    case 19:
-      {
-        FT_ULong  image_size, mm, num_glyphs;
-
-
-        if ( p + 16 > p_limit )
-          goto NoBitmap;
-
-        image_size = FT_NEXT_ULONG( p );
-
-        if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) )
-          goto NoBitmap;
-
-        num_glyphs = FT_NEXT_ULONG( p );
-
-        /* overflow check for p + 2 * num_glyphs */
-        if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) )
-          goto NoBitmap;
-
-        for ( mm = 0; mm < num_glyphs; mm++ )
-        {
-          FT_UInt  gindex = FT_NEXT_USHORT( p );
-
-
-          if ( gindex == glyph_index )
-            break;
-        }
-
-        if ( mm >= num_glyphs )
-          goto NoBitmap;
-
-        image_start = image_size * mm;
-        image_end   = image_start + image_size;
-      }
-      break;
-
-    default:
-      goto NoBitmap;
-    }
-
-    if ( image_start > image_end )
-      goto NoBitmap;
-
-    image_end  -= image_start;
-    image_start = image_offset + image_start;
-
-    FT_TRACE3(( "tt_sbit_decoder_load_image:"
-                " found sbit (format %d) for glyph index %d\n",
-                image_format, glyph_index ));
-
-    return tt_sbit_decoder_load_bitmap( decoder,
-                                        image_format,
-                                        image_start,
-                                        image_end,
-                                        x_pos,
-                                        y_pos );
-
-  Failure:
-    return FT_THROW( Invalid_Table );
-
-  NoBitmap:
-    FT_TRACE4(( "tt_sbit_decoder_load_image:"
-                " no sbit found for glyph index %d\n", glyph_index ));
-
-    return FT_THROW( Invalid_Argument );
-  }
-
-
-  static FT_Error
-  tt_face_load_sbix_image( TT_Face              face,
-                           FT_ULong             strike_index,
-                           FT_UInt              glyph_index,
-                           FT_Stream            stream,
-                           FT_Bitmap           *map,
-                           TT_SBit_MetricsRec  *metrics )
-  {
-    FT_UInt   sbix_pos, strike_offset, glyph_start, glyph_end;
-    FT_ULong  table_size;
-    FT_Int    originOffsetX, originOffsetY;
-    FT_Tag    graphicType;
-    FT_Int    recurse_depth = 0;
-
-    FT_Error  error;
-    FT_Byte*  p;
-
-    FT_UNUSED( map );
-
-
-    metrics->width  = 0;
-    metrics->height = 0;
-
-    p = face->sbit_table + 8 + 4 * strike_index;
-    strike_offset = FT_NEXT_ULONG( p );
-
-    error = face->goto_table( face, TTAG_sbix, stream, &table_size );
-    if ( error )
-      return error;
-    sbix_pos = FT_STREAM_POS();
-
-  retry:
-    if ( glyph_index > (FT_UInt)face->root.num_glyphs )
-      return FT_THROW( Invalid_Argument );
-
-    if ( strike_offset >= table_size                          ||
-         table_size - strike_offset < 4 + glyph_index * 4 + 8 )
-      return FT_THROW( Invalid_File_Format );
-
-    if ( FT_STREAM_SEEK( sbix_pos + strike_offset + 4 + glyph_index * 4 ) ||
-         FT_FRAME_ENTER( 8 )                                              )
-      return error;
-
-    glyph_start = FT_GET_ULONG();
-    glyph_end   = FT_GET_ULONG();
-
-    FT_FRAME_EXIT();
-
-    if ( glyph_start == glyph_end )
-      return FT_THROW( Invalid_Argument );
-    if ( glyph_start > glyph_end                ||
-         glyph_end - glyph_start < 8            ||
-         table_size - strike_offset < glyph_end )
-      return FT_THROW( Invalid_File_Format );
-
-    if ( FT_STREAM_SEEK( sbix_pos + strike_offset + glyph_start ) ||
-         FT_FRAME_ENTER( glyph_end - glyph_start )                )
-      return error;
-
-    originOffsetX = FT_GET_SHORT();
-    originOffsetY = FT_GET_SHORT();
-
-    graphicType = FT_GET_TAG4();
-
-    switch ( graphicType )
-    {
-    case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ):
-      if ( recurse_depth < 4 )
-      {
-        glyph_index = FT_GET_USHORT();
-        FT_FRAME_EXIT();
-        recurse_depth++;
-        goto retry;
-      }
-      error = FT_THROW( Invalid_File_Format );
-      break;
-
-    case FT_MAKE_TAG( 'p', 'n', 'g', ' ' ):
-#ifdef FT_CONFIG_OPTION_USE_PNG
-      error = Load_SBit_Png( face->root.glyph,
-                             0,
-                             0,
-                             32,
-                             metrics,
-                             stream->memory,
-                             stream->cursor,
-                             glyph_end - glyph_start - 8,
-                             TRUE );
-#else
-      error = FT_THROW( Unimplemented_Feature );
-#endif
-      break;
-
-    case FT_MAKE_TAG( 'j', 'p', 'g', ' ' ):
-    case FT_MAKE_TAG( 't', 'i', 'f', 'f' ):
-    case FT_MAKE_TAG( 'r', 'g', 'b', 'l' ): /* used on iOS 7.1 */
-      error = FT_THROW( Unknown_File_Format );
-      break;
-
-    default:
-      error = FT_THROW( Unimplemented_Feature );
-      break;
-    }
-
-    FT_FRAME_EXIT();
-
-    if ( !error )
-    {
-      FT_Short   abearing;
-      FT_UShort  aadvance;
-
-
-      tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance );
-
-      metrics->horiBearingX = (FT_Short)originOffsetX;
-      metrics->horiBearingY = (FT_Short)( -originOffsetY + metrics->height );
-      metrics->horiAdvance  = (FT_UShort)( aadvance *
-                                           face->root.size->metrics.x_ppem /
-                                           face->header.Units_Per_EM );
-    }
-
-    return error;
-  }
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_sbit_image( TT_Face              face,
-                           FT_ULong             strike_index,
-                           FT_UInt              glyph_index,
-                           FT_UInt              load_flags,
-                           FT_Stream            stream,
-                           FT_Bitmap           *map,
-                           TT_SBit_MetricsRec  *metrics )
-  {
-    FT_Error  error = FT_Err_Ok;
-
-
-    switch ( (FT_UInt)face->sbit_table_type )
-    {
-    case TT_SBIT_TABLE_TYPE_EBLC:
-    case TT_SBIT_TABLE_TYPE_CBLC:
-      {
-        TT_SBitDecoderRec  decoder[1];
-
-
-        error = tt_sbit_decoder_init( decoder, face, strike_index, metrics );
-        if ( !error )
-        {
-          error = tt_sbit_decoder_load_image( decoder,
-                                              glyph_index,
-                                              0,
-                                              0 );
-          tt_sbit_decoder_done( decoder );
-        }
-      }
-      break;
-
-    case TT_SBIT_TABLE_TYPE_SBIX:
-      error = tt_face_load_sbix_image( face,
-                                       strike_index,
-                                       glyph_index,
-                                       stream,
-                                       map,
-                                       metrics );
-      break;
-
-    default:
-      error = FT_THROW( Unknown_File_Format );
-      break;
-    }
-
-    /* Flatten color bitmaps if color was not requested. */
-    if ( !error                                &&
-         !( load_flags & FT_LOAD_COLOR )       &&
-         map->pixel_mode == FT_PIXEL_MODE_BGRA )
-    {
-      FT_Bitmap   new_map;
-      FT_Library  library = face->root.glyph->library;
-
-
-      FT_Bitmap_Init( &new_map );
-
-      /* Convert to 8bit grayscale. */
-      error = FT_Bitmap_Convert( library, map, &new_map, 1 );
-      if ( error )
-        FT_Bitmap_Done( library, &new_map );
-      else
-      {
-        map->pixel_mode = new_map.pixel_mode;
-        map->pitch      = new_map.pitch;
-        map->num_grays  = new_map.num_grays;
-
-        ft_glyphslot_set_bitmap( face->root.glyph, new_map.buffer );
-        face->root.glyph->internal->flags |= FT_GLYPH_OWN_BITMAP;
-      }
-    }
-
-    return error;
-  }
-
-
-/* EOF */
diff --git a/third_party/freetype/src/sfnt/ttsbit.h b/third_party/freetype/src/sfnt/ttsbit.h
deleted file mode 100644
index d4e13ae..0000000
--- a/third_party/freetype/src/sfnt/ttsbit.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttsbit.h                                                               */
-/*                                                                         */
-/*    TrueType and OpenType embedded bitmap support (specification).       */
-/*                                                                         */
-/*  Copyright 1996-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-#ifndef __TTSBIT_H__
-#define __TTSBIT_H__
-
-
-#include <ft2build.h>
-#include "ttload.h"
-
-
-FT_BEGIN_HEADER
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_sbit( TT_Face    face,
-                     FT_Stream  stream );
-
-  FT_LOCAL( void )
-  tt_face_free_sbit( TT_Face  face );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_set_sbit_strike( TT_Face          face,
-                           FT_Size_Request  req,
-                           FT_ULong*        astrike_index );
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_strike_metrics( TT_Face           face,
-                               FT_ULong          strike_index,
-                               FT_Size_Metrics*  metrics );
-
-  FT_LOCAL( FT_Error )
-  tt_face_load_sbit_image( TT_Face              face,
-                           FT_ULong             strike_index,
-                           FT_UInt              glyph_index,
-                           FT_UInt              load_flags,
-                           FT_Stream            stream,
-                           FT_Bitmap           *map,
-                           TT_SBit_MetricsRec  *metrics );
-
-
-FT_END_HEADER
-
-#endif /* __TTSBIT_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/smooth/Jamfile b/third_party/freetype/src/smooth/Jamfile
deleted file mode 100644
index b1887c2..0000000
--- a/third_party/freetype/src/smooth/Jamfile
+++ /dev/null
@@ -1,32 +0,0 @@
-# FreeType 2 src/smooth Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) smooth ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = ftgrays
-               ftsmooth
-               ftspic
-               ;
-  }
-  else
-  {
-    _sources = smooth ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/smooth Jamfile
diff --git a/third_party/freetype/src/truetype/Jamfile b/third_party/freetype/src/truetype/Jamfile
deleted file mode 100644
index 88cc26f..0000000
--- a/third_party/freetype/src/truetype/Jamfile
+++ /dev/null
@@ -1,37 +0,0 @@
-# FreeType 2 src/truetype Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) truetype ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = ttdriver
-               ttgload
-               ttgxvar
-               ttinterp
-               ttobjs
-               ttpic
-               ttpload
-               ttsubpix
-               ;
-  }
-  else
-  {
-    _sources = truetype ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/truetype Jamfile
diff --git a/third_party/freetype/src/truetype/ttgxvar.c b/third_party/freetype/src/truetype/ttgxvar.c
deleted file mode 100644
index dd9e250..0000000
--- a/third_party/freetype/src/truetype/ttgxvar.c
+++ /dev/null
@@ -1,2074 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttgxvar.c                                                              */
-/*                                                                         */
-/*    TrueType GX Font Variation loader                                    */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, Werner Lemberg, and George Williams.     */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
-/*  this file you indicate that you have read the license and              */
-/*  understand and accept it fully.                                        */
-/*                                                                         */
-/***************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at      */
-  /*                                                                       */
-  /*   https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html */
-  /*                                                                       */
-  /* The documentation for `fvar' is inconsistent.  At one point it says   */
-  /* that `countSizePairs' should be 3, at another point 2.  It should     */
-  /* be 2.                                                                 */
-  /*                                                                       */
-  /* The documentation for `gvar' is not intelligible; `cvar' refers you   */
-  /* to `gvar' and is thus also incomprehensible.                          */
-  /*                                                                       */
-  /* The documentation for `avar' appears correct, but Apple has no fonts  */
-  /* with an `avar' table, so it is hard to test.                          */
-  /*                                                                       */
-  /* Many thanks to John Jenkins (at Apple) in figuring this out.          */
-  /*                                                                       */
-  /*                                                                       */
-  /* Apple's `kern' table has some references to tuple indices, but as     */
-  /* there is no indication where these indices are defined, nor how to    */
-  /* interpolate the kerning values (different tuples have different       */
-  /* classes) this issue is ignored.                                       */
-  /*                                                                       */
-  /*************************************************************************/
-
-
-#include <ft2build.h>
-#include FT_INTERNAL_DEBUG_H
-#include FT_CONFIG_CONFIG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_SFNT_H
-#include FT_TRUETYPE_TAGS_H
-#include FT_MULTIPLE_MASTERS_H
-
-#include "ttpload.h"
-#include "ttgxvar.h"
-
-#include "tterrors.h"
-
-
-#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
-
-
-#define FT_Stream_FTell( stream )                         \
-          (FT_ULong)( (stream)->cursor - (stream)->base )
-#define FT_Stream_SeekSet( stream, off )                  \
-          ( (stream)->cursor = (stream)->base + (off) )
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* 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_ttgxvar
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                       Internal Routines                       *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'.  It        */
-  /* indicates that there is a delta for every point without needing to    */
-  /* enumerate all of them.                                                */
-  /*                                                                       */
-
-  /* ensure that value `0' has the same width as a pointer */
-#define ALL_POINTS  (FT_UShort*)~(FT_PtrDist)0
-
-
-#define GX_PT_POINTS_ARE_WORDS      0x80U
-#define GX_PT_POINT_RUN_COUNT_MASK  0x7FU
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_var_readpackedpoints                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Read a set of points to which the following deltas will apply.     */
-  /*    Points are packed with a run length encoding.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream    :: The data stream.                                      */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    point_cnt :: The number of points read.  A zero value means that   */
-  /*                 all points in the glyph will be affected, without     */
-  /*                 enumerating them individually.                        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    An array of FT_UShort containing the affected points or the        */
-  /*    special value ALL_POINTS.                                          */
-  /*                                                                       */
-  static FT_UShort*
-  ft_var_readpackedpoints( FT_Stream  stream,
-                           FT_UInt   *point_cnt )
-  {
-    FT_UShort *points = NULL;
-    FT_UInt    n;
-    FT_UInt    runcnt;
-    FT_UInt    i, j;
-    FT_UShort  first;
-    FT_Memory  memory = stream->memory;
-    FT_Error   error  = FT_Err_Ok;
-
-    FT_UNUSED( error );
-
-
-    *point_cnt = 0;
-
-    n = FT_GET_BYTE();
-    if ( n == 0 )
-      return ALL_POINTS;
-
-    if ( n & GX_PT_POINTS_ARE_WORDS )
-    {
-      n  &= GX_PT_POINT_RUN_COUNT_MASK;
-      n <<= 8;
-      n  |= FT_GET_BYTE();
-    }
-
-    if ( FT_NEW_ARRAY( points, n ) )
-      return NULL;
-
-    *point_cnt = n;
-
-    i = 0;
-    while ( i < n )
-    {
-      runcnt = FT_GET_BYTE();
-      if ( runcnt & GX_PT_POINTS_ARE_WORDS )
-      {
-        runcnt     &= GX_PT_POINT_RUN_COUNT_MASK;
-        first       = FT_GET_USHORT();
-        points[i++] = first;
-
-        if ( runcnt < 1 || i + runcnt > n )
-          goto Exit;
-
-        /* first point not included in run count */
-        for ( j = 0; j < runcnt; j++ )
-        {
-          first      += FT_GET_USHORT();
-          points[i++] = first;
-        }
-      }
-      else
-      {
-        first       = FT_GET_BYTE();
-        points[i++] = first;
-
-        if ( runcnt < 1 || i + runcnt > n )
-          goto Exit;
-
-        for ( j = 0; j < runcnt; j++ )
-        {
-          first      += FT_GET_BYTE();
-          points[i++] = first;
-        }
-      }
-    }
-
-  Exit:
-    return points;
-  }
-
-
-#define GX_DT_DELTAS_ARE_ZERO       0x80U
-#define GX_DT_DELTAS_ARE_WORDS      0x40U
-#define GX_DT_DELTA_RUN_COUNT_MASK  0x3FU
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_var_readpackeddeltas                                            */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Read a set of deltas.  These are packed slightly differently than  */
-  /*    points.  In particular there is no overall count.                  */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream    :: The data stream.                                      */
-  /*                                                                       */
-  /*    delta_cnt :: The number of deltas to be read.                      */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    An array of FT_Short containing the deltas for the affected        */
-  /*    points.  (This only gets the deltas for one dimension.  It will    */
-  /*    generally be called twice, once for x, once for y.  When used in   */
-  /*    cvt table, it will only be called once.)                           */
-  /*                                                                       */
-  static FT_Short*
-  ft_var_readpackeddeltas( FT_Stream  stream,
-                           FT_UInt    delta_cnt )
-  {
-    FT_Short  *deltas = NULL;
-    FT_UInt    runcnt, cnt;
-    FT_UInt    i, j;
-    FT_Memory  memory = stream->memory;
-    FT_Error   error  = FT_Err_Ok;
-
-    FT_UNUSED( error );
-
-
-    if ( FT_NEW_ARRAY( deltas, delta_cnt ) )
-      return NULL;
-
-    i = 0;
-    while ( i < delta_cnt )
-    {
-      runcnt = FT_GET_BYTE();
-      cnt    = runcnt & GX_DT_DELTA_RUN_COUNT_MASK;
-
-      if ( runcnt & GX_DT_DELTAS_ARE_ZERO )
-      {
-        /* `runcnt' zeroes get added */
-        for ( j = 0; j <= cnt && i < delta_cnt; j++ )
-          deltas[i++] = 0;
-      }
-      else if ( runcnt & GX_DT_DELTAS_ARE_WORDS )
-      {
-        /* `runcnt' shorts from the stack */
-        for ( j = 0; j <= cnt && i < delta_cnt; j++ )
-          deltas[i++] = FT_GET_SHORT();
-      }
-      else
-      {
-        /* `runcnt' signed bytes from the stack */
-        for ( j = 0; j <= cnt && i < delta_cnt; j++ )
-          deltas[i++] = FT_GET_CHAR();
-      }
-
-      if ( j <= cnt )
-      {
-        /* bad format */
-        FT_FREE( deltas );
-        return NULL;
-      }
-    }
-
-    return deltas;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_var_load_avar                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Parse the `avar' table if present.  It need not be, so we return   */
-  /*    nothing.                                                           */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face :: The font face.                                             */
-  /*                                                                       */
-  static void
-  ft_var_load_avar( TT_Face  face )
-  {
-    FT_Stream       stream = FT_FACE_STREAM( face );
-    FT_Memory       memory = stream->memory;
-    GX_Blend        blend  = face->blend;
-    GX_AVarSegment  segment;
-    FT_Error        error = FT_Err_Ok;
-    FT_Long         version;
-    FT_Long         axisCount;
-    FT_Int          i, j;
-    FT_ULong        table_len;
-
-    FT_UNUSED( error );
-
-
-    FT_TRACE2(( "AVAR " ));
-
-    blend->avar_checked = TRUE;
-    error = face->goto_table( face, TTAG_avar, stream, &table_len );
-    if ( error )
-    {
-      FT_TRACE2(( "is missing\n" ));
-      return;
-    }
-
-    if ( FT_FRAME_ENTER( table_len ) )
-      return;
-
-    version   = FT_GET_LONG();
-    axisCount = FT_GET_LONG();
-
-    if ( version != 0x00010000L )
-    {
-      FT_TRACE2(( "bad table version\n" ));
-      goto Exit;
-    }
-
-    FT_TRACE2(( "loaded\n" ));
-
-    if ( axisCount != (FT_Long)blend->mmvar->num_axis )
-    {
-      FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `cvar'\n"
-                  "                  table are different\n" ));
-      goto Exit;
-    }
-
-    if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) )
-      goto Exit;
-
-    segment = &blend->avar_segment[0];
-    for ( i = 0; i < axisCount; i++, segment++ )
-    {
-      FT_TRACE5(( "  axis %d:\n", i ));
-
-      segment->pairCount = FT_GET_USHORT();
-      if ( FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) )
-      {
-        /* Failure.  Free everything we have done so far.  We must do */
-        /* it right now since loading the `avar' table is optional.   */
-
-        for ( j = i - 1; j >= 0; j-- )
-          FT_FREE( blend->avar_segment[j].correspondence );
-
-        FT_FREE( blend->avar_segment );
-        blend->avar_segment = NULL;
-        goto Exit;
-      }
-
-      for ( j = 0; j < segment->pairCount; j++ )
-      {
-        /* convert to Fixed */
-        segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4;
-        segment->correspondence[j].toCoord   = FT_GET_SHORT() * 4;
-
-        FT_TRACE5(( "    mapping %.4f to %.4f\n",
-                    segment->correspondence[j].fromCoord / 65536.0,
-                    segment->correspondence[j].toCoord / 65536.0 ));
-      }
-
-      FT_TRACE5(( "\n" ));
-    }
-
-  Exit:
-    FT_FRAME_EXIT();
-  }
-
-
-  typedef struct  GX_GVar_Head_
-  {
-    FT_Long    version;
-    FT_UShort  axisCount;
-    FT_UShort  globalCoordCount;
-    FT_ULong   offsetToCoord;
-    FT_UShort  glyphCount;
-    FT_UShort  flags;
-    FT_ULong   offsetToData;
-
-  } GX_GVar_Head;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_var_load_gvar                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Parse the `gvar' table if present.  If `fvar' is there, `gvar' had */
-  /*    better be there too.                                               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face :: The font face.                                             */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  static FT_Error
-  ft_var_load_gvar( TT_Face  face )
-  {
-    FT_Stream     stream = FT_FACE_STREAM( face );
-    FT_Memory     memory = stream->memory;
-    GX_Blend      blend  = face->blend;
-    FT_Error      error;
-    FT_UInt       i, j;
-    FT_ULong      table_len;
-    FT_ULong      gvar_start;
-    FT_ULong      offsetToData;
-    GX_GVar_Head  gvar_head;
-
-    static const FT_Frame_Field  gvar_fields[] =
-    {
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  GX_GVar_Head
-
-      FT_FRAME_START( 20 ),
-        FT_FRAME_LONG  ( version ),
-        FT_FRAME_USHORT( axisCount ),
-        FT_FRAME_USHORT( globalCoordCount ),
-        FT_FRAME_ULONG ( offsetToCoord ),
-        FT_FRAME_USHORT( glyphCount ),
-        FT_FRAME_USHORT( flags ),
-        FT_FRAME_ULONG ( offsetToData ),
-      FT_FRAME_END
-    };
-
-
-    FT_TRACE2(( "GVAR " ));
-
-    if ( ( error = face->goto_table( face,
-                                     TTAG_gvar,
-                                     stream,
-                                     &table_len ) ) != 0 )
-    {
-      FT_TRACE2(( "is missing\n" ));
-      goto Exit;
-    }
-
-    gvar_start = FT_STREAM_POS( );
-    if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) )
-      goto Exit;
-
-    blend->tuplecount  = gvar_head.globalCoordCount;
-    blend->gv_glyphcnt = gvar_head.glyphCount;
-    offsetToData       = gvar_start + gvar_head.offsetToData;
-
-    if ( gvar_head.version != 0x00010000L )
-    {
-      FT_TRACE1(( "bad table version\n" ));
-      error = FT_THROW( Invalid_Table );
-      goto Exit;
-    }
-
-    FT_TRACE2(( "loaded\n" ));
-
-    if ( gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis )
-    {
-      FT_TRACE1(( "ft_var_load_gvar: number of axes in `gvar' and `cvar'\n"
-                  "                  table are different\n" ));
-      error = FT_THROW( Invalid_Table );
-      goto Exit;
-    }
-
-    FT_TRACE5(( "gvar: there are %d shared coordinates:\n",
-                blend->tuplecount ));
-
-    if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) )
-      goto Exit;
-
-    if ( gvar_head.flags & 1 )
-    {
-      /* long offsets (one more offset than glyphs, to mark size of last) */
-      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) )
-        goto Exit;
-
-      for ( i = 0; i <= blend->gv_glyphcnt; i++ )
-        blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG();
-
-      FT_FRAME_EXIT();
-    }
-    else
-    {
-      /* short offsets (one more offset than glyphs, to mark size of last) */
-      if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) )
-        goto Exit;
-
-      for ( i = 0; i <= blend->gv_glyphcnt; i++ )
-        blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2;
-                                               /* XXX: Undocumented: `*2'! */
-
-      FT_FRAME_EXIT();
-    }
-
-    if ( blend->tuplecount != 0 )
-    {
-      if ( FT_NEW_ARRAY( blend->tuplecoords,
-                         gvar_head.axisCount * blend->tuplecount ) )
-        goto Exit;
-
-      if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord )         ||
-           FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) )
-        goto Exit;
-
-      for ( i = 0; i < blend->tuplecount; i++ )
-      {
-        FT_TRACE5(( "  [ " ));
-        for ( j = 0 ; j < (FT_UInt)gvar_head.axisCount; j++ )
-        {
-          blend->tuplecoords[i * gvar_head.axisCount + j] =
-            FT_GET_SHORT() * 4;                 /* convert to FT_Fixed */
-          FT_TRACE5(( "%.4f ",
-            blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 ));
-        }
-        FT_TRACE5(( "]\n" ));
-      }
-
-      FT_TRACE5(( "\n" ));
-
-      FT_FRAME_EXIT();
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    ft_var_apply_tuple                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Figure out whether a given tuple (design) applies to the current   */
-  /*    blend, and if so, what is the scaling factor.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    blend           :: The current blend of the font.                  */
-  /*                                                                       */
-  /*    tupleIndex      :: A flag saying whether this is an intermediate   */
-  /*                       tuple or not.                                   */
-  /*                                                                       */
-  /*    tuple_coords    :: The coordinates of the tuple in normalized axis */
-  /*                       units.                                          */
-  /*                                                                       */
-  /*    im_start_coords :: The initial coordinates where this tuple starts */
-  /*                       to apply (for intermediate coordinates).        */
-  /*                                                                       */
-  /*    im_end_coords   :: The final coordinates after which this tuple no */
-  /*                       longer applies (for intermediate coordinates).  */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    An FT_Fixed value containing the scaling factor.                   */
-  /*                                                                       */
-  static FT_Fixed
-  ft_var_apply_tuple( GX_Blend   blend,
-                      FT_UShort  tupleIndex,
-                      FT_Fixed*  tuple_coords,
-                      FT_Fixed*  im_start_coords,
-                      FT_Fixed*  im_end_coords )
-  {
-    FT_UInt   i;
-    FT_Fixed  apply = 0x10000L;
-
-
-    for ( i = 0; i < blend->num_axis; i++ )
-    {
-      FT_TRACE6(( "    axis coordinate %d (%.4f):\n",
-                  i, blend->normalizedcoords[i] / 65536.0 ));
-
-      /* It's not clear why (for intermediate tuples) we don't need     */
-      /* to check against start/end -- the documentation says we don't. */
-      /* Similarly, it's unclear why we don't need to scale along the   */
-      /* axis.                                                          */
-
-      if ( tuple_coords[i] == 0 )
-      {
-        FT_TRACE6(( "      tuple coordinate is zero, ignored\n", i ));
-        continue;
-      }
-
-      else if ( blend->normalizedcoords[i] == 0 )
-      {
-        FT_TRACE6(( "      axis coordinate is zero, stop\n" ));
-        apply = 0;
-        break;
-      }
-
-      else if ( ( blend->normalizedcoords[i] < 0 && tuple_coords[i] > 0 ) ||
-                ( blend->normalizedcoords[i] > 0 && tuple_coords[i] < 0 ) )
-      {
-        FT_TRACE6(( "      tuple coordinate value %.4f is exceeded, stop\n",
-                    tuple_coords[i] / 65536.0 ));
-        apply = 0;
-        break;
-      }
-
-      else if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) )
-      {
-        FT_TRACE6(( "      tuple coordinate value %.4f fits\n",
-                    tuple_coords[i] / 65536.0 ));
-        /* not an intermediate tuple */
-        apply = FT_MulFix( apply,
-                           blend->normalizedcoords[i] > 0
-                             ? blend->normalizedcoords[i]
-                             : -blend->normalizedcoords[i] );
-      }
-
-      else if ( blend->normalizedcoords[i] < im_start_coords[i] ||
-                blend->normalizedcoords[i] > im_end_coords[i]   )
-      {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] is exceeded,"
-                    " stop\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
-        apply = 0;
-        break;
-      }
-
-      else if ( blend->normalizedcoords[i] < tuple_coords[i] )
-      {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] fits\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
-        apply = FT_MulDiv( apply,
-                           blend->normalizedcoords[i] - im_start_coords[i],
-                           tuple_coords[i] - im_start_coords[i] );
-      }
-
-      else
-      {
-        FT_TRACE6(( "      intermediate tuple range [%.4f;%.4f] fits\n",
-                    im_start_coords[i] / 65536.0,
-                    im_end_coords[i] / 65536.0 ));
-        apply = FT_MulDiv( apply,
-                           im_end_coords[i] - blend->normalizedcoords[i],
-                           im_end_coords[i] - tuple_coords[i] );
-      }
-    }
-
-    FT_TRACE6(( "    apply factor is %.4f\n", apply / 65536.0 ));
-
-    return apply;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****               MULTIPLE MASTERS SERVICE FUNCTIONS              *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  typedef struct  GX_FVar_Head_
-  {
-    FT_Long    version;
-    FT_UShort  offsetToData;
-    FT_UShort  countSizePairs;
-    FT_UShort  axisCount;
-    FT_UShort  axisSize;
-    FT_UShort  instanceCount;
-    FT_UShort  instanceSize;
-
-  } GX_FVar_Head;
-
-
-  typedef struct  fvar_axis_
-  {
-    FT_ULong   axisTag;
-    FT_Fixed   minValue;
-    FT_Fixed   defaultValue;
-    FT_Fixed   maxValue;
-    FT_UShort  flags;
-    FT_UShort  nameID;
-
-  } GX_FVar_Axis;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Get_MM_Var                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Check that the font's `fvar' table is valid, parse it, and return  */
-  /*    those data.                                                        */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: The font face.                                           */
-  /*              TT_Get_MM_Var initializes the blend structure.           */
-  /*                                                                       */
-  /* <Output>                                                              */
-  /*    master :: The `fvar' data (must be freed by caller).  Can be NULL, */
-  /*              which makes this function simply load MM support.        */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Get_MM_Var( TT_Face      face,
-                 FT_MM_Var*  *master )
-  {
-    FT_Stream            stream = face->root.stream;
-    FT_Memory            memory = face->root.memory;
-    FT_ULong             table_len;
-    FT_Error             error  = FT_Err_Ok;
-    FT_ULong             fvar_start;
-    FT_Int               i, j;
-    FT_MM_Var*           mmvar = NULL;
-    FT_Fixed*            next_coords;
-    FT_String*           next_name;
-    FT_Var_Axis*         a;
-    FT_Var_Named_Style*  ns;
-    GX_FVar_Head         fvar_head;
-
-    static const FT_Frame_Field  fvar_fields[] =
-    {
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  GX_FVar_Head
-
-      FT_FRAME_START( 16 ),
-        FT_FRAME_LONG  ( version ),
-        FT_FRAME_USHORT( offsetToData ),
-        FT_FRAME_USHORT( countSizePairs ),
-        FT_FRAME_USHORT( axisCount ),
-        FT_FRAME_USHORT( axisSize ),
-        FT_FRAME_USHORT( instanceCount ),
-        FT_FRAME_USHORT( instanceSize ),
-      FT_FRAME_END
-    };
-
-    static const FT_Frame_Field  fvaraxis_fields[] =
-    {
-
-#undef  FT_STRUCTURE
-#define FT_STRUCTURE  GX_FVar_Axis
-
-      FT_FRAME_START( 20 ),
-        FT_FRAME_ULONG ( axisTag ),
-        FT_FRAME_LONG  ( minValue ),
-        FT_FRAME_LONG  ( defaultValue ),
-        FT_FRAME_LONG  ( maxValue ),
-        FT_FRAME_USHORT( flags ),
-        FT_FRAME_USHORT( nameID ),
-      FT_FRAME_END
-    };
-
-
-    /* read the font data and set up the internal representation */
-    /* if not already done                                       */
-
-    if ( face->blend == NULL )
-    {
-      FT_TRACE2(( "FVAR " ));
-
-      /* both `fvar' and `gvar' must be present */
-      if ( ( error = face->goto_table( face, TTAG_gvar,
-                                       stream, &table_len ) ) != 0 )
-      {
-        FT_TRACE1(( "\n"
-                    "TT_Get_MM_Var: `gvar' table is missing\n" ));
-        goto Exit;
-      }
-
-      if ( ( error = face->goto_table( face, TTAG_fvar,
-                                       stream, &table_len ) ) != 0 )
-      {
-        FT_TRACE1(( "is missing\n" ));
-        goto Exit;
-      }
-
-      fvar_start = FT_STREAM_POS( );
-
-      if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) )
-        goto Exit;
-
-      if ( fvar_head.version != (FT_Long)0x00010000L                      ||
-#if 0
-           /* fonts like `JamRegular.ttf' have an incorrect value for */
-           /* `countSizePairs'; since value 2 is hard-coded in `fvar' */
-           /* version 1.0, we simply ignore it                        */
-           fvar_head.countSizePairs != 2                                  ||
-#endif
-           fvar_head.axisSize != 20                                       ||
-           /* axisCount limit implied by 16-bit instanceSize */
-           fvar_head.axisCount > 0x3FFE                                   ||
-           fvar_head.instanceSize != 4 + 4 * fvar_head.axisCount          ||
-           /* instanceCount limit implied by limited range of name IDs */
-           fvar_head.instanceCount > 0x7EFF                               ||
-           fvar_head.offsetToData + fvar_head.axisCount * 20U +
-             fvar_head.instanceCount * fvar_head.instanceSize > table_len )
-      {
-        FT_TRACE1(( "\n"
-                    "TT_Get_MM_Var: invalid `fvar' header\n" ));
-        error = FT_THROW( Invalid_Table );
-        goto Exit;
-      }
-
-      FT_TRACE2(( "loaded\n" ));
-
-      FT_TRACE5(( "number of GX style axes: %d\n", fvar_head.axisCount ));
-
-      if ( FT_NEW( face->blend ) )
-        goto Exit;
-
-      /* cannot overflow 32-bit arithmetic because of limits above */
-      face->blend->mmvar_len =
-        sizeof ( FT_MM_Var ) +
-        fvar_head.axisCount * sizeof ( FT_Var_Axis ) +
-        fvar_head.instanceCount * sizeof ( FT_Var_Named_Style ) +
-        fvar_head.instanceCount * fvar_head.axisCount * sizeof ( FT_Fixed ) +
-        5 * fvar_head.axisCount;
-
-      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
-        goto Exit;
-      face->blend->mmvar = mmvar;
-
-      /* set up pointers and offsets into the `mmvar' array; */
-      /* the data gets filled in later on                    */
-
-      mmvar->num_axis =
-        fvar_head.axisCount;
-      mmvar->num_designs =
-        ~0U;                   /* meaningless in this context; each glyph */
-                               /* may have a different number of designs  */
-                               /* (or tuples, as called by Apple)         */
-      mmvar->num_namedstyles =
-        fvar_head.instanceCount;
-      mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
-      mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[fvar_head.axisCount] );
-
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[fvar_head.instanceCount] );
-      for ( i = 0; i < fvar_head.instanceCount; i++ )
-      {
-        mmvar->namedstyle[i].coords  = next_coords;
-        next_coords                 += fvar_head.axisCount;
-      }
-
-      next_name = (FT_String*)next_coords;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
-      {
-        mmvar->axis[i].name  = next_name;
-        next_name           += 5;
-      }
-
-      /* now fill in the data */
-
-      if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) )
-        goto Exit;
-
-      a = mmvar->axis;
-      for ( i = 0; i < fvar_head.axisCount; i++ )
-      {
-        GX_FVar_Axis  axis_rec;
-
-
-        if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) )
-          goto Exit;
-        a->tag     = axis_rec.axisTag;
-        a->minimum = axis_rec.minValue;
-        a->def     = axis_rec.defaultValue;
-        a->maximum = axis_rec.maxValue;
-        a->strid   = axis_rec.nameID;
-
-        a->name[0] = (FT_String)(   a->tag >> 24 );
-        a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF );
-        a->name[2] = (FT_String)( ( a->tag >>  8 ) & 0xFF );
-        a->name[3] = (FT_String)( ( a->tag       ) & 0xFF );
-        a->name[4] = '\0';
-
-        FT_TRACE5(( "  \"%s\": minimum=%.4f, default=%.4f, maximum=%.4f\n",
-                    a->name,
-                    a->minimum / 65536.0,
-                    a->def / 65536.0,
-                    a->maximum / 65536.0 ));
-
-        a++;
-      }
-
-      FT_TRACE5(( "\n" ));
-
-      ns = mmvar->namedstyle;
-      for ( i = 0; i < fvar_head.instanceCount; i++, ns++ )
-      {
-        if ( FT_FRAME_ENTER( 4L + 4L * fvar_head.axisCount ) )
-          goto Exit;
-
-        ns->strid       =    FT_GET_USHORT();
-        (void) /* flags = */ FT_GET_USHORT();
-
-        for ( j = 0; j < fvar_head.axisCount; j++ )
-          ns->coords[j] = FT_GET_LONG();
-
-        FT_FRAME_EXIT();
-      }
-    }
-
-    /* fill the output array if requested */
-
-    if ( master != NULL )
-    {
-      FT_UInt  n;
-
-
-      if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) )
-        goto Exit;
-      FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len );
-
-      mmvar->axis =
-        (FT_Var_Axis*)&( mmvar[1] );
-      mmvar->namedstyle =
-        (FT_Var_Named_Style*)&( mmvar->axis[mmvar->num_axis] );
-      next_coords =
-        (FT_Fixed*)&( mmvar->namedstyle[mmvar->num_namedstyles] );
-
-      for ( n = 0; n < mmvar->num_namedstyles; n++ )
-      {
-        mmvar->namedstyle[n].coords  = next_coords;
-        next_coords                 += mmvar->num_axis;
-      }
-
-      a         = mmvar->axis;
-      next_name = (FT_String*)next_coords;
-      for ( n = 0; n < mmvar->num_axis; n++ )
-      {
-        a->name = next_name;
-
-        /* standard PostScript names for some standard apple tags */
-        if ( a->tag == TTAG_wght )
-          a->name = (char*)"Weight";
-        else if ( a->tag == TTAG_wdth )
-          a->name = (char*)"Width";
-        else if ( a->tag == TTAG_opsz )
-          a->name = (char*)"OpticalSize";
-        else if ( a->tag == TTAG_slnt )
-          a->name = (char*)"Slant";
-
-        next_name += 5;
-        a++;
-      }
-
-      *master = mmvar;
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Set_MM_Blend                                                    */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Set the blend (normalized) coordinates for this instance of the    */
-  /*    font.  Check that the `gvar' table is reasonable and does some     */
-  /*    initial preparation.                                               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The font.                                            */
-  /*                  Initialize the blend structure with `gvar' data.     */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    num_coords :: The number of available coordinates.  If it is       */
-  /*                  larger than the number of axes, ignore the excess    */
-  /*                  values.  If it is smaller than the number of axes,   */
-  /*                  use the default value (0) for the remaining axes.    */
-  /*                                                                       */
-  /*    coords     :: An array of `num_coords', each between [-1,1].       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Set_MM_Blend( TT_Face    face,
-                   FT_UInt    num_coords,
-                   FT_Fixed*  coords )
-  {
-    FT_Error    error = FT_Err_Ok;
-    GX_Blend    blend;
-    FT_MM_Var*  mmvar;
-    FT_UInt     i;
-    FT_Memory   memory = face->root.memory;
-
-    enum
-    {
-      mcvt_retain,
-      mcvt_modify,
-      mcvt_load
-
-    } manageCvt;
-
-
-    face->doblend = FALSE;
-
-    if ( face->blend == NULL )
-    {
-      if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 )
-        goto Exit;
-    }
-
-    blend = face->blend;
-    mmvar = blend->mmvar;
-
-    if ( num_coords > mmvar->num_axis )
-    {
-      FT_TRACE2(( "TT_Set_MM_Blend: only using first %d of %d coordinates\n",
-                  mmvar->num_axis, num_coords ));
-      num_coords = mmvar->num_axis;
-    }
-
-    FT_TRACE5(( "normalized design coordinates:\n" ));
-
-    for ( i = 0; i < num_coords; i++ )
-    {
-      FT_TRACE5(( "  %.4f\n", coords[i] / 65536.0 ));
-      if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L )
-      {
-        FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.4f\n"
-                    "                 is out of range [-1;1]\n",
-                    coords[i] / 65536.0 ));
-        error = FT_THROW( Invalid_Argument );
-        goto Exit;
-      }
-    }
-
-    FT_TRACE5(( "\n" ));
-
-    if ( blend->glyphoffsets == NULL )
-      if ( ( error = ft_var_load_gvar( face ) ) != 0 )
-        goto Exit;
-
-    if ( blend->normalizedcoords == NULL )
-    {
-      if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) )
-        goto Exit;
-
-      manageCvt = mcvt_modify;
-
-      /* If we have not set the blend coordinates before this, then the  */
-      /* cvt table will still be what we read from the `cvt ' table and  */
-      /* we don't need to reload it.  We may need to change it though... */
-    }
-    else
-    {
-      manageCvt = mcvt_retain;
-
-      for ( i = 0; i < num_coords; i++ )
-      {
-        if ( blend->normalizedcoords[i] != coords[i] )
-        {
-          manageCvt = mcvt_load;
-          break;
-        }
-      }
-
-      for ( ; i < mmvar->num_axis; i++ )
-      {
-        if ( blend->normalizedcoords[i] != 0 )
-        {
-          manageCvt = mcvt_load;
-          break;
-        }
-      }
-
-      /* If we don't change the blend coords then we don't need to do  */
-      /* anything to the cvt table.  It will be correct.  Otherwise we */
-      /* no longer have the original cvt (it was modified when we set  */
-      /* the blend last time), so we must reload and then modify it.   */
-    }
-
-    blend->num_axis = mmvar->num_axis;
-    FT_MEM_COPY( blend->normalizedcoords,
-                 coords,
-                 num_coords * sizeof ( FT_Fixed ) );
-
-    face->doblend = TRUE;
-
-    if ( face->cvt != NULL )
-    {
-      switch ( manageCvt )
-      {
-      case mcvt_load:
-        /* The cvt table has been loaded already; every time we change the */
-        /* blend we may need to reload and remodify the cvt table.         */
-        FT_FREE( face->cvt );
-        face->cvt = NULL;
-
-        error = tt_face_load_cvt( face, face->root.stream );
-        break;
-
-      case mcvt_modify:
-        /* The original cvt table is in memory.  All we need to do is */
-        /* apply the `cvar' table (if any).                           */
-        error = tt_face_vary_cvt( face, face->root.stream );
-        break;
-
-      case mcvt_retain:
-        /* The cvt table is correct for this set of coordinates. */
-        break;
-      }
-    }
-
-  Exit:
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Set_Var_Design                                                  */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Set the coordinates for the instance, measured in the user         */
-  /*    coordinate system.  Parse the `avar' table (if present) to convert */
-  /*    from user to normalized coordinates.                               */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face       :: The font face.                                       */
-  /*                  Initialize the blend struct with `gvar' data.        */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    num_coords :: The number of available coordinates.  If it is       */
-  /*                  larger than the number of axes, ignore the excess    */
-  /*                  values.  If it is smaller than the number of axes,   */
-  /*                  use the default values for the remaining axes.       */
-  /*                                                                       */
-  /*    coords     :: A coordinate array with `num_coords' elements.       */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Set_Var_Design( TT_Face    face,
-                     FT_UInt    num_coords,
-                     FT_Fixed*  coords )
-  {
-    FT_Error        error      = FT_Err_Ok;
-    FT_Fixed*       normalized = NULL;
-    GX_Blend        blend;
-    FT_MM_Var*      mmvar;
-    FT_UInt         i, j;
-    FT_Var_Axis*    a;
-    GX_AVarSegment  av;
-    FT_Memory       memory = face->root.memory;
-
-
-    if ( face->blend == NULL )
-    {
-      if ( ( error = TT_Get_MM_Var( face, NULL ) ) != 0 )
-        goto Exit;
-    }
-
-    blend = face->blend;
-    mmvar = blend->mmvar;
-
-    if ( num_coords > mmvar->num_axis )
-    {
-      FT_TRACE2(( "TT_Set_Var_Design:"
-                  " only using first %d of %d coordinates\n",
-                  mmvar->num_axis, num_coords ));
-      num_coords = mmvar->num_axis;
-    }
-
-    /* Axis normalization is a two stage process.  First we normalize */
-    /* based on the [min,def,max] values for the axis to be [-1,0,1]. */
-    /* Then, if there's an `avar' table, we renormalize this range.   */
-
-    if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) )
-      goto Exit;
-
-    FT_TRACE5(( "design coordinates:\n" ));
-
-    a = mmvar->axis;
-    for ( i = 0; i < num_coords; i++, a++ )
-    {
-      FT_TRACE5(( "  %.4f\n", coords[i] / 65536.0 ));
-      if ( coords[i] > a->maximum || coords[i] < a->minimum )
-      {
-        FT_TRACE1(( "TT_Set_Var_Design: normalized design coordinate %.4f\n"
-                    "                   is out of range [%.4f;%.4f]\n",
-                    coords[i] / 65536.0,
-                    a->minimum / 65536.0,
-                    a->maximum / 65536.0 ));
-        error = FT_THROW( Invalid_Argument );
-        goto Exit;
-      }
-
-      if ( coords[i] < a->def )
-        normalized[i] = -FT_DivFix( coords[i] - a->def,
-                                    a->minimum - a->def );
-      else if ( a->maximum == a->def )
-        normalized[i] = 0;
-      else
-        normalized[i] = FT_DivFix( coords[i] - a->def,
-                                   a->maximum - a->def );
-    }
-
-    FT_TRACE5(( "\n" ));
-
-    for ( ; i < mmvar->num_axis; i++ )
-      normalized[i] = 0;
-
-    if ( !blend->avar_checked )
-      ft_var_load_avar( face );
-
-    if ( blend->avar_segment != NULL )
-    {
-      FT_TRACE5(( "normalized design coordinates"
-                  " before applying `avar' data:\n" ));
-
-      av = blend->avar_segment;
-      for ( i = 0; i < mmvar->num_axis; i++, av++ )
-      {
-        for ( j = 1; j < (FT_UInt)av->pairCount; j++ )
-        {
-          FT_TRACE5(( "  %.4f\n", normalized[i] / 65536.0 ));
-          if ( normalized[i] < av->correspondence[j].fromCoord )
-          {
-            normalized[i] =
-              FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord,
-                         av->correspondence[j].toCoord -
-                           av->correspondence[j - 1].toCoord,
-                         av->correspondence[j].fromCoord -
-                           av->correspondence[j - 1].fromCoord ) +
-              av->correspondence[j - 1].toCoord;
-            break;
-          }
-        }
-      }
-    }
-
-    error = TT_Set_MM_Blend( face, mmvar->num_axis, normalized );
-
-  Exit:
-    FT_FREE( normalized );
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*************************************************************************/
-  /*****                                                               *****/
-  /*****                     GX VAR PARSING ROUTINES                   *****/
-  /*****                                                               *****/
-  /*************************************************************************/
-  /*************************************************************************/
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_face_vary_cvt                                                   */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Modify the loaded cvt table according to the `cvar' table and the  */
-  /*    font's blend.                                                      */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    face   :: A handle to the target face object.                      */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    stream :: A handle to the input stream.                            */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  /*    Most errors are ignored.  It is perfectly valid not to have a      */
-  /*    `cvar' table even if there is a `gvar' and `fvar' table.           */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  tt_face_vary_cvt( TT_Face    face,
-                    FT_Stream  stream )
-  {
-    FT_Error    error;
-    FT_Memory   memory = stream->memory;
-    FT_ULong    table_start;
-    FT_ULong    table_len;
-    FT_UInt     tupleCount;
-    FT_ULong    offsetToData;
-    FT_ULong    here;
-    FT_UInt     i, j;
-    FT_Fixed*   tuple_coords    = NULL;
-    FT_Fixed*   im_start_coords = NULL;
-    FT_Fixed*   im_end_coords   = NULL;
-    GX_Blend    blend           = face->blend;
-    FT_UInt     point_count;
-    FT_UShort*  localpoints;
-    FT_Short*   deltas;
-
-
-    FT_TRACE2(( "CVAR " ));
-
-    if ( blend == NULL )
-    {
-      FT_TRACE2(( "\n"
-                  "tt_face_vary_cvt: no blend specified\n" ));
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-
-    if ( face->cvt == NULL )
-    {
-      FT_TRACE2(( "\n"
-                  "tt_face_vary_cvt: no `cvt ' table\n" ));
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-
-    error = face->goto_table( face, TTAG_cvar, stream, &table_len );
-    if ( error )
-    {
-      FT_TRACE2(( "is missing\n" ));
-
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-
-    if ( FT_FRAME_ENTER( table_len ) )
-    {
-      error = FT_Err_Ok;
-      goto Exit;
-    }
-
-    table_start = FT_Stream_FTell( stream );
-    if ( FT_GET_LONG() != 0x00010000L )
-    {
-      FT_TRACE2(( "bad table version\n" ));
-
-      error = FT_Err_Ok;
-      goto FExit;
-    }
-
-    FT_TRACE2(( "loaded\n" ));
-
-    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
-         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
-         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
-      goto FExit;
-
-    tupleCount   = FT_GET_USHORT();
-    offsetToData = table_start + FT_GET_USHORT();
-
-    /* The documentation implies there are flags packed into the        */
-    /* tuplecount, but John Jenkins says that shared points don't apply */
-    /* to `cvar', and no other flags are defined.                       */
-
-    FT_TRACE5(( "cvar: there are %d tuples:\n", tupleCount ));
-
-    for ( i = 0; i < ( tupleCount & 0xFFF ); i++ )
-    {
-      FT_UInt   tupleDataSize;
-      FT_UInt   tupleIndex;
-      FT_Fixed  apply;
-
-
-      FT_TRACE6(( "  tuple %d:\n", i ));
-
-      tupleDataSize = FT_GET_USHORT();
-      tupleIndex    = FT_GET_USHORT();
-
-      /* There is no provision here for a global tuple coordinate section, */
-      /* so John says.  There are no tuple indices, just embedded tuples.  */
-
-      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
-      {
-        for ( j = 0; j < blend->num_axis; j++ )
-          tuple_coords[j] = FT_GET_SHORT() * 4;  /* convert from        */
-                                                 /* short frac to fixed */
-      }
-      else
-      {
-        /* skip this tuple; it makes no sense */
-
-        if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
-          for ( j = 0; j < 2 * blend->num_axis; j++ )
-            (void)FT_GET_SHORT();
-
-        offsetToData += tupleDataSize;
-        continue;
-      }
-
-      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
-      {
-        for ( j = 0; j < blend->num_axis; j++ )
-          im_start_coords[j] = FT_GET_SHORT() * 4;
-        for ( j = 0; j < blend->num_axis; j++ )
-          im_end_coords[j] = FT_GET_SHORT() * 4;
-      }
-
-      apply = ft_var_apply_tuple( blend,
-                                  (FT_UShort)tupleIndex,
-                                  tuple_coords,
-                                  im_start_coords,
-                                  im_end_coords );
-      if ( /* tuple isn't active for our blend */
-           apply == 0                                    ||
-           /* global points not allowed,           */
-           /* if they aren't local, makes no sense */
-           !( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) )
-      {
-        offsetToData += tupleDataSize;
-        continue;
-      }
-
-      here = FT_Stream_FTell( stream );
-
-      FT_Stream_SeekSet( stream, offsetToData );
-
-      localpoints = ft_var_readpackedpoints( stream, &point_count );
-      deltas      = ft_var_readpackeddeltas( stream,
-                                             point_count == 0 ? face->cvt_size
-                                                              : point_count );
-      if ( localpoints == NULL || deltas == NULL )
-        ; /* failure, ignore it */
-
-      else if ( localpoints == ALL_POINTS )
-      {
-#ifdef FT_DEBUG_LEVEL_TRACE
-        int  count = 0;
-#endif
-
-
-        FT_TRACE7(( "    CVT deltas:\n" ));
-
-        /* this means that there are deltas for every entry in cvt */
-        for ( j = 0; j < face->cvt_size; j++ )
-        {
-          FT_Long  orig_cvt = face->cvt[j];
-
-
-          face->cvt[j] = (FT_Short)( orig_cvt +
-                                     FT_MulFix( deltas[j], apply ) );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-          if ( orig_cvt != face->cvt[j] )
-          {
-            FT_TRACE7(( "      %d: %d -> %d\n",
-                        j, orig_cvt, face->cvt[j] ));
-            count++;
-          }
-#endif
-        }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( !count )
-          FT_TRACE7(( "      none\n" ));
-#endif
-      }
-
-      else
-      {
-#ifdef FT_DEBUG_LEVEL_TRACE
-        int  count = 0;
-#endif
-
-
-        FT_TRACE7(( "    CVT deltas:\n" ));
-
-        for ( j = 0; j < point_count; j++ )
-        {
-          int      pindex   = localpoints[j];
-          FT_Long  orig_cvt = face->cvt[pindex];
-
-
-          face->cvt[pindex] = (FT_Short)( orig_cvt +
-                                          FT_MulFix( deltas[j], apply ) );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-          if ( orig_cvt != face->cvt[pindex] )
-          {
-            FT_TRACE7(( "      %d: %d -> %d\n",
-                        pindex, orig_cvt, face->cvt[pindex] ));
-            count++;
-          }
-#endif
-        }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( !count )
-          FT_TRACE7(( "      none\n" ));
-#endif
-      }
-
-      if ( localpoints != ALL_POINTS )
-        FT_FREE( localpoints );
-      FT_FREE( deltas );
-
-      offsetToData += tupleDataSize;
-
-      FT_Stream_SeekSet( stream, here );
-    }
-
-    FT_TRACE5(( "\n" ));
-
-  FExit:
-    FT_FRAME_EXIT();
-
-  Exit:
-    FT_FREE( tuple_coords );
-    FT_FREE( im_start_coords );
-    FT_FREE( im_end_coords );
-
-    return error;
-  }
-
-
-  /* Shift the original coordinates of all points between indices `p1' */
-  /* and `p2', using the same difference as given by index `ref'.      */
-
-  /* modeled after `af_iup_shift' */
-
-  static void
-  tt_delta_shift( int         p1,
-                  int         p2,
-                  int         ref,
-                  FT_Vector*  in_points,
-                  FT_Vector*  out_points )
-  {
-    int        p;
-    FT_Vector  delta;
-
-
-    delta.x = out_points[ref].x - in_points[ref].x;
-    delta.y = out_points[ref].y - in_points[ref].y;
-
-    if ( delta.x == 0 && delta.y == 0 )
-      return;
-
-    for ( p = p1; p < ref; p++ )
-    {
-      out_points[p].x += delta.x;
-      out_points[p].y += delta.y;
-    }
-
-    for ( p = ref + 1; p <= p2; p++ )
-    {
-      out_points[p].x += delta.x;
-      out_points[p].y += delta.y;
-    }
-  }
-
-
-  /* Interpolate the original coordinates of all points with indices */
-  /* between `p1' and `p2', using `ref1' and `ref2' as the reference */
-  /* point indices.                                                  */
-
-  /* modeled after `af_iup_interp', `_iup_worker_interpolate', and */
-  /* `Ins_IUP'                                                     */
-
-  static void
-  tt_delta_interpolate( int         p1,
-                        int         p2,
-                        int         ref1,
-                        int         ref2,
-                        FT_Vector*  in_points,
-                        FT_Vector*  out_points )
-  {
-    int  p, i;
-
-    FT_Pos  out, in1, in2, out1, out2, d1, d2;
-
-
-    if ( p1 > p2 )
-      return;
-
-    /* handle both horizontal and vertical coordinates */
-    for ( i = 0; i <= 1; i++ )
-    {
-      /* shift array pointers so that we can access `foo.y' as `foo.x' */
-      in_points  = (FT_Vector*)( (FT_Pos*)in_points + i );
-      out_points = (FT_Vector*)( (FT_Pos*)out_points + i );
-
-      if ( in_points[ref1].x > in_points[ref2].x )
-      {
-        p    = ref1;
-        ref1 = ref2;
-        ref2 = p;
-      }
-
-      in1  = in_points[ref1].x;
-      in2  = in_points[ref2].x;
-      out1 = out_points[ref1].x;
-      out2 = out_points[ref2].x;
-      d1   = out1 - in1;
-      d2   = out2 - in2;
-
-      if ( out1 == out2 || in1 == in2 )
-      {
-        for ( p = p1; p <= p2; p++ )
-        {
-          out = in_points[p].x;
-
-          if ( out <= in1 )
-            out += d1;
-          else if ( out >= in2 )
-            out += d2;
-          else
-            out = out1;
-
-          out_points[p].x = out;
-        }
-      }
-      else
-      {
-        FT_Fixed  scale = FT_DivFix( out2 - out1, in2 - in1 );
-
-
-        for ( p = p1; p <= p2; p++ )
-        {
-          out = in_points[p].x;
-
-          if ( out <= in1 )
-            out += d1;
-          else if ( out >= in2 )
-            out += d2;
-          else
-            out = out1 + FT_MulFix( out - in1, scale );
-
-          out_points[p].x = out;
-        }
-      }
-    }
-  }
-
-
-  /* Interpolate points without delta values, similar to */
-  /* the `IUP' hinting instruction.                      */
-
-  /* modeled after `Ins_IUP */
-
-  static void
-  tt_handle_deltas( FT_Outline*  outline,
-                    FT_Vector*   in_points,
-                    FT_Bool*     has_delta )
-  {
-    FT_Vector*  out_points;
-
-    FT_Int  first_point;
-    FT_Int  end_point;
-
-    FT_Int  first_delta;
-    FT_Int  cur_delta;
-
-    FT_Int    point;
-    FT_Short  contour;
-
-
-    /* ignore empty outlines */
-    if ( !outline->n_contours )
-      return;
-
-    out_points = outline->points;
-
-    contour = 0;
-    point   = 0;
-
-    do
-    {
-      end_point   = outline->contours[contour];
-      first_point = point;
-
-      /* search first point that has a delta */
-      while ( point <= end_point && !has_delta[point] )
-        point++;
-
-      if ( point <= end_point )
-      {
-        first_delta = point;
-        cur_delta   = point;
-
-        point++;
-
-        while ( point <= end_point )
-        {
-          /* search next point that has a delta  */
-          /* and interpolate intermediate points */
-          if ( has_delta[point] )
-          {
-            tt_delta_interpolate( cur_delta + 1,
-                                  point - 1,
-                                  cur_delta,
-                                  point,
-                                  in_points,
-                                  out_points );
-            cur_delta = point;
-          }
-
-          point++;
-        }
-
-        /* shift contour if we only have a single delta */
-        if ( cur_delta == first_delta )
-          tt_delta_shift( first_point,
-                          end_point,
-                          cur_delta,
-                          in_points,
-                          out_points );
-        else
-        {
-          /* otherwise handle remaining points       */
-          /* at the end and beginning of the contour */
-          tt_delta_interpolate( cur_delta + 1,
-                                end_point,
-                                cur_delta,
-                                first_delta,
-                                in_points,
-                                out_points );
-
-          if ( first_delta > 0 )
-            tt_delta_interpolate( first_point,
-                                  first_delta - 1,
-                                  cur_delta,
-                                  first_delta,
-                                  in_points,
-                                  out_points );
-        }
-      }
-      contour++;
-
-    } while ( contour < outline->n_contours );
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    TT_Vary_Apply_Glyph_Deltas                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Apply the appropriate deltas to the current glyph.                 */
-  /*                                                                       */
-  /* <Input>                                                               */
-  /*    face        :: A handle to the target face object.                 */
-  /*                                                                       */
-  /*    glyph_index :: The index of the glyph being modified.              */
-  /*                                                                       */
-  /*    n_points    :: The number of the points in the glyph, including    */
-  /*                   phantom points.                                     */
-  /*                                                                       */
-  /* <InOut>                                                               */
-  /*    outline     :: The outline to change.                              */
-  /*                                                                       */
-  /* <Return>                                                              */
-  /*    FreeType error code.  0 means success.                             */
-  /*                                                                       */
-  FT_LOCAL_DEF( FT_Error )
-  TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
-                              FT_UInt      glyph_index,
-                              FT_Outline*  outline,
-                              FT_UInt      n_points )
-  {
-    FT_Stream   stream = face->root.stream;
-    FT_Memory   memory = stream->memory;
-    GX_Blend    blend  = face->blend;
-
-    FT_Vector*  points_org = NULL;
-    FT_Bool*    has_delta  = NULL;
-
-    FT_Error    error;
-    FT_ULong    glyph_start;
-    FT_UInt     tupleCount;
-    FT_ULong    offsetToData;
-    FT_ULong    here;
-    FT_UInt     i, j;
-    FT_Fixed*   tuple_coords    = NULL;
-    FT_Fixed*   im_start_coords = NULL;
-    FT_Fixed*   im_end_coords   = NULL;
-    FT_UInt     point_count, spoint_count = 0;
-    FT_UShort*  sharedpoints = NULL;
-    FT_UShort*  localpoints  = NULL;
-    FT_UShort*  points;
-    FT_Short    *deltas_x, *deltas_y;
-
-
-    if ( !face->doblend || blend == NULL )
-      return FT_THROW( Invalid_Argument );
-
-    if ( glyph_index >= blend->gv_glyphcnt      ||
-         blend->glyphoffsets[glyph_index] ==
-           blend->glyphoffsets[glyph_index + 1] )
-    {
-      FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:"
-                  " no variation data for this glyph\n" ));
-      return FT_Err_Ok;
-    }
-
-    if ( FT_NEW_ARRAY( points_org, n_points ) ||
-         FT_NEW_ARRAY( has_delta, n_points )  )
-      goto Fail1;
-
-    if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] )   ||
-         FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] -
-                           blend->glyphoffsets[glyph_index] ) )
-      goto Fail1;
-
-    glyph_start = FT_Stream_FTell( stream );
-
-    /* each set of glyph variation data is formatted similarly to `cvar' */
-    /* (except we get shared points and global tuples)                   */
-
-    if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis )    ||
-         FT_NEW_ARRAY( im_start_coords, blend->num_axis ) ||
-         FT_NEW_ARRAY( im_end_coords, blend->num_axis )   )
-      goto Fail2;
-
-    tupleCount   = FT_GET_USHORT();
-    offsetToData = glyph_start + FT_GET_USHORT();
-
-    if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS )
-    {
-      here = FT_Stream_FTell( stream );
-
-      FT_Stream_SeekSet( stream, offsetToData );
-
-      sharedpoints = ft_var_readpackedpoints( stream, &spoint_count );
-      offsetToData = FT_Stream_FTell( stream );
-
-      FT_Stream_SeekSet( stream, here );
-    }
-
-    FT_TRACE5(( "gvar: there are %d tuples:\n", tupleCount ));
-
-    for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ )
-    {
-      FT_UInt   tupleDataSize;
-      FT_UInt   tupleIndex;
-      FT_Fixed  apply;
-
-
-      FT_TRACE6(( "  tuple %d:\n", i ));
-
-      tupleDataSize = FT_GET_USHORT();
-      tupleIndex    = FT_GET_USHORT();
-
-      if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD )
-      {
-        for ( j = 0; j < blend->num_axis; j++ )
-          tuple_coords[j] = FT_GET_SHORT() * 4;   /* convert from        */
-                                                  /* short frac to fixed */
-      }
-      else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount )
-      {
-        error = FT_THROW( Invalid_Table );
-        goto Fail2;
-      }
-      else
-        FT_MEM_COPY(
-          tuple_coords,
-          &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis],
-          blend->num_axis * sizeof ( FT_Fixed ) );
-
-      if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE )
-      {
-        for ( j = 0; j < blend->num_axis; j++ )
-          im_start_coords[j] = FT_GET_SHORT() * 4;
-        for ( j = 0; j < blend->num_axis; j++ )
-          im_end_coords[j] = FT_GET_SHORT() * 4;
-      }
-
-      apply = ft_var_apply_tuple( blend,
-                                  (FT_UShort)tupleIndex,
-                                  tuple_coords,
-                                  im_start_coords,
-                                  im_end_coords );
-
-      if ( apply == 0 )              /* tuple isn't active for our blend */
-      {
-        offsetToData += tupleDataSize;
-        continue;
-      }
-
-      here = FT_Stream_FTell( stream );
-
-      if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS )
-      {
-        FT_Stream_SeekSet( stream, offsetToData );
-
-        localpoints = ft_var_readpackedpoints( stream, &point_count );
-        points      = localpoints;
-      }
-      else
-      {
-        points      = sharedpoints;
-        point_count = spoint_count;
-      }
-
-      deltas_x = ft_var_readpackeddeltas( stream,
-                                          point_count == 0 ? n_points
-                                                           : point_count );
-      deltas_y = ft_var_readpackeddeltas( stream,
-                                          point_count == 0 ? n_points
-                                                           : point_count );
-
-      if ( points == NULL || deltas_y == NULL || deltas_x == NULL )
-        ; /* failure, ignore it */
-
-      else if ( points == ALL_POINTS )
-      {
-#ifdef FT_DEBUG_LEVEL_TRACE
-        int  count = 0;
-#endif
-
-
-        FT_TRACE7(( "    point deltas:\n" ));
-
-        /* this means that there are deltas for every point in the glyph */
-        for ( j = 0; j < n_points; j++ )
-        {
-#ifdef FT_DEBUG_LEVEL_TRACE
-          FT_Vector  point_org = outline->points[j];
-#endif
-
-
-          outline->points[j].x += FT_MulFix( deltas_x[j], apply );
-          outline->points[j].y += FT_MulFix( deltas_y[j], apply );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-          if ( ( point_org.x != outline->points[j].x ) ||
-               ( point_org.y != outline->points[j].y ) )
-          {
-            FT_TRACE7(( "      %d: (%d, %d) -> (%d, %d)\n",
-                        j,
-                        point_org.x,
-                        point_org.y,
-                        outline->points[j].x,
-                        outline->points[j].y ));
-            count++;
-          }
-#endif
-        }
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        if ( !count )
-          FT_TRACE7(( "      none\n" ));
-#endif
-      }
-
-      else
-      {
-#ifdef FT_DEBUG_LEVEL_TRACE
-        int  count = 0;
-#endif
-
-
-        /* we have to interpolate the missing deltas similar to the */
-        /* IUP bytecode instruction                                 */
-        for ( j = 0; j < n_points; j++ )
-        {
-          points_org[j] = outline->points[j];
-          has_delta[j]  = FALSE;
-        }
-
-        for ( j = 0; j < point_count; j++ )
-        {
-          FT_UShort  idx = localpoints[j];
-
-
-          if ( idx >= n_points )
-            continue;
-
-          has_delta[idx] = TRUE;
-
-          outline->points[idx].x += FT_MulFix( deltas_x[j], apply );
-          outline->points[idx].y += FT_MulFix( deltas_y[j], apply );
-        }
-
-        /* no need to handle phantom points here,      */
-        /* since solitary points can't be interpolated */
-        tt_handle_deltas( outline,
-                          points_org,
-                          has_delta );
-
-#ifdef FT_DEBUG_LEVEL_TRACE
-        FT_TRACE7(( "    point deltas:\n" ));
-
-        for ( j = 0; j < n_points; j++)
-        {
-          if ( ( points_org[j].x != outline->points[j].x ) ||
-               ( points_org[j].y != outline->points[j].y ) )
-          {
-            FT_TRACE7(( "      %d: (%d, %d) -> (%d, %d)\n",
-                        j,
-                        points_org[j].x,
-                        points_org[j].y,
-                        outline->points[j].x,
-                        outline->points[j].y ));
-            count++;
-          }
-        }
-
-        if ( !count )
-          FT_TRACE7(( "      none\n" ));
-#endif
-      }
-
-      if ( localpoints != ALL_POINTS )
-        FT_FREE( localpoints );
-      FT_FREE( deltas_x );
-      FT_FREE( deltas_y );
-
-      offsetToData += tupleDataSize;
-
-      FT_Stream_SeekSet( stream, here );
-    }
-
-    FT_TRACE5(( "\n" ));
-
-  Fail2:
-    FT_FREE( tuple_coords );
-    FT_FREE( im_start_coords );
-    FT_FREE( im_end_coords );
-
-    FT_FRAME_EXIT();
-
-  Fail1:
-    FT_FREE( points_org );
-    FT_FREE( has_delta );
-
-    return error;
-  }
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Function>                                                            */
-  /*    tt_done_blend                                                      */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Free the blend internal data structure.                            */
-  /*                                                                       */
-  FT_LOCAL_DEF( void )
-  tt_done_blend( FT_Memory  memory,
-                 GX_Blend   blend )
-  {
-    if ( blend != NULL )
-    {
-      FT_UInt  i;
-
-
-      FT_FREE( blend->normalizedcoords );
-      FT_FREE( blend->mmvar );
-
-      if ( blend->avar_segment != NULL )
-      {
-        for ( i = 0; i < blend->num_axis; i++ )
-          FT_FREE( blend->avar_segment[i].correspondence );
-        FT_FREE( blend->avar_segment );
-      }
-
-      FT_FREE( blend->tuplecoords );
-      FT_FREE( blend->glyphoffsets );
-      FT_FREE( blend );
-    }
-  }
-
-#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
-
-
-/* END */
diff --git a/third_party/freetype/src/truetype/ttgxvar.h b/third_party/freetype/src/truetype/ttgxvar.h
deleted file mode 100644
index 060d4d6..0000000
--- a/third_party/freetype/src/truetype/ttgxvar.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/***************************************************************************/
-/*                                                                         */
-/*  ttgxvar.h                                                              */
-/*                                                                         */
-/*    TrueType GX Font Variation loader (specification)                    */
-/*                                                                         */
-/*  Copyright 2004-2015 by                                                 */
-/*  David Turner, Robert Wilhelm, Werner Lemberg and George Williams.      */
-/*                                                                         */
-/*  This file is part of the FreeType project, and may only be used,       */
-/*  modified, and distributed under the terms of the FreeType project      */
-/*  license, LICENSE.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 __TTGXVAR_H__
-#define __TTGXVAR_H__
-
-
-#include <ft2build.h>
-#include "ttobjs.h"
-
-
-FT_BEGIN_HEADER
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    GX_AVarCorrespondenceRec                                           */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    A data structure representing `shortFracCorrespondence' in `avar'  */
-  /*    table according to the specifications from Apple.                  */
-  /*                                                                       */
-  typedef struct  GX_AVarCorrespondenceRec_
-  {
-    FT_Fixed  fromCoord;
-    FT_Fixed  toCoord;
-
-  } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    GX_AVarRec                                                         */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Data from the segment field of `avar' table.                       */
-  /*    There is one of these for each axis.                               */
-  /*                                                                       */
-  typedef struct  GX_AVarSegmentRec_
-  {
-    FT_UShort              pairCount;
-    GX_AVarCorrespondence  correspondence; /* array with pairCount entries */
-
-  } GX_AVarSegmentRec, *GX_AVarSegment;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <Struct>                                                              */
-  /*    GX_BlendRec                                                        */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Data for interpolating a font from a distortable font specified    */
-  /*    by the GX *var tables ([fgca]var).                                 */
-  /*                                                                       */
-  /* <Fields>                                                              */
-  /*    num_axis         :: The number of axes along which interpolation   */
-  /*                         may happen                                    */
-  /*                                                                       */
-  /*    normalizedcoords :: A normalized value (between [-1,1]) indicating */
-  /*                        the contribution along each axis to the final  */
-  /*                        interpolated font.                             */
-  /*                                                                       */
-  typedef struct  GX_BlendRec_
-  {
-    FT_UInt         num_axis;
-    FT_Fixed*       normalizedcoords;
-
-    FT_MM_Var*      mmvar;
-    FT_Offset       mmvar_len;
-
-    FT_Bool         avar_checked;
-    GX_AVarSegment  avar_segment;
-
-    FT_UInt         tuplecount;      /* shared tuples in `gvar'           */
-    FT_Fixed*       tuplecoords;     /* tuplecoords[tuplecount][num_axis] */
-
-    FT_UInt         gv_glyphcnt;
-    FT_ULong*       glyphoffsets;
-
-  } GX_BlendRec;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <enum>                                                                */
-  /*    GX_TupleCountFlags                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Flags used within the `TupleCount' field of the `gvar' table.      */
-  /*                                                                       */
-  typedef enum  GX_TupleCountFlags_
-  {
-    GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000,
-    GX_TC_RESERVED_TUPLE_FLAGS       = 0x7000,
-    GX_TC_TUPLE_COUNT_MASK           = 0x0FFF
-
-  } GX_TupleCountFlags;
-
-
-  /*************************************************************************/
-  /*                                                                       */
-  /* <enum>                                                                */
-  /*    GX_TupleIndexFlags                                                 */
-  /*                                                                       */
-  /* <Description>                                                         */
-  /*    Flags used within the `TupleIndex' field of the `gvar' and `cvar'  */
-  /*    tables.                                                            */
-  /*                                                                       */
-  typedef enum  GX_TupleIndexFlags_
-  {
-    GX_TI_EMBEDDED_TUPLE_COORD  = 0x8000,
-    GX_TI_INTERMEDIATE_TUPLE    = 0x4000,
-    GX_TI_PRIVATE_POINT_NUMBERS = 0x2000,
-    GX_TI_RESERVED_TUPLE_FLAG   = 0x1000,
-    GX_TI_TUPLE_INDEX_MASK      = 0x0FFF
-
-  } GX_TupleIndexFlags;
-
-
-#define TTAG_wght  FT_MAKE_TAG( 'w', 'g', 'h', 't' )
-#define TTAG_wdth  FT_MAKE_TAG( 'w', 'd', 't', 'h' )
-#define TTAG_opsz  FT_MAKE_TAG( 'o', 'p', 's', 'z' )
-#define TTAG_slnt  FT_MAKE_TAG( 's', 'l', 'n', 't' )
-
-
-  FT_LOCAL( FT_Error )
-  TT_Set_MM_Blend( TT_Face    face,
-                   FT_UInt    num_coords,
-                   FT_Fixed*  coords );
-
-  FT_LOCAL( FT_Error )
-  TT_Set_Var_Design( TT_Face    face,
-                     FT_UInt    num_coords,
-                     FT_Fixed*  coords );
-
-  FT_LOCAL( FT_Error )
-  TT_Get_MM_Var( TT_Face      face,
-                 FT_MM_Var*  *master );
-
-
-  FT_LOCAL( FT_Error )
-  tt_face_vary_cvt( TT_Face    face,
-                    FT_Stream  stream );
-
-
-  FT_LOCAL( FT_Error )
-  TT_Vary_Apply_Glyph_Deltas( TT_Face      face,
-                              FT_UInt      glyph_index,
-                              FT_Outline*  outline,
-                              FT_UInt      n_points );
-
-
-  FT_LOCAL( void )
-  tt_done_blend( FT_Memory  memory,
-                 GX_Blend   blend );
-
-
-FT_END_HEADER
-
-
-#endif /* __TTGXVAR_H__ */
-
-
-/* END */
diff --git a/third_party/freetype/src/type1/Jamfile b/third_party/freetype/src/type1/Jamfile
deleted file mode 100644
index d1a3af5..0000000
--- a/third_party/freetype/src/type1/Jamfile
+++ /dev/null
@@ -1,35 +0,0 @@
-# FreeType 2 src/type1 Jamfile
-#
-# Copyright 2001-2015 by
-# David Turner, Robert Wilhelm, and Werner Lemberg.
-#
-# This file is part of the FreeType project, and may only be used, modified,
-# and distributed under the terms of the FreeType project license,
-# LICENSE.TXT.  By continuing to use, modify, or distribute this file you
-# indicate that you have read the license and understand and accept it
-# fully.
-
-SubDir  FT2_TOP $(FT2_SRC_DIR) type1 ;
-
-{
-  local  _sources ;
-
-  if $(FT2_MULTI)
-  {
-    _sources = t1afm
-               t1driver
-               t1gload
-               t1load
-               t1objs
-               t1parse
-               ;
-  }
-  else
-  {
-    _sources = type1 ;
-  }
-
-  Library  $(FT2_LIB) : $(_sources).c ;
-}
-
-# end of src/type1 Jamfile