CHANGES BETWEEN 2.11.0 and 2.11.1

  I. IMPORTANT CHANGES

    - Some  fields  in  the  `CID_FaceDictRec`, `CID_FaceInfoRec`, and
      `FT_Data` structures  have been changed  from signed to unsigned
      type,  which  better reflects  the actual usage.  It is also  an
      additional means to protect against malformed input.


  II. MISCELLANEOUS

    - Cmake support  has been  further improved.   To do  that various
      backward-incompatible  changes were  necessary; please  see file
      `CMakeLists.txt` for more details.

    - Since version  2.11.0, a  C99 compiler  is necessary  to compile
      FreeType.

    - The experimental  'COLR' v1 API  has been updated to  the latest
      OpenType standard 1.9.

    - The `apinames` tool got a new  option `-wV` to output an OpenVMS
      Linker Option File.

    - VMS support was updated.

    - MS Visual Studio support was added to build the demo programs.


======================================================================

CHANGES BETWEEN 2.10.4 and 2.11.0

  I. IMPORTANT CHANGES

  - A  new rendering  module has  been  added to  create 8-bit  Signed
    Distance Field (SDF)  bitmaps for both outline  and bitmap glyphs.
    The new  rendering mode is called  `FT_RENDER_MODE_SDF`, the pixel
    mode is  `FT_PIXEL_MODE_GRAY8`, and the corresponding  raster flag
    is `FT_RASTER_FLAG_SDF`.

    This work was Anuj Verma's GSoC 2020 project.

  - A new, experimental API is  now available for surfacing properties
    of 'COLR' v1  color fonts (as the name says,  this is an extension
    to  the  'COLR' table  for  outline  color  fonts using  the  SFNT
    container  format).   'COLR'  v1  fonts are  a  recently  proposed
    addition to OFF and OpenType; specification work currently happens
    in

      https://github.com/googlefonts/colr-gradients-spec/

    'COLR'  v1  is  expected  to   be  merged  to  OpenType;  the  ISO
    standardisation process  for adding 'COLR'  v1 as an  amendment to
    OFF is underway.

    Functions similar  to the  already existing  'COLR' API  have been
    added to access the corresponding data.

      FT_Get_Color_Glyph_Paint
        Retrieve the root paint for a given glyph ID.

      FT_Get_Paint_Layers
        Access the layers of a `PaintColrLayers` table.

      FT_Get_Colorline_Stops
        Retrieve the  'color stops' on a  color line.  As an  input, a
        color stop iterator gets used, which in turn is retrieved from
        a paint.

      FT_Get_Paint
        Dereference  an  `FT_OpaquePaint`   object  and  retrieve  the
        corresponding `FT_COLR_Paint`  object, which  contains details
        on how to draw the respective 'COLR' v1 `Paint` table.


  II. MISCELLANEOUS

  - FreeType has moved its infrastructure to

      https://gitlab.freedesktop.org/freetype

    A  side  effect  is  that  the git  repositories  are  now  called
    `freetype.git` and  `freetype-demos.git`, which by  default expand
    to the directories  `freetype` and `freetype-demos`, respectively.
    The documentation has been updated accordingly.

    FreeType's Savannah  repositories will stay; they  are now mirrors
    of the 'freedesktop.org' repositories.

  - A  new  function  `FT_Get_Transform`  returns  the  values set  by
    `FT_Set_Transform`.

  - A  new configuration  macro `FT_DEBUG_LOGGING`  is available.   It
    provides extended debugging capabilities for FreeType, for example
    showing a time stamp or displaying the component a tracing message
    comes from.  See file `docs/DEBUG` for more information.

    This work was Priyesh Kumar's GSoC 2020 project.

  - The legacy Type 1 and CFF  engines are further demoted due to lack
    of CFF2 charstring support.  You now need to use `FT_Property_Set`
    to  enable  them  besides  the  `T1_CONFIG_OPTION_OLD_ENGINE`  and
    `CFF_CONFIG_OPTION_OLD_ENGINE` options, respectively.

  - The experimental 'warp' mode (AF_CONFIG_OPTION_USE_WARPER) for the
    auto-hinter has been removed.

  - The smooth rasterizer performance has been improved by >10%.  Note
    that  due to  necessary code  changes there  might be  very subtle
    differences  in  rendering.  They  are  not  visible by  the  eye,
    however.

  - PCF bitmap fonts compressed with LZW (these are usually files with
    the extension `.pcf.Z`) are now handled correctly.

  - Improved  Meson  build  files,  including  support  to  build  the
    FreeType demo programs.

  - A new demo program `ftsdf` is available to display Signed Distance
    Fields of glyphs.

  - The `ftlint` demo program has been  extended to do more testing of
    its input.  In particular, it  can display horizontal and vertical
    acutances  for quality  assessment,  together  with computing  MD5
    checksums of rendered glyphs.

    [The acutance measures  how sharply the pixel  coverage changes at
     glyph edges.  For monochrome bitmaps,  it is always 2.0 in either
     X or  Y direction.  For  anti-aliased bitmaps, it depends  on the
     hinting and the shape of a glyph and might approach or even reach
     value 2.0  for glyphs like 'I',  'L', '+', '-', or  '=', while it
     might be lower for glyphs like 'O', 'S', or 'W'.]

  - The `ttdebug`  demo program didn't show  changed point coordinates
    (bug introduced in version 2.10.3).

  - It is now possible to adjust the axis increment for variable fonts
    in the `ftmulti` demo program.

  - It is now possible to change  the hinting engine in the `ftstring`
    demo program.

  - The graphical demo programs work  better now in native color depth
    on win32 and x11.


======================================================================

CHANGES BETWEEN 2.10.3 and 2.10.4 (2020-Oct-20)

  I. IMPORTANT BUG FIXES

  - A heap buffer overflow has been found  in the handling of embedded
    PNG bitmaps, introduced in FreeType version 2.6.

      https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-15999

    If you  use option  FT_CONFIG_OPTION_USE_PNG  you  should  upgrade
    immediately.


======================================================================

CHANGES BETWEEN 2.10.2 and 2.10.3 (2020-Oct-10)

  I. IMPORTANT CHANGES

  - New flag `FT_OUTLINE_OVERLAP'.  If set, make the smooth rasterizer
    do  4x4 oversampling  to  mitigate artifacts  in pixels  partially
    covered  by  overlapping  contours.    Note  that  this  at  least
    quadruples the rendering time.

    If  a  glyph  in  a  TrueType font  has  the  `OVERLAP_SIMPLE'  or
    `OVERLAP_COMPOUND'  bit set,  FreeType automatically  selects this
    rendering mode.


  II. MISCELLANEOUS

  - Using the  arcane method of  including FreeType header  files with
    macros like  `FT_FREETYPE_H' is no longer  mandatory (but retained
    as an optional feature for backward compatibility).

  - Support for  building the library  with Meson.  Building  the demo
    programs with Meson will follow in a forthcoming release.

  - Minor improvements to the B/W rasterizer.

  - Auto-hinter support for Medefaidrin script.

  - Fix various  memory leaks (mainly  for CFF) and other  issues that
    might cause crashes in rare circumstances.

  - Jam support has been removed.

  - In  `ftview', custom  LCD  filter values  are  now normalized  and
    balanced.  Unorthodox filters are still available through the `-L'
    command line option.

  - The GUI demo programs can now be resized.

  - Demo programs that accept command  line option `-k' can now handle
    function keys, too.  The  corresponding character codes start with
    0xF1.  As  an example, the  POSIX shell syntax (accepted  by bash,
    ksh, and zsh)

      -k $'\xF3q'

    emulates the pressing of function key `F3' followed by key `q'.


======================================================================

CHANGES BETWEEN 2.10.1 and 2.10.2 (2020-May-09)

  I. IMPORTANT CHANGES

  - Support  of  WOFF2  fonts.   This  code  contribution  was  Nikhil
    Ramakrishnan's GSoC 2019 project.


  II. MISCELLANEOUS

  - Function  `FT_Get_Var_Axis_Flags' returned random data for  Type 1
    MM fonts.

  - Type 1 fonts with non-integer metrics are now supported by the new
    (CFF) engine introduced in FreeType 2.9.

  - Drop  support  for Python 2 in Freetype's API reference  generator
    `docwriter'  (Python >= 3.5 is required for targets  `make refdoc'
    and `make refdoc-venv').

  - Auto-hinter support for Hanifi Rohingya.

  - Document the `FT2_KEEP_ALIVE' debugging environment variable.

  - The Visual C++ (and Visual C)  project files for Windows builds no
    longer generate libraries that contain the FreeType version in its
    filenames.   Instead,  a  resource  file gets  used  to  make  the
    libraries contain the corresponding information.

  - The next release will remove Jam build support.

  - The  `ftbench'  demo  program  has  a new  test  for  testing  the
    `FT_Glyph_Stroke' functionality.


======================================================================

CHANGES BETWEEN 2.10.0 and 2.10.1 (2019-Jul-01)

  I. IMPORTANT BUG FIXES

  - The bytecode hinting of OpenType variation fonts was flawed, since
    the data in the `CVAR' table wasn't correctly applied.


  II. MISCELLANEOUS

  - Auto-hinter support for Mongolian.

  - For distribution,  `.tar.bz2' packages are replaced with `.tar.xz'
    bundles.

  - The handling of  the default character in PCF fonts as  introduced
    in version 2.10.0 was partially broken, causing premature abortion
    of charmap iteration for many fonts.

  - If  `FT_Set_Named_Instance' was  called  with  the same  arguments
    twice in a row, the function  returned an incorrect error code the
    second time.

  - Direct   rendering   using  FT_RASTER_FLAG_DIRECT   crashed   (bug
    introduced in version 2.10.0).

  - Increased  precision  while  computing  OpenType  font   variation
    instances.

  - The  flattening  algorithm of  cubic  Bezier  curves was  slightly
    changed to make  it faster.  This can cause  very subtle rendering
    changes, which aren't noticeable by the eye, however.

  - The  auto-hinter  now  disables hinting  if there  are blue  zones
    defined for a `style' (i.e., a certain combination of a script and
    its related typographic features) but the font doesn't contain any
    characters needed to set up at least one blue zone.

  - The `ftmulti' demo program now  supports multiple hidden axes with
    the same name tag.

  - `ftview', `ftstring', and `ftgrid' got  a `-k' command line option
    to emulate a sequence of keystrokes at start-up.

  - `ftview', `ftstring', and `ftgrid' now support screen dumping to a
    PNG file.

  - The bytecode debugger, `ttdebug',  now supports variation TrueType
    fonts; a variation font instance can be selected with the new `-d'
    command line option.


======================================================================

CHANGES BETWEEN 2.9.1 and 2.10.0 (2019-Mar-15)

  I. IMPORTANT CHANGES

    - A bunch  of new functions has  been added to access  and process
      COLR/CPAL data of OpenType fonts with color-layered glyphs.

        FT_Palette_Data_Get
          Retrieve color palette data.
        FT_Palette_Select
          Select and activate a color palette for color-layered
          glyphs.
        FT_Palette_Set_Foreground_Color
          Set text foreground color for palette index 0xFFFF.

        FT_Get_Color_Glyph_Layer
          Get color layers for a given glyph (using an interator
          object).

        FT_Bitmap_Blend
          Blend one bitmap onto another with a given color.

    - An   experimental  feature   is   the  new   behaviour  of   the
      `FT_LOAD_COLOR' load  flag for color-layered  glyphs: Internally
      it  sets a  flag so  that  if `FT_Render_Glyph'  is called  with
      `FT_RENDER_MODE_NORMAL'      (or       `FT_Load_Glyph'      with
      `FT_LOAD_RENDER'), a default blending  of the color glyph layers
      will happen automatically for convenience.

    - As  a   GSoC  2018   project,  Nikhil   Ramakrishnan  completely
      overhauled and modernized the API reference.


  II. MISCELLANEOUS

    - The  logic for  computing  the global  ascender, descender,  and
      height  of  OpenType  fonts   has  been  slightly  adjusted  for
      consistency.

      . If the `useTypoMetrics' flag (i.e., bit 7 in the `fsSelection'
        field) in the  `OS/2' table is set, use the  `sTypo' fields in
        `OS/2' unconditionally.
      . Otherwise use  the metrics data from the `hhea'  table (if not
        zero).
      . Otherwise use the `sTypo' fields from the `OS/2' table (if not
        zero).
      . Otherwise use the `usWin' data from the `OS/2' table as a last
        resort.

      Variable fonts will apply the `MVAR' deltas to whichever metrics
      were picked.

    - `TT_Set_MM_Blend' could  fail if  call repeatedly with  the same
      arguments.

    - The precision  of handling  deltas in  Variation Fonts  has been
      increased.  The  problem did only show  up with multidimensional
      designspaces.

    - New function `FT_Library_SetLcdGeometry' to  set up the geometry
      of LCD subpixels.

    - FreeType now uses the `defaultChar' property of PCF fonts to set
      the  glyph for  the undefined  character  at glyph  index 0  (as
      FreeType already does for all other supported font formats).  As
      a consequence,  the order of  glyphs of  a PCF font  if accessed
      with  FreeType  can  be   different  now  compared  to  previous
      versions.

      This change doesn't affect PCF font access with cmaps.

    - `FT_Select_Charmap' has  been changed  to allow  parameter value
      `FT_ENCODING_NONE', which is valid for BDF, PCF, and Windows FNT
      formats to  access built-in cmaps  that don't have  a predefined
      `FT_Encoding' value.

    - A previously  reserved field in the  `FT_GlyphSlotRec' structure
      now holds the glyph index.

    - On Win32 platforms,  the use of `_DLL' to build  the library has
      been replaced with `DLL_EXPORT' and `DLL_IMPORT'.

    - The usual round  of fuzzer bug fixes to  better reject malformed
      fonts.

    - `FT_Outline_New_Internal'  and  `FT_Outline_Done_Internal'  have
      been removed.  These two functions were public by oversight only
      and were never documented.

    - A new  function `FT_Error_String' returns descriptions  of error
      codes if  configuration macro  FT_CONFIG_OPTION_ERROR_STRINGS is
      defined.

    - `FT_Set_MM_WeightVector'  and  `FT_Get_MM_WeightVector' are  new
      functions limited to Adobe MultiMaster fonts to directly set and
      get the weight vector.

    - Support for Position Independent Code as needed by  systems that
      prohibit  automatic  address  fixups,  such  as BREW,  has  been
      removed.  [Compilation with modern compilers that use flags like
      `-fPIC' or `-fPIE' is not affected.]

    - The  `ftdump' demo  program has  new  options `-c'  and `-C'  to
      display charmaps  in compact and detailed  format, respectively.
      Option `-V' has been removed.

    - The `ftview', `ftstring',  and `ftgrid' demo programs  use a new
      command line option `-d' to  specify the program window's width,
      height, and color depth.

    - The `ftview' demo program now  displays red boxes for zero-width
      glyphs.

    - `ftglyph'   has   limited   support  to   display   fonts   with
      color-layered glyphs.  This will be improved later on.

    - `ftgrid' can now display bitmap fonts also.

    - The `ttdebug'  demo program has  a new  option `-f' to  select a
      member of a TrueType collection (TTC).

    - Other various improvements to the demo programs.


======================================================================

CHANGES BETWEEN 2.9 and 2.9.1 (2019-May-01)

  I. IMPORTANT BUG FIXES

    - Type  1  fonts  containing   flex  features  were  not  rendered
      correctly (bug introduced in version 2.9).

    - CVE-2018-6942: Older  FreeType versions  can crash  with certain
      malformed variation fonts.

        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6942


  II. MISCELLANEOUS

    - Bug fix: Multiple calls to `FT_Get_MM_Var' returned garbage.

    - The base  extensions `ftlcdfil' and  `ftfntfmt' are now  part of
      the  base  module  (and  thus no  longer  configurable  in  file
      `modules.cfg').

    - Emboldening of bitmaps didn't work correctly sometimes,  showing
      various artifacts (bug introduced in version 2.8.1).

    - Use  of  the `freetype-config'  script  to  get compilation  and
      linking  options   is  deprecated   since  it   doesn't  support
      cross-compiling, among other  deficiencies.  Instead, you should
      use the `pkg-config' interface.

      The `configure'  script no longer installs  `freetype-config' by
      default.  For  backward  compatibility,  a new  configure option
      `--enable-freetype-config'   is  provided   that  reverts   this
      decision.

    - The auto-hinter script ranges have  been updated for Unicode 11.
      No support  for new scripts  have been added, however,  with the
      exception of Georgian Mtavruli.

    - Support for cmake has been improved.

    - The next  release will  remove support for  Position Independent
      Code  as  needed  by  systems that  prohibit  automatic  address
      fixups, such  as BREW.  [Compilation with  modern compilers that
      use flags like `-fPIC' or `-fPIE' is not affected.]


======================================================================

CHANGES BETWEEN 2.8.1 and 2.9 (2018-Jan-08)

  I. IMPORTANT BUG FIXES

    - Advance width values of variation fonts were often wrong.

    - More fixes for variation font support; you should update to this
      version if you want to support them.


  II. IMPORTANT CHANGES

    - As a GSoC project, Ewald Hew extended the new (Adobe) CFF engine
      to  handle  Type  1  fonts  also,  thus  greatly  improving  the
      rendering of  this format.   This is the  new default.   The old
      engine   is  still   available   if   the  configuration   macro
      `T1_CONFIG_OPTION_OLD_ENGINE'    gets    defined;   using    the
      `hinting-engine' property  of the `type1' driver  module you can
      then switch between the two engines.

    - A new function,  `FT_Set_Named_Instance', can be used  to set or
      change the current named instance.

    - Starting  with   this  FreeType  version,   resetting  variation
      coordinates  will   return  to  the  currently   selected  named
      instance.  Previously, FreeType returned to the base font (i.e.,
      no instance set).


  III. MISCELLANEOUS

    - The `face_flags' field of the `FT_Face' structure has a new bit,
      `FT_FACE_FLAG_VARIATION', which  is set if a  variation font has
      been      altered      with      `FT_Set_MM_Design_Coordinates',
      `FT_Set_Var_Design_Coordinates',                              or
      `FT_Set_Var_Blend_Coordinates'.

    - If  the  current  face  is  a  named  instance,  the  new  macro
      `FT_IS_NAMED_INSTANCE' returns true.

    - `FT_IS_VARIATION' is  a new macro  that returns true  whenever a
      face object has  been altered by `FT_Set_MM_Design_Coordinates',
      `FT_Set_Var_Design_Coordinates',                              or
      `FT_Set_Var_Blend_Coordinates'.

    - Changing  the  design  coordinates  of  a  variation  font  with
      `FT_Set_Var_Design_Coordinates'                               or
      `FT_Set_Var_Blend_Coordinates'  does  not  influence  the  named
      instance index value (only `FT_Set_Named_Instance' does that).

    - Special PostScript  names for named instances  are only returned
      if the  named instance is set  with `FT_Set_Named_Instance' (and
      the font  has corresponding  entries in  its `fvar'  table).  If
      `FT_IS_VARIATION'  returns  true,  the  algorithmically  derived
      PostScript name is provided, not  looking up special entries for
      named instances.

    - A new function  `FT_Done_MM_Var' is provided to  free the memory
      returned in a call to `FT_Get_MM_Var'.

    - On  platforms  using  the   `configure'  script,  the  installed
      `ftoption.h' file  now correctly reflects  configuration options
      like `--with-harfbuzz'.

    - Better  support to  build FreeType  as  a DLL  on Windows  using
      Visual C.

    - All data specific to driver modules is now collected in a single
      file,      `FT_DRIVER_H'.      Consequently,      the     macros
      `FT_AUTOHINTER_H',   `FT_CFF_DRIVER_H',  `FT_TRUETYPE_DRIVER_H',
      and `FT_PCF_DRIVER_H' still work but are deprecated.

    - Some fuzzer fixes to better reject malformed fonts.

    - The `ftbench' demo program has a new test for opening a new face
      and loading some glyphs.

    - The `ftbench' demo program has a  new option `-j' to specify the
      last glyph index to be used in the tests.

    - The  `ftgrid' demo  program has  a new  option `-n'  to suppress
      display of named instances of variation fonts.

    - The `ttdebug' demo program can now  show a stack trace (key `K')
      and switch  between hexadecimal and decimal  display of integers
      (key `I').


======================================================================

CHANGES BETWEEN 2.8 and 2.8.1 (2017-Sep-16)

  I. IMPORTANT BUG FIXES

    - B/W  hinting   of  TrueType   fonts  didn't  work   properly  if
      interpreter version 38 or 40 was selected.

    - Some severe  problems within the handling  of TrueType Variation
      Fonts were found and fixed.

    - Function `FT_Set_Var_Design_Coordinates' didn't correctly handle
      the case with less input coordinates than axes.


  II. IMPORTANT CHANGES

    - By  default,  FreeType  now offers  high  quality  LCD-optimized
      output without  resorting to ClearType techniques  of resolution
      tripling and  filtering.  In  this method, called  Harmony, each
      color channel  is generated separately after  shifting the glyph
      outline, capitalizing  on the fact  that the color grids  on LCD
      panels  are shifted  by  a third  of a  pixel.   This output  is
      indistinguishable from ClearType with a light 3-tap filter.


  III. MISCELLANEOUS

    - Using the  new function `FT_Get_Var_Axis_Flags',  an application
      can access the `flags' field  of a variation axis (introduced in
      OpenType version 1.8.2)

    - More sanity checks.

    - The  internal representation  of buffers  for LCD  rendering has
      changed (to be more precise, the amount of padding gets computed
      differently).  Applications  that use  the FreeType API  are not
      affected.

    - To  reset all  design axis  values of  a variation  font to  its
      default values you can now say

        error = FT_Set_Var_Design_Coordinates( face, 0, NULL );

      This  also works  with functions  `FT_Set_MM_Design_Coordinates'
      and `FT_Set_MM_Blend_Coordinates'.

    - FreeType  now synthesizes  a  missing Unicode  cmap for  (older)
      TrueType fonts also if glyph names are available.

    - FreeType  has  improved  handling   of  BDF  fonts  without  the
      `POINT_SIZE', `RESOLUTION_X', or  `RESOLUTION_Y' properties; the
      library now  uses the values of  the `SIZE' keyword if  they are
      missing.   Previously,   `SIZE'  was  completely   ignored,  and
      FreeType used heuristic values instead.

    - Multiple calls to `FT_Bitmap_Convert' do work now as advertised.
      Previously,  they failed with an assertion error if there was an
      empty bitmap between non-empty ones.

    - The warping option  has moved  from `light'  to `normal' hinting
      where  it replaces  the original hinting algorithm.  The `light'
      mode is now always void of any hinting in x-direction.

    - 16bit  compiler  support is  now  officially  ended.  We  didn't
      provide any maintenance  since many years,  and given that there
      were no error  or problem reports either it seems  that it is no
      longer needed.

    - The `ftgrid'  demo program  can now toggle  the display  of grid
      lines with the `G' key.

    - The `ftgrid' demo  program can toggle a different  set of colors
      (suitable to color-blind people) with the `C' key.

    - The `ftgrid'  demo program  now supports  the `-e'  command line
      option to select a cmap.

    - The `ftdump' demo program has a  new command line option `-t' to
      output the SFNT table list.


======================================================================

CHANGES BETWEEN 2.7.1 and 2.8 (2017-May-13)

  I. IMPORTANT CHANGES

    - Support for OpenType Variation Fonts is now complete.   The last
      missing part was handling the `VVAR' and `MVAR' tables, which is
      available with this release.

    - A new  function `FT_Face_Properties' allows the  control of some
      module  and   library  properties  per  font.    Currently,  the
      following properties can be  handled: stem darkening, LCD filter
      weights, and the random seed for the `random' CFF operator.

    - The PCF change to show more `colorful'  family names (introduced
      in version 2.7.1) was too radical; it can now be configured with
      PCF_CONFIG_OPTION_LONG_FAMILY_NAMES   at   compile   time.    If
      activated, it can  be switched off at run time  with the new pcf
      property  `no-long-family-names'.  If  the `FREETYPE_PROPERTIES'
      environment variable is available, you can say

        FREETYPE_PROPERTIES=pcf:no-long-family-names=1

    - Support  for  the  following  scripts  has  been  added  to  the
      auto-hinter.

        Adlam, Avestan, Bamum, Buhid, Carian, Chakma, Coptic, Cypriot,
        Deseret, Glagolitic, Gothic, Kayah, Lisu, N'Ko, Ol Chiki, Old
        Turkic, Osage, Osmanya, Saurashtra, Shavian, Sundanese, Tai
        Viet, Tifinagh, Unified Canadian Syllabics, Vai


  II. IMPORTANT BUG FIXES

    - `Light' auto-hinting  mode no  longer uses TrueType  metrics for
      TrueType  fonts.   This bug  was  introduced  in version  2.4.6,
      causing   horizontal  scaling   also.    Almost  all   GNU/Linux
      distributions (with Fedora as  a notable exception) disabled the
      corresponding patch for good reasons; chances are thus high that
      you won't notice a difference.

      If  optical backward  compatibility for  legacy applications  is
      necessary, you might enable the AF_CONFIG_OPTION_TT_SIZE_METRICS
      configuration option.   However, it  is strongly  recommended to
      avoid that, adjusting font sizes instead.

    - Global size  metrics values  in the  `FT_Size_Metrics' structure
      can be  different for TrueType  fonts.  Reason is that  in older
      FreeType  versions  the  metrics  were  rounded  differently  to
      integer pixels compared  to all other font  formats, yielding an
      inconsistent behaviour if you used non-native hinting.  Starting
      with this  version, global size  metrics for TrueType  fonts are
      handled the same as other  font formats: `ascender' gets rounded
      up,  `descender'  gets  rounded  down,  `height'  gets  normally
      rounded, and `max_advance' gets normally rounded, too.

      If you need more precise values of (global) ascender, descender,
      height, or  `max_advance', please take the  corresponding values
      from the `FT_Face' structure and scale them manually.

    - If a TrueType font gets loaded with FT_LOAD_NO_HINTING, FreeType
      now scales  the font linearly  again (bug introduced  in version
      2.4.6).

    - CVE-2017-8105,  CVE-2017-8287:  Older   FreeType  versions  have
      out-of-bounds  writes  caused  by  heap-based  buffer  overflows
      related to Type 1 fonts.

        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8105
        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-8287


  III. MISCELLANEOUS

    - A  new function  `FT_Set_Default_Properties' has  been added  to
      parse    the    `FREETYPE_PROPERTIES'    environment    variable
      (previously, it  was internal only).   `FT_Init_FreeType' always
      call this  function, but  `FT_New_Library' does not  (similar to
      `FT_Add_Default_Modules').

    - To be in sync with OpenType version 1.7 and newer, macros

        FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY,
        FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY,
        TT_NAME_ID_PREFERRED_FAMILY
        TT_NAME_ID_PREFERRED_SUBFAMILY

      are renamed to

        FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY,
        FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY,
        TT_NAME_ID_TYPOGRAPHIC_FAMILY
        TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY

      The old macro names are deprecated (but still available).

    - Support for SFNT `name' tables has been improved.

      . Format  1 `name' tables  are now supported.  Use  new function
        `FT_Get_Sfnt_LangTag' to access associated language tags.

      . Language, encoding, and name IDs have been updated to OpenType
        version 1.8.1.

    - The new CFF  engine now handles the `random'  operator.  All CFF
      opcodes are now supported.

    - The CFF module  has a new property `random-seed'  to control the
      pseudo-random number generation for the `random' operator.

    - The `freetype-config' script is now a wrapper of `pkg-config' if
      this program is available in the path.

    - FT_LOAD_TARGET_LCD  is now  a  variant of  FT_LOAD_TARGET_LIGHT;
      this should provide better rendering results.

    - A mode to display  light auto-hinting with  subpixel positioning
      has been added to `ftdiff'.


======================================================================

CHANGES BETWEEN 2.7 and 2.7.1 (2016-Dec-30)

  I. IMPORTANT CHANGES

    - Support for the new CFF2 font format as introduced with OpenType
      1.8 has been contributed by Dave Arnolds from Adobe.

    - Preliminary support for variation fonts as specified in OpenType
      1.8 (in addition to the  already existing support for Adobe's MM
      and Apple's  GX formats).  Dave Arnolds  contributed handling of
      advance  width change  variation;  more will  come  in the  next
      version.


  II. IMPORTANT BUG FIXES

    - Handling of  raw CID fonts was partially  broken (bug introduced
      in 2.6.4).

    - CVE-2016-10328:  Older  FreeType versions had  an  out-of-bounds
      write caused by a heap-based  buffer overflow related to the CFF
      fonts.

        https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10328


  III. MISCELLANEOUS

    - Some limits for TrueType  bytecode execution have been tightened
      to  speed   up  FreeType's  handling  of   malformed  fonts,  in
      particular to quickly abort endless loops.

      - The  number of  twilight points  can no  longer be  set to  an
        arbitrarily large value.

      - The total number of jump  opcode instructions (like JMPR) with
        negative arguments  is dynamically restricted; the  same holds
        for the total number of iterations in LOOPCALL opcodes.

      The dynamic limits are based on  the number of points in a glyph
      and the number of CVT entries.  Please report if you encounter a
      font where the selected values are not adequate.

    - PCF family names are made more `colorful';  they now include the
      foundry  and information  whether they contain  wide characters.
      For example,  you no longer get `Fixed' but  rather `Sony Fixed'
      or `Misc Fixed Wide'.

    - A new  function `FT_Get_Var_Blend_Coordinates'  (with its  alias
      name  `FT_Get_MM_Blend_Coordinates') to retrieve the  normalized
      blend  coordinates of the currently  selected variation instance
      has been added to the Multiple Masters interface.

    - A new  function `FT_Get_Var_Design_Coordinates' to  retrieve the
      design coordinates of the  currently selected variation instance
      has been added to the Multiple Masters interface.

    - A new load flag `FT_LOAD_BITMAP_METRICS_ONLY' to retrieve bitmap
      information without loading the (embedded) bitmap itself.

    - Retrieving   advance   widths   from   bitmap   strikes   (using
      `FT_Get_Advance' and `FT_Get_Advances') have been sped up.

    - The  usual round  of  fuzzer fixes  to  better reject  malformed
      fonts.

    - The `ftmulti' demo program can now switch engines with key `H'.

    - The  `ftstring'  demo  program   can  now  show  some  built-in,
      non-latin sample strings (to be selected with the TAB key).

    - The  `ftview'  demo program  can  now  switch between  a  font's
      charmaps using the TAB key.


======================================================================

CHANGES BETWEEN 2.6.5 and 2.7 (2016-Sep-08)

  I. IMPORTANT CHANGES

    - As announced earlier, the 2.7.x series now uses the new subpixel
      hinting  mode as  the  default, emulating  a  modern version  of
      ClearType.

      This change inevitably leads to different rendering results, and
      you   might   change   the   `TT_CONFIG_OPTION_SUBPIXEL_HINTING'
      configuration option to  adapt it to your taste (or  use the new
      `FREETYPE_PROPERTIES'    environment    variable).    See    the
      corresponding entry  below for  version 2.6.4, which  gives more
      information.

    - A new option  `FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES' has been
      introduced.   If  set (which  is  the  default), an  environment
      variable  `FREETYPE_PROPERTIES' can  be used  to control  driver
      properties.  Example:

        FREETYPE_PROPERTIES=truetype:interpreter-version=35 \
                            cff:no-stem-darkening=1 \
                            autofitter:warping=1

      This allows to select, say, the subpixel hinting mode at runtime
      for a given application.  See file `ftoption.h' for more.


  II. IMPORTANT BUG FIXES

    - After  loading a  named instance  of  a GX  variation font,  the
      `face_index'  value  in  the returned  `FT_Face'  structure  now
      correctly holds the named instance  index in the upper 16bits as
      documented.


  III. MISCELLANEOUS

    - A new macro `FT_IS_NAMED_INSTANCE' to  test whether a given face
      is a named instance.

    - More fixes to GX font handling.

    - Apple's   `GETVARIATION'  bytecode   operator  (needed   for  GX
      variation font support) has been implemented.

    - Another round  of fuzzer fixes,  mainly to reject  invalid fonts
      faster.

    - Handling of raw CID fonts  was broken (bug introduced in version
      2.6.4).

    - The smooth rasterizer has been streamlined  to make it faster by
      approx. 20%.

    - The `ftgrid'  demo program now  understands command  line option
      `-d' to give start-up design coordinates.

    - The `ftdump' demo program has  a new command line option `-p' to
      dump TrueType bytecode instructions.


======================================================================

CHANGES BETWEEN 2.6.4 and 2.6.5 (2016-Jul-12)

  I. IMPORTANT BUG FIXES

    - Compilation works again  on Mac OS X (bug introduced  in version
      2.6.4).


  II. IMPORTANT CHANGES

    - The new  subpixel hinting  mode is now  disabled by  default; it
      will  be enabled  by default  in the  forthcoming 2.7.x  series.
      Main reason for reverting this feature is the principle of least
      surprise: a  sudden change in  appearance of all fonts  (even if
      the rendering improves  for almost all recent  fonts) should not
      be expected in a new micro version of a series.


======================================================================

CHANGES BETWEEN 2.6.3 and 2.6.4 (2016-Jul-05)

  I. IMPORTANT CHANGES

    - A new  subpixel hinting  mode has  been contributed  by Nikolaus
      Waxweiler, which is now the  default rendering mode for TrueType
      fonts.  It implements  (almost everything of) version  40 of the
      bytecode engine.

      The existing code  base in FreeType (the  `Infinality code') was
      stripped to the bare minimum  and all configurability removed in
      the  name  of speed  and  simplicity.   The configurability  was
      mainly aimed  at legacy  fonts like Arial,  Times New  Roman, or
      Courier.  [Legacy fonts are fonts  that modify vertical stems to
      achieve clean black-and-white bitmaps.]  The new mode focuses on
      applying a minimal set of rules to all fonts indiscriminately so
      that modern and web fonts  render well while legacy fonts render
      okay.

      Activation  of the  subpixel hinting  support can  be controlled
      with   the   `TT_CONFIG_OPTION_SUBPIXEL_HINTING'   configuration
      option  at compile  time: If  set to  value 1,  you get  the old
      Infinality  mode  (which  was  never  the  default  due  to  its
      slowness).  Value 2 activates the new subpixel hinting mode, and
      value 3 activates both.  The default is value 2.

      At run time,  you can select the subpixel hinting  mode with the
      `interpreter-version'  property (provided  you have  compiled in
      the corresponding hinting mode); see `ftttdrv.h' for more.

    - Support  for  the  following  scripts  has  been  added  to  the
      auto-hinter.

        Armenian, Cherokee, Ethiopic, Georgian, Gujarati, Gurmukhi,
        Malayalam, Sinhala, Tamil


  II. MISCELLANEOUS

    - Type 42 fonts as created by LilyPond are now supported.

    - Minor rendering improvements in the auto-hinter.

    - For experimental  reasons, the old  CFF engine now  supports all
      CFF operators except `random', including the deprecated Multiple
      Masters  instructions.  This  allows the  display of  fonts like
      `ITCGaramondMM-It.otf' (without font variations, though).

    - Another round of fixes to improve handling of invalid fonts.

    - The `ftgrid' demo program now displays the rendered pixels also;
      this can be switched off with the `b' key.  Selection of various
      LCD filtering modes can be done with the `L' key.

    - The demo programs  have been extended to allow  selection of all
      available TrueType bytecode engines.

    - A very early beta version of a new, Qt based demo program called
      `ftinspect'  is  part  of  the   source  code  bundle;  it  will
      eventually supersede  the other  demo programs.   Currently, you
      have to compile  it manually with `qmake; make';  note that many
      features are still missing.


======================================================================

CHANGES BETWEEN 2.6.2 and 2.6.3 (2016-Feb-08)

  I. IMPORTANT CHANGES

    - Khmer,  Myanmar, Bengali,  and Kannada  script support  has been
      added to the auto-hinter.


  II. MISCELLANEOUS

    - Better  support of  Indic  scripts like  Devanagari  by using  a
      top-to-bottom hinting flow.

    - All  FreeType macros  starting  with two  underscores have  been
      renamed to  avoid a violation of  both the C and  C++ standards.
      Example: Header  macros of the  form `__FOO_H__' are  now called
      `FOO_H_'.  In most cases,  this should be completely transparent
      to the user.   The exception to this  is `__FTERRORS_H__', which
      must be  sometimes undefined by  the user to get  FreeType error
      strings:  Both this  form and  the new  `FTERRORS_H_' macro  are
      accepted for backward compatibility.

    - Minor improvements mainly to the Type 1 driver.

    - The  new CFF  engine now  supports all  Type 2  operators except
      `random'.

    - The macro `_STANDALONE_', used for  compiling the B/W and smooth
      rasterizers  as   stand-alone  modules,  has  been   renamed  to
      `STANDALONE_', since macro names starting with an underscore and
      followed by an uppercase letter are reserved in both C and C++.

    - Function  `FT_Library_SetLcdFilterWeights'  now  also  activates
      custom LCD filter weights (instead of just adjusting them).

    - Support for  `unpatented hinting'  has been  completely removed:
      Consequently,  the two  functions `FT_Face_CheckTrueTypePatents'
      and  `FT_Face_SetUnpatentedHinting'  now  return  always  false,
      doing nothing.

    - The `ftgamma' demo  program has been modernized;  the gamma grid
      display has been moved from `ftview' to this program.

    - In `ftview',  it is now possible to cycle through  the available
      LCD filtering modes.


======================================================================

CHANGES BETWEEN 2.6.1 and 2.6.2 (2015-Nov-28)

  I. IMPORTANT CHANGES

    - The auto-hinter now supports stem darkening, to be controlled by
      the    new   `no-stem-darkening'    and   `darkening-parameters'
      properties.   This is  an  experimental  feature contributed  by
      Nikolaus Waxweiler, and  the interface might change  in a future
      release.

    - By default, stem darkening is now switched off (for both the CFF
      engine and the  auto-hinter).  The main reason is  that you need
      linear  alpha  blending  and  gamma correction  to  get  correct
      rendering results, and  the latter is not yet  available in most
      freely  available  rendering  stacks like  X11.   Applying  stem
      darkening without proper gamma correction  leads to far too dark
      rendering results.

    - The   meaning  of   `FT_RENDER_MODE_LIGHT'  has   been  slightly
      modified.   It  now  essentially  means `no  hinting  along  the
      horizontal  axis'; in  particular,  no change  of glyph  advance
      widths.  Consequently, the auto-hinter  is used for all scalable
      font  formats  except  for  CFF.    It  is  planned  that  other
      font-specific rendering engines (TrueType, Type 1) will follow.


  II. MISCELLANEOUS

    - The default  LCD filter  has been changed  to be  normalized and
      color-balanced.

    - For    better    compatibility   with    FontConfig,    function
      `FT_Library_SetLcdFilter'  accepts   a  new   enumeration  value
      `FT_LCD_FILTER_LEGACY1'   (which  has   the   same  meaning   as
      `FT_LCD_FILTER_LEGACY').

    - A large number of bugs have been detected by using the libFuzzer
      framework,  which should  further  improve  handling of  invalid
      fonts.  Thanks again to Kostya Serebryany and Bungeman!

    - `TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES',  a   new  configuration
      option, controls the maximum number of executed opcodes within a
      bytecode program.  You don't want to change this except for very
      special  situations (e.g.,  making a  library fuzzer  spend less
      time to handle broken fonts).

    - The smooth renderer has been made faster.

    - The `ftstring' demo program now supports subpixel rendering; use
      key `l' to cycle through the LCD modes.

    - The `ftstring'  demo program now supports  color rendering;  use
      the `space' key to cycle through various color combinations.

    - The graphical demo programs now use a default gamma value of 1.8
      (instead of 1.2).


======================================================================

CHANGES BETWEEN 2.6 and 2.6.1 (2015-Oct-04)

  I. IMPORTANT BUG FIXES

    - It turned  out that for CFFs  only the advance widths  should be
      taken from the  `htmx' table, not the side  bearings.  This bug,
      introduced in  version 2.6.0, makes  it necessary to  upgrade if
      you are using  CFFs; otherwise, you get cropped  glyphs with GUI
      interfaces like GTK or Qt.

    - Accessing Type 42 fonts returned  incorrect results if the glyph
      order of the embedded TrueType font differs from the glyph order
      of the Type 42 charstrings table.


  II. IMPORTANT CHANGES

    - The header  file layout  has been  changed (again),  moving  all
      header files except `ft2build.h' into a subdirectory tree.

      Doing so  reduces the  possibility of  header file  name clashes
      (e.g., FTGL's  `FTGlyph.h' with FreeType's `ftglyph.h')  on case
      insensitive file systems like Mac OS X or Windows.

      Applications  that  use  (a)  the  `freetype-config'  script  or
      FreeType's `freetype2.pc' file for pkg-config to get the include
      directory  for the  compiler,  and (b)  the  documented way  for
      header inclusion like

        #include <ft2build.h>
        #include FT_FREETYPE_H
        ...

      don't need any change to the source code.

    - Simple access  to named instances  in GX variation fonts  is now
      available (in addition to the  previous method via FreeType's MM
      interface).   In  the `FT_Face'  structure,  bits  16-30 of  the
      `face_index' field hold the current named instance index for the
      given face  index, and bits  16-30 of `style_flags'  contain the
      number of  instances for  the given face  index.  `FT_Open_Face'
      and friends also understand the  extended bits of the face index
      parameter.

      You need to enable  TT_CONFIG_OPTION_GX_VAR_SUPPORT for this new
      feature.  Otherwise, bits  16-30 of the two fields  are zero (or
      are ignored).

    - Lao script support has been added to the auto-hinter.


  III. MISCELLANEOUS

    - The auto-hinter's Arabic script support has been enhanced.

    - Superscript-like and  subscript-like glyphs  as used  by various
      phonetic alphabets like the IPA  are now better supported by the
      auto-hinter.

    - The TrueType bytecode interpreter now runs slightly faster.

    - Improved support for builds with cmake.

    - The  function  `FT_CeilFix'  now   always  rounds  towards  plus
      infinity.

    - The  function  `FT_FloorFix'  now always  rounds  towards  minus
      infinity.

    - A  new load  flag `FT_LOAD_COMPUTE_METRICS'  has been  added; it
      makes FreeType  ignore pre-computed  metrics, as needed  by font
      validating  or  font  editing  programs.  Right  now,  only  the
      TrueType  module supports  it  to ignore  data  from the  `hdmx'
      table.

    - Another round of bug fixes  to better handle broken fonts, found
      by Kostya Serebryany <kcc@google.com>.


======================================================================

CHANGES BETWEEN 2.5.5 and 2.6 (2015-Jun-07)

  I. IMPORTANT CHANGES

    - Behdad  Esfahbod contributed  code  for improved  thread-safety,
      which results in the following model.

      * An `FT_Face' object can only be safely used from one thread at
        a time.

      * An `FT_Library'  object can  now be used  without modification
        from multiple threads at the same time.

      * `FT_Face' creation and destruction  with the same `FT_Library'
        object can only be done from one thread at a time.

      One can use a single  `FT_Library' object across threads as long
      as a mutex lock is used around `FT_New_Face' and `FT_Done_Face'.
      Any calls to `FT_Load_Glyph' and similar API are safe and do not
      need the lock  to be held as  long as the same  `FT_Face' is not
      used from multiple threads at the same time.

    - Thai script support has been added to the auto-hinter.

    - Arabic script support has been added to the auto-hinter.

    - Following OpenType version 1.7,  advance widths and side bearing
      values in  CFFs (wrapped  in an SFNT  structure) are  now always
      taken from the `hmtx' table.

    - Following OpenType  version 1.7, the  PostScript font name  of a
      CFF font (wrapped in an SFNT structure) is now always taken from
      the `name'  table.  This is  also true for  OpenType Collections
      (i.e., TTCs using  CFFs subfonts instead of TTFs),  where it may
      have a significant difference.

    - Fonts natively hinted for  ClearType are now supported, properly
      handling selector index 3 of the INSTCTRL bytecode instruction.

    - Major improvements to the GX TrueType variation font handling.


  II. MISCELLANEOUS

    - A new auto-hinter  property `warping' can switch on  and off the
      warping code  if this  experimental feature  is compiled  in (by
      defining  the AF_CONFIG_OPTION_USE_WARPER  configuration option;
      by default  this option is  now enabled but warping  is switched
      off).

      The AF_CONFIG_OPTION_USE_WARPER option itself is an old feature,
      available   since  2006.    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.

      See  file  `ftautoh.h' for  more;  the  demo programs  `ftdiff',
      `ftview', and `ftgrid' can toggle warping with key `w'.

    - Some  fields  in  the  `FTC_ImageTypeRec'  structure  have  been
      changed from signed to unsigned  type, which better reflects the
      actual usage.  It is also an additional means to protect against
      malformed input.

      This  change doesn't  break  the ABI;  however,  it might  cause
      compiler warnings.

    - Function `FT_Bitmap_New'  has been renamed  to `FT_Bitmap_Init',
      since  this name  better reflects  its  function.   For backward
      compatibility, the old function name is still available.

    - Function   `FT_Get_X11_Font_Format'   has    been   renamed   to
      `FT_Get_Font_Format',  since  this   name  better  reflects  its
      function.  For backward compatibility,  the old function name is
      still available.

      Additionally, the header  file macro for this  function has been
      renamed to  `FT_FONT_FORMATS_H' (the old name  `FT_XFREE86_H' is
      retained for backward compatibility).

    - Various improvements to the `ftgrid' demo program.

      . It  can  now  display  GX and  MM  fonts  while  interactively
        manipulating the axes (with keys F2, F3, and F4).

      . Anti-aliasing rendering  modes can now be  selected (with keys
        F5 and F6).

      . The display of point numbers can be toggled with key `D'.

    - Various improvements to the `ftdump' demo program.

      . It now displays information on MM and GX variation axes.

      . New  command line option  `-u' makes  it output data  in utf-8
        encoding.

    - The `ftmulti'  demo program can  now handle up  to six MM  or GX
      axes.


======================================================================

CHANGES BETWEEN 2.5.4 and 2.5.5 (2014-Dec-30)

  I. IMPORTANT BUG FIXES

    - Handling of  uncompressed PCF files works again (bug  introduced
      in version 2.5.4).


======================================================================

CHANGES BETWEEN 2.5.3 and 2.5.4 (2014-Dec-06)

  I. IMPORTANT BUG FIXES

    - A   variant  of   vulnerability  CVE-2014-2240   was  identified
      (cf.  https://savannah.nongnu.org/bugs/?43661) and  fixed in the
      new CFF driver.  All users should upgrade.

    - The new auto-hinter code using HarfBuzz crashed for some invalid
      fonts.

    - Many fixes to better protect against malformed input.


  II. IMPORTANT CHANGES

    - Full auto-hinter support of the Devanagari script.

    - Experimental auto-hinter support of the Telugu script.

    - CFF stem darkening behaviour can now be controlled at build time
      using the eight macros

        CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4}    .

    - Some fields in the `FT_Bitmap'  structure have been changed from
      signed to unsigned type, which better reflects the actual usage.
      It  is also  an additional  means to  protect against  malformed
      input.

      This  change doesn't  break  the ABI;  however,  it might  cause
      compiler warnings.


  III. MISCELLANEOUS

    - Improvements to  the auto-hinter's algorithm to  recognize stems
      and local extrema.

    - Function `FT_Get_SubGlyph_Info' always returned an error even in
      case of success.

    - Version  2.5.1 introduced  major bugs  in  the cjk  part of  the
      auto-hinter, which are now fixed.

    - The  `FT_Sfnt_Tag'  enumeration  values  have  been  changed  to
      uppercase,  e.g.  `FT_SFNT_HEAD'.   The lowercase  variants  are
      deprecated.    This  is   for  orthogonality   with  all   other
      enumeration (and enumeration-like) values in FreeType.

    - `cmake' now supports builds of FreeType as an OS X framework and
      for iOS.

    - Improved project files for vc2010, introducing a property file.

    - The  documentation generator  for  the API  reference  has  been
      updated to produce  better HTML code (with proper  CSS).  At the
      same time, the documentation got a better structure.

    - The FT_LOAD_BITMAP_CROP flag is obsolete;  it is not used by any
      driver.

    - The  TrueType  DELTAP[123]  bytecode instructions  now  work  in
      subpixel hinting  mode as described in  the ClearType whitepaper
      (i.e., for touched points in the non-subpixel direction).

    - Many small improvements to the internal arithmetic routines.


======================================================================

CHANGES BETWEEN 2.5.2 and 2.5.3 (2014-Mar-06)

  I. IMPORTANT BUG FIXES

    - A vulnerability (CVE-2014-2240) was  identified and fixed in the
      new  CFF driver  (cf.  https://savannah.nongnu.org/bugs/?41697).
      All users should upgrade.

    - More  bug  fixes related  to  correct  positioning of  composite
      glyphs.

    - Many fixes to better protect against malformed input.


  II. IMPORTANT CHANGES

    - FreeType can now use the HarfBuzz library to greatly improve the
      auto-hinting of  fonts that  use OpenType features:  Many glyphs
      that are part  of such features but don't have  cmap entries are
      now handled  properly, for  example small caps  or superscripts.
      Define the configuration  macro FT_CONFIG_OPTION_USE_HARFBUZZ to
      activate HarfBuzz support.

      You need HarfBuzz version 0.9.19 or newer.

      Note that HarfBuzz depends on  FreeType; this currently causes a
      chicken-and-egg problem  that can be  solved as follows  in case
      HarfBuzz is not yet installed on your system.

        1. Compile  and  install  FreeType without  the  configuration
           macro FT_CONFIG_OPTION_USE_HARFBUZZ.

        2. Compile and install HarfBuzz.

        3. Define  macro  FT_CONFIG_OPTION_USE_HARFBUZZ, then  compile
           and install FreeType again.

      With FreeType's  `configure' script the procedure  boils down to
      configure, build, and install FreeType, then configure, compile,
      and  install  HarfBuzz,  then configure,  compile,  and  install
      FreeType again (after executing `make distclean').

    - All  libraries FreeType  depends on  are now  checked using  the
      `pkg-config' configuration files  first, followed by alternative
      methods.

    - The  new  value  `auto'  for the  various  `--with-XXX'  library
      options   (for   example   `--with-harfbuzz=auto')   makes   the
      `configure' script automatically link to the libraries it finds.
      This is now the default.

    - In case FreeType's `configure' script  can't find a library, you
      can  pass environment  variables to  circumvent pkg-config,  and
      those variables  have been  harmonized as  a consequence  of the
      changes mentioned above:

        LIBZ           -> removed; use LIBZ_CFLAGS and LIBZ_LIBS
        LIBBZ2         -> removed; use BZIP2_CFLAGS and BZIP2_LIBS
        LIBPNG_LDFLAGS -> LIBPNG_LIBS

      `./configure --help' shows all available environment variables.

    - The `freetype-config'  script now understands  option `--static'
      to emit static linking information.


======================================================================

CHANGES BETWEEN 2.5.1 and 2.5.2 (2013-Dec-08)

  I. IMPORTANT BUG FIXES

    - Improving the display of some broken TrueType fonts introduced a
      bug  that made  FreeType crash  on some  popular (but  not fully
      conformant) fonts like `ahronbd.ttf'.

    - Another round of improvements to correct positioning and hinting
      of composite glyphs in TrueType fonts.


  II. MISCELLANEOUS

    - Version  2.5.1  introduced a  bug  in  handling embedded  bitmap
      strikes of  TrueType fonts,  causing garbage display  under some
      circumstances.

    - The   `ftgrid'   demo   program    couldn't   be   compiled   in
      non-development builds.


======================================================================

CHANGES BETWEEN 2.5 and 2.5.1 (2013-Nov-25)

  I. IMPORTANT BUG FIXES

    - For  some WinFNT  files,  the last  glyph  wasn't displayed  but
      incorrectly marked as invalid.

    - The vertical size of glyphs was  incorrectly set after a call to
      `FT_GlyphSlot_Embolden', resulting in clipped glyphs.

    - Many fields of the `PCLT' table in SFNT based fonts (if accessed
      with `FT_Get_Sfnt_Table') were computed incorrectly.

    - In TrueType fonts,  hinting of composite glyphs  could sometimes
      deliver  incorrect positions  of  components or  even  distorted
      shapes.


  II. IMPORTANT CHANGES

    - WOFF font format support has been added.

    - The auto-hinter now supports Hebrew.  Greek and Cyrillic support
      has been improved.

    - Support for the forthcoming `OS/2'  SFNT table version 5, as can
      be found e.g. in the `Sitka' font family for Windows 8.1.

    - The header  file layout  has been changed.   After installation,
      all files are now located in `<prefix>/include/freetype2'.

      Applications  that  use   (a)  `freetype-config'  or  FreeType's
      `pkg-config' file to get the include directory for the compiler,
      and (b) the documented way for header inclusion like

        #include <ft2build.h>
        #include FT_FREETYPE_H
        ...

      don't need any change to the source code.


  III. MISCELLANEOUS

    - The stem  darkening feature  of the  new CFF  engine can  now be
      fine-tuned with the new `darkening-parameters' property.

    - `ftgrid' has been updated to toggle various engines with the `H'
      key, similar to `ftview' and `ftdiff'.

    - The functionality of `ttdebug' has been greatly enhanced.

      . It now displays twilight, storage, and control value data; key
        `T' shows the twilight point  table, key `S' the storage data,
        and key `C' the control value table.

      . Some  keys  have  been  reassigned  from  lowercase  to  their
        uppercase equivalents; for example `q'  to quit the program is
        now `Q'.

      . Key `f' finishes the current function.

      . Key `R' restarts the debugger.

      . Keys `b' and `p' set a breakpoint.

      . Key `B' provides a function call backtrace.

    - Better support of ARMv7 and x86_64 processors.

    - Apple's `sbix' color bitmap format is now supported.

    - Improved   auto-hinter  rendering   for  many   TrueType  fonts,
      especially in the range 20-40ppem.

    - A  new face  flag  `FT_FACE_FLAG_COLOR' has  been  added (to  be
      accessed with the macro `FT_HAS_COLOR').

    - `FT_Gzip_Uncompress'   (modeled    after   zlib's   `uncompress'
      function)  has been  added; this  is a  by-product of  the newly
      added WOFF support.

    - Support for  a build with  `cmake' has been contributed  by John
      Cary <cary@txcorp.com>.

    - Support for x64  builds with Visual C++ has  been contributed by
      Kenneth Miller <kennethadammiller@yahoo.com>

    - Manual pages for most demo programs have been added.

    - The GETINFO bytecode instruction for TrueType fonts was buggy if
      used to retrieve subpixel hinting information.  It was necessary
      to set  selector bit 6  to get  results for selector  bits 7-10,
      which is wrong.

    - Improved computation  of emulated vertical metrics  for TrueType
      fonts.

    - Fixed horizontal start-up position of vertical phantom points in
      TrueType bytecode.


======================================================================

CHANGES BETWEEN 2.4.12 and 2.5 (2013-Jun-19)

  I. IMPORTANT BUG FIXES

    - The cache manager function `FTC_Manager_Reset'  didn't flush the
      cache.


  II. IMPORTANT CHANGES

    - Behdad Esfahbod  (on behalf  of Google) contributed  support for
      color embedded bitmaps (eg. color emoji).

      A  new  load  flag,  FT_LOAD_COLOR, makes  FreeType  load  color
      embedded-bitmaps, following this draft specification

        https://color-emoji.googlecode.com/git/specification/v1.html

      which defines two new SFNT  tables, `CBDT' and `CBLC' (named and
      modeled  after  `EBDT'  and `EBLC',  respectively).   The  color
      bitmaps  are  stored in  the  new  FT_PIXEL_MODE_BGRA format  to
      represent BGRA  pre-multiplied sRGB  images.  If PNG  support is
      available,  PNG color  images as  defined in  the same  proposed
      specification are supported also.

      Note that  color bitmaps  are converted  to grayscale  if client
      didn't ask for color.

    - As  announced in  the  previous release,  the  old FreeType  CFF
      engine  is now  disabled by  default.  It  can be  conditionally
      compiled     by     defining     the     configuration     macro
      CFF_CONFIG_OPTION_OLD_ENGINE.

    - As announced in the previous release,  all code related to macro
      FT_CONFIG_OPTION_OLD_INTERNALS  has been removed,  thus becoming
      obsolete.


  III. MISCELLANEOUS

    - The  property API  (`FT_Property_Get' and  `FT_Property_Set') is
      now declared as stable.

      The  exception,   however,  are  the   experimental  auto-hinter
      properties `glyph-to-script-map' and `fallback-script' which are
      subject to change in a forthcoming release.

    - `ftview' has been updated to  support color embedded bitmaps; it
      can be toggled on and off  with key `c'.  The small cache toggle
      is now key `K'.

    - It  is now  possible  to  control the  version  of the  TrueType
      hinting engine  using the new `interpreter-version'  property of
      the  `truetype' module:  Versions 35  and 38  (the default)  are
      supported,  which  roughly  corresponds to  disable  and  enable
      subpixel hinting support, respectively.

      In  both  `ftview'  and  `ftdiff',  switching  between  the  two
      versions  can be  done  with  key `H'.   In  the `ftbench'  demo
      program, command line option `-H'  has been extended to activate
      the non-default interpreter version.

    - The `ttdebug' program has been further improved.  In particular,
      it accepts a new command line  option `-H' to select the hinting
      engine.

    - `ftdump's verbose option has been renamed to `-V'.  For all demo
      programs, `-v' now shows version information.

    - Another round of TrueType subpixel hinting fixes.

    - The `apinames' tool can now create an import file for NetWare.

    - 64bit compilation of the new CFF engine was buggy.

    - Some fixes to improve robustness in memory-tight situations.


======================================================================

CHANGES BETWEEN 2.4.11 and 2.4.12 (2013-May-08)

    - We have another CFF parsing and hinting engine!  Written by Dave
      Arnold <darnold@adobe.com>,  this work  has been  contributed by
      Adobe in  collaboration with Google.   It is vastly  superior to
      the old CFF engine, and it  will replace it in the next release.
      Right  now,  it  is  still  off by  default,  and  you  have  to
      explicitly select it using  the new `hinting-engine' property of
      the cff driver:

        ...
        #include FT_MODULE_H
        #include FT_CFF_DRIVER_H

        FT_Library  library;
        int         engine = FT_CFF_HINTING_ADOBE;


        ...
        FT_Property_Set( library, "cff", "hinting-engine", &engine );

      The code has  a (mature) beta status; we encourage  all users to
      test it and report any problems.

      In case you want to activate the new CFF engine unconditionally,
      apply this patch:

--- snip ---
diff --git a/src/cff/cffobjs.c b/src/cff/cffobjs.c
index ebcf189..3f2ce6b 100644
--- a/src/cff/cffobjs.c
+++ b/src/cff/cffobjs.c
@@ -1056,7 +1056,7 @@


     /* set default property values */
-    driver->hinting_engine    = FT_CFF_HINTING_FREETYPE;
+    driver->hinting_engine    = FT_CFF_HINTING_ADOBE;
     driver->no_stem_darkening = FALSE;

     return FT_Err_Ok;
--- snip ---

    - The  macro FT_CONFIG_OPTION_OLD_INTERNALS  is no  longer set  by
      default.  In  the next  release, we  will completely  remove the
      associated code.   Please update your  programs in case  you are
      still using this macro.


  II. MISCELLANEOUS

    - The  (top-level)  `configure'  script   now  respects  the  MAKE
      environment variable  to specify a `make' binary.   For backward
      compatibility, GNUMAKE still overrides MAKE, though.

    - The `ftview'  and `ftdiff'  demo programs have  been redesigned,
      showing  more options  permanently  on the  screen, among  other
      minor improvements.

    - Using the `H'  key, it is now possible to  select the CFF engine
      in both `ftview' and `ftdiff'.

    - The new command line option `-H' for `ftbench' selects the Adobe
      CFF engine.

    - It is  now possible  to directly select  the LCD  rendering mode
      with the keys `A'-`F' in  `ftview'.  The key mapping for cycling
      through LCD modes  has been changed from `K' and  `L' to `k' and
      `l', and  toggling custom LCD  filtering is no longer  mapped to
      key `F' but to key `L'.

    - In `ftdiff',  key `x' toggles  between layout modes:  Either use
      the  advance width  (this is  new and  now the  default) or  the
      bounding box information to determine line breaks.

    - For all demo  tools, the new command line option  `-v' shows the
      version.

    - For the demo tools with a GUI, the new command line options `-w'
      and `-h' select  the width and the height of  the output window,
      respectively.

    - The `ttdebug' program was broken and has been reactivated.  Note
      that this program is not compiled by default.


======================================================================

CHANGES BETWEEN 2.4.10 and 2.4.11 (2012-Dec-20)

  I. IMPORTANT BUG FIXES

    - Some vulnerabilities in the  BDF implementation have been fixed.
      Users of this font format should upgrade.


  II. IMPORTANT CHANGES

    - Subpixel  hinting support  has been  contributed by  Infinality,
      based on Greg Hitchcock's whitepaper at

        https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx

      Originally, it was a separate patch available from

        https://web.archive.org/web/20150710073951/http://www.infinality.net:80/blog/

      and which has been integrated.

      Note that  ClearType support is not  completely implemented!  In
      particular,  full support  for the  options `compatible_widths',
      `symmetrical_smoothing,  and  `bgr'  (via the  GETINFO  bytecode
      instruction) is missing.

      Activation of  subpixel hinting  support can be  controlled with
      the `TT_CONFIG_OPTION_SUBPIXEL_HINTING' configuration option; it
      is switched off by default.  This feature is still experimental;
      we welcome test reports!

    - Support for OpenType collections (OTC) has been added.

    - Pure CFF fonts within an SFNT wrapper are now supported.


  III. MISCELLANEOUS

    - Minor rendering improvements to the auto-hinter.

    - `FT_GlyphSlot_Oblique' now uses a shear angle of 12°.

    - Experimental support  to handle `property modules',  for example
      to control the  behaviour of the auto-hinter.   The API consists
      of two new functions, `FT_Property_Set' and `FT_Property_Get'.

      The code is  still subject to change and should  not be used for
      production.

    - The `ftdiff' demo program now supports UTF-8 encoded input files
      for option `-f'.

    - Using keys `r' and `R', you can now adjust the stroker radius in
      the `ftview' demo program.

    - Other, minor fixes and improvements.


======================================================================

CHANGES BETWEEN 2.4.9 and 2.4.10 (2012-Jun-15)

  I. IMPORTANT BUG FIXES

    - Incremental glyph loading as needed by ghostscript was broken.


  II. MISCELLANEOUS

    - A new  function `FT_Outline_EmboldenXY',  contributed by  Alexei
      Podtelezhnikov.

    - In the `ftview' demo program, key `e' has been replaced with `x'
      and `y' to  embolden in  the horizontal and  vertical direction,
      respectively.

    - The glyph  spacing computation  in `FT_GlyphSlot_Embolden'  (and
      similar code in `ftview') has been improved.

    - Minor  improvements to  the TrueType  bytecode  interpreter  and
      glyph loader, the auto-hinter, and the B/W rasterizer.


======================================================================

CHANGES BETWEEN 2.4.8 and 2.4.9 (2012-Mar-08)

  I. IMPORTANT BUG FIXES

    - Another round of fixes to better handle invalid fonts.   Many of
      them are vulnerabilities  (see CVE-2012-1126 up to CVE-2012-1144
      and SA48320) so all users should upgrade.


  II. MISCELLANEOUS

    - The `ENCODING -1 <n>' format of BDF fonts is now supported.

    - For BDF fonts,  support for the whole Unicode encoding range has
      been added.

    - Better TTF support for x_ppem != y_ppem.

    - `FT_Get_Advances' sometimes returned bogus values.

    - The  demo  programs  no  longer  recognize  and  handle  default
      suffixes; you now have to always specify the complete font name.

    - Better rendering and LCD mode cycling added to `ftview'.


======================================================================

CHANGES BETWEEN 2.4.7 and 2.4.8 (2011-Nov-14)

  I. IMPORTANT BUG FIXES

    - Some vulnerabilities in handling CID-keyed PostScript fonts have
      been fixed; see CVE-2011-3439.


  II. MISCELLANEOUS

    - Chris Liddell contributed a new API, `FT_Get_PS_Font_Value',  to
      retrieve most of the dictionary keys in Type 1 fonts.


======================================================================

CHANGES BETWEEN 2.4.6 and 2.4.7 (2011-Oct-18)

  I. IMPORTANT BUG FIXES

    - Some  vulnerabilities in handling Type 1 fonts  have been fixed;
      see CVE-2011-3256.


  II. MISCELLANEOUS

    - FreeType  now properly  handles ZapfDingbats  glyph names  while
      constructing a Unicode character map (for fonts which don't have
      one).


======================================================================

CHANGES BETWEEN 2.4.5 and 2.4.6 (2011-Jul-29)

  I. IMPORTANT BUG FIXES

    - For TrueType based fonts, the ascender and descender values were
      incorrect sometimes  (off by a pixel if the ppem value was not a
      multiple of 5).   Depending on the use you might now  experience
      a different  layout; the  change should  result in  better, more
      consistent line spacing.

    - Fix CVE-2011-0226  which causes a  vulnerability while  handling
      Type 1 fonts.

    - BDF fonts  containing  glyphs with negative values  for ENCODING
      were  incorrectly  rejected.  This  bug has  been introduced  in
      FreeType version 2.2.0.

    - David Bevan contributed a major revision of the FreeType stroker
      code:

      . The behaviour of FT_STROKER_LINEJOIN_BEVEL has been corrected.

      . A new  line join style,  FT_STROKER_LINEJOIN_MITER_FIXED,  has
        been introduced to support PostScript and PDF miter joins.

      . FT_STROKER_LINEJOIN_MITER_VARIABLE  has been introduced  as an
        alias for FT_STROKER_LINEJOIN_MITER.

      . Various stroking glitches has been fixed.


  II. MISCELLANEOUS

      - SFNT bitmap fonts which contain an outline glyph for `.notdef'
        only no longer set the FT_FACE_FLAG_SCALABLE flag.


======================================================================

CHANGES BETWEEN 2.4.4 and 2.4.5 (2011-Jun-25)

  I. IMPORTANT BUG FIXES

    - A rendering regression  for second-order Bézier curves  has been
      fixed, introduced in 2.4.3.


  II. IMPORTANT CHANGES

    - If autohinting  is not  explicitly disabled,  FreeType now  uses
      the autohinter if  a TrueType based font doesn't  contain native
      hints.

    - The load flag FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH  has been made
      redundant and  is simply ignored;  this means that FreeType  now
      ignores the global advance width value in TrueType fonts.


  III. MISCELLANEOUS

    - `FT_Sfnt_Table_Info' can now return the number of SFNT tables of
      a font.

    - Support for PCF files compressed with bzip2 has been contributed
      by Joel  Klinghed.  To  make this  work, the  OS must  provide a
      bzip2 library.

    - Bradley  Grainger  contributed  project  and  solution  files in
      Visual Studio 2010 format.

    - Again some fixes to better handle broken fonts.

    - Some improvements to the B/W rasterizer.

    - Fixes to the cache module to improve robustness.

    - Just  Fill Bugs contributed (experimental) code to compute  blue
      zones for CJK Ideographs, improving the alignment of  horizontal
      stems at the top or bottom edges.

    - The `ftgrid' demo program  can now display  autohinter segments,
      to be toggled on and off with key `s'.


======================================================================

CHANGES BETWEEN 2.4.3 and 2.4.4 (2010-Nov-28)

  I. IMPORTANT BUG FIXES

    - UVS support (TrueType/OpenType cmap format 14) support is fixed.
      This regression has been introduced in version 2.4.0.


  II. MISCELLANEOUS

    - Detect tricky fonts (e.g. MingLiU)  by the lengths and checksums
      of Type42-persistent subtables (`cvt ', `fpgm', and `prep') when
      a TrueType font without family name is given.  The previous fix,
      introduced in 2.4.3,  was too rigorous,  causing many  subsetted
      fonts (mainly  from PDF files) displayed badly  because FreeType
      forced  rendering with  the TrueType bytecode engine  instead of
      the autohinter.

    - Better support for 64bit platforms.

    - More fixes to improve handling of broken fonts.


======================================================================

CHANGES BETWEEN 2.4.2 and 2.4.3 (2010-Oct-03)

  I. IMPORTANT BUG FIXES

    - Fix rendering of certain cubic, S-shaped arcs.   This regression
      has been introduced in version 2.4.0.


  II. MISCELLANEOUS

    - To  fix  the  above  mentioned  rendering  issue,  a  new spline
      flattening algorithm  has been  introduced which  speeds up both
      conic and cubic arcs.

    - Handling of broken fonts has been further improved.


======================================================================

CHANGES BETWEEN 2.4.1 and 2.4.2 (2010-Aug-06)

  I. IMPORTANT BUG FIXES

    - A stack overflow in CFF Type2 CharStrings interpreter is fixed.

    - Handling Type 42 font deallocation was broken; additionally, the
      library is now more robust against malformed Type 42 fonts.


  II. MISCELLANEOUS

    - Two new functions,  `FT_Reference_Library' (in FT_MODULE_H)  and
      `FT_Reference_Face'  (in  FT_FREETYPE_H),  have  been  added  to
      simplify life-cycle management.  A counter gets initialized to 1
      at the  time an  FT_Library (or  FT_Face) structure  is created.
      The  two  new   functions  increment  the  respective   counter.
      `FT_Done_Library' and `FT_Done_Face' then only destroy a library
      or face if the counter is 1, otherwise they simply decrement the
      counter.


======================================================================

CHANGES BETWEEN 2.4.0 and 2.4.1 (2010-Jul-18)

  I. IMPORTANT CHANGES

    - A serious bug in the  CFF font module prevented  display of many
      glyphs in CFF fonts like `MinionPro-Regular.otf'.


======================================================================

CHANGES BETWEEN 2.3.12 and 2.4.0 (2010-Jul-12)

  I. IMPORTANT CHANGES

    - Since May  2010, all  patents  regarding  the TrueType  bytecode
      interpreter have expired worldwide.  Consequently, we now define
      TT_CONFIG_OPTION_BYTECODE_INTERPRETER by  default (and  undefine
      TT_CONFIG_OPTION_UNPATENTED_HINTING).

    - A new function `FT_Library_SetLcdFilterWeights' is available  to
      adjust the filter weights set by `FT_Library_SetLcdFilter'.


  II. MISCELLANEOUS

    - Thanks to many reports from Robert Święcki, FreeType's stability
      in handling broken or damaged fonts is much improved.

    - Support  for LCD  filter  control has  been  added to  the  demo
      programs `ftdiff' and `ftview'.


======================================================================

CHANGES BETWEEN 2.3.11 and 2.3.12

  I. IMPORTANT CHANGES

    - For  `FT_Open_Face',  new  parameters  are  available  to ignore
      preferred family names: FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY and
      FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY.


  II. MISCELLANEOUS

    - Support  for  incremental  font  loading  (controlled  with  the
      FT_CONFIG_OPTION_INCREMENTAL macro) is now active by default.

    - Better support for vertical metrics.

    - Various minor bug fixes.


======================================================================

CHANGES BETWEEN 2.3.10 and 2.3.11

  I. IMPORTANT BUG FIXES

    - Version 2.3.10 broke PCF support.


======================================================================

CHANGES BETWEEN 2.3.10 and 2.3.9

  I. IMPORTANT BUG FIXES

    - If all  ASCII digits in a  font have the  same (unscaled) width,
      the autohinter respects this and won't change it.

    - TrueType fonts  are now  rasterized correctly  if the horizontal
      and vertical resolution differ.

    - Type 1 fonts are now handled with increased precision internally
      to avoid serious rounding issues if non-integral coordinates are
      encountered.

    - Horizontally  condensed CFF  fonts (using the font  matrix) were
      rendered  incorrectly.   This  bug  has  been  introduced  after
      release 2.3.5.


  II. IMPORTANT CHANGES

    - Support for the SFNT cmap 13 table format (as defined by the new
      OpenType 1.6 specification) has been added.

    - B/W rasterization  of well-hinted TrueType  fonts at small sizes
      has been greatly improved.

    - Calculation  of  vertical  metrics in  OpenType  fonts has  been
      improved.


  III. MISCELLANEOUS

    - It  is now  possible to  change  the emboldening  factor in  the
      `ftview' demo program with keys `e' and `E'.

    - It is  now possible  to change the  slant value in  the `ftview'
      demo program with keys `s' and `S'.

    - The  5-levels  grayscale  mode of  the `ftraster'  module (which
      FreeType doesn't use by default) was broken since version 2.3.0.

    - Compilation of the  `ftgrays' and `ftraster' modules  was broken
      in stand-alone mode.

    - Various fixes for compilation on 64bit and 16bit architectures.


======================================================================

CHANGES BETWEEN 2.3.9 and 2.3.8

  I. IMPORTANT BUG FIXES

    - Very unfortunately, FreeType 2.3.8 contained a change that broke
      its  official ABI.  The  end result  is  that programs  compiled
      against previous versions of the library, but dynamically linked
      to  2.3.8 can  experience  memory corruption  if  they call  the
      `FT_Get_PS_Font_Info' function.

      We recommend all users to  upgrade to 2.3.9 as soon as possible,
      or to downgrade to a previous  release of the library if this is
      not an option.

      The  origin of the  bug is  that a  new field  was added  to the
      publicly  defined  `PS_FontInfoRec'  structure.   Unfortunately,
      objects of this  type can be stack or  heap allocated by callers
      of   `FT_Get_PS_Font_Info',  resulting   in   a  memory   buffer
      overwrite with its implementation in 2.3.8.

      If  you want to  know whether  your code  is vulnerable  to this
      issue,  simply  search  for  the  substrings  `PS_FontInfo'  and
      `PS_Font_Info' in your source code.  If none is found, your code
      is safe and is not affected.

      The FreeType team apologizes for the problem.

    - The POSIX support  of MacOS resource-fork fonts  (Suitcase fonts
      and LaserWriter Type1 PostScript fonts) was broken in 2.3.8.  If
      FreeType2 is built without Carbon framework, these fonts are not
      handled correctly.  Version 2.3.7 didn't have this bug.

    - `FT_Get_Advance' (and `FT_Get_Advances') returned bad values for
      almost all font formats except TrueType fonts.

    - Fix a bug  in the SFNT  kerning table  loader/parser which could
      crash the engine if certain malformed tables were encountered.

    - Composite SFNT bitmaps are now handled correctly.


  II. IMPORTANT CHANGES

    - The   new  functions   `FT_Get_CID_Is_Internally_CID_keyed'  and
      `FT_Get_CID_From_Glyph_Index'  can be  used to  access CID-keyed
      CFF fonts  via CID  values.  This code  has been  contributed by
      Michael Toftdal.


  III. MISCELLANEOUS

    - `FT_Outline_Get_InsideBorder'  returns   FT_STROKER_BORDER_RIGHT
      for empty outlines.  This was incorrectly documented.

    - The `ftview' demo program now supports UTF-8 encoded strings.


======================================================================

CHANGES BETWEEN 2.3.8 and 2.3.7

  I. IMPORTANT BUG FIXES

    - CID-keyed fonts in an SFNT wrapper were not handled correctly.

    - The smooth renderer produced truncated images (on the right) for
      outline parts with negative horizontal values.  Most fonts don't
      contain outlines left  to the y coordinate axis, but  the effect
      was very noticeable for outlines processed with FT_Glyph_Stroke,
      using thick strokes.

    - `FT_Get_TrueType_Engine_Type'  returned a  wrong  value if  both
      configuration  macros  TT_CONFIG_OPTION_BYTECODE_INTERPRETER and
      TT_CONFIG_OPTION_UNPATENTED_HINTING were defined.

    - The  `face_index'  field  in   the  `FT_Face'  structure  wasn't
      initialized properly after calling FT_Open_Face and friends with
      a positive face index for CFFs,  WinFNTs, and, most importantly,
      for TrueType Collections (TTCs).


  II. IMPORTANT CHANGES

    - Rudimentary support for Type 1  fonts and CID-keyed Type 1 fonts
      in an SFNT wrapper has been  added -- such fonts are used on the
      Mac.  The core  SFNT tables `TYP1' and `CID '  are passed to the
      PS Type 1  and CID-keyed PS font drivers;  other tables (`ALMX',
      `BBOX', etc.) are not supported yet.

    - A  new interface  to extract  advance values  of glyphs  without
      loading their outlines has been added.  The functions are called
      `FT_Get_Advance' and `FT_Get_Advances'; they are defined in file
      `ftadvanc.h' (to be accessed as FT_ADVANCES_H).

    - A new function `FT_Get_FSType_Flags' (in FT_FREETYPE_H) has been
      contributed  by   David  Bevan  to  access   the  embedding  and
      subsetting restriction information of fonts.


  III. MISCELLANEOUS

    - FT_MulFix is now an inlined function; by default, assembler code
      is provided for x86 and ARM.  See FT_CONFIG_OPTION_INLINE_MULFIX
      and FT_CONFIG_OPTION_NO_ASSEMBLER (in ftoption.h) for more.

    - The handling of `tricky' fonts  (this is, fonts which don't work
      with the  autohinter, needing the font  format's hinting engine)
      has been generalized and changed slightly:

      . A new  face flag  FT_FACE_FLAG_TRICKY indicates that  the font
        format's  hinting engine is  necessary for  correct rendering.
        The macro FT_IS_TRICKY can be used to check this flag.

      . FT_LOAD_NO_HINTING is now ignored for tricky fonts.  To really
        force  raw  loading  of  such fonts  (without  hinting),  both
        FT_LOAD_NO_HINTING  and FT_LOAD_NO_AUTOHINT  must  be used  --
        this is something which you probably never want to do.

      . Tricky  TrueType fonts  always use  the  bytecode interpreter,
        either the patented or unpatented version.

    - The  function  `FT_GlyphSlot_Own_Bitmap'  has  been  moved  from
      FT_SYNTHESIS_H to FT_BITMAP_H; it  is now part of the `official'
      API.   (The functions  in  FT_SYNTHESIS_H are  still subject  to
      change, however.)

    - In the  `ftdiff'  demo  program you  can now  toggle the  use of
      FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH with key `a'.


======================================================================

CHANGES BETWEEN 2.3.7 and 2.3.6

  I. IMPORTANT BUG FIXES

    - If the library  was compiled on an i386  platform using gcc, and
      compiler  option -O3 was  given, `FT_MulFix'  sometimes returned
      incorrect  results   which  could  have   caused  problems  with
      `FT_Request_Metrics'   and  `FT_Select_Metrics',   returning  an
      incorrect descender size.

    - Pure CFFs without  subfonts were scaled incorrectly  if the font
      matrix  was  non-standard.  This  bug  has  been  introduced  in
      version 2.3.6.

    - The  `style_name'  field  in  the  `FT_FaceRec'  structure often
      contained  a wrong  value for  Type 1  fonts.  This misbehaviour
      has been  introduced  in  version  2.3.6  while  trying  to  fix
      another   problem.   [Note,  however,   that   this   value   is
      informative only  since  the  used  algorithm to  extract  it is
      very simplistic.]


  II. IMPORTANT CHANGES

    - Two      new      macros,      FT_OUTLINE_SMART_DROPOUTS     and
      FT_OUTLINE_EXCLUDE_STUBS,  have been introduced.   Together with
      FT_OUTLINE_IGNORE_DROPOUTS (which  was ignored previously) it is
      now possible to control the dropout mode  of the `raster' module
      (for B&W rasterization),   using  the   `flags'  field   in  the
      `FT_Outline' structure.

    - The TrueType bytecode interpreter now passes the dropout mode to
      the B&W rasterizer.  This greatly increases the output for small
      ppem values of many fonts like `pala.ttf'.


======================================================================

CHANGES BETWEEN 2.3.6 and 2.3.5

  I. IMPORTANT BUG FIXES

    - A  bunch of  potential security  problems have  been found.  All
      users should update.

    - Microsoft  Unicode  cmaps  in  TrueType  fonts  are  now  always
      preferred over Apple cmaps.  This is not a bug per se, but there
      exist some buggy  fonts created for MS which  have broken  Apple
      cmaps.  This affects  only the automatic  selection of FreeType;
      it's always possible to manually select an Apple Unicode cmap if
      desired.

    - Many bug fixes to the TrueType bytecode interpreter.

    - Improved Mac support.

    - Subsetted CID-keyed CFFs are now supported correctly.

    - CID-keyed CFFs with subfonts which are scaled in a  non-standard
      way are now handled correctly.

    - A call to FT_Open_Face with `face_index' < 0 crashed FreeType if
      the font was a Windows (bitmap) FNT/FON.


  II. IMPORTANT CHANGES

    - The new function `FT_Get_CID_Registry_Ordering_Supplement' gives
      access to  those fields in a CID-keyed font.  The code  has been
      contributed by Derek Clegg.

    - George Williams  contributed  code  to validate  the new  `MATH'
      OpenType  table (within  the `otvalid'  module).  The  `ftvalid'
      demo program has been extended accordingly.

    - An API for cmap 14 support  (for Unicode Variant Selectors, UVS)
      has been contributed by George Williams.

    - A new face flag FT_FACE_FLAG_CID_KEYED has been added,  together
      with a macro FT_IS_CID_KEYED which evaluates to 1 if the font is
      CID-keyed.


  III. MISCELLANEOUS

    - Build support for symbian has been contributed.

    - Better WGL4 glyph name support, contributed by Sergey Tolstov.

    - Debugging output of the  various FT_TRACEX macros is now sent to
      stderr.

    - The `ftview' demo program now provides artificial slanting too.

    - The `ftvalid' demo  program has a new  option `-f' to select the
      font index.


======================================================================

CHANGES BETWEEN 2.3.5 and 2.3.4

  I. IMPORTANT BUG FIXES

    - Some subglyphs in TrueType fonts were handled incorrectly due to
      a missing graphics state reinitialization.

    - Large .Z files  (as distributed with some X11  packages) weren't
      handled correctly, making FreeType increase the heap stack in an
      endless loop.

    - A large  number of  bugs have  been fixed  to avoid  crashes and
      endless loops with invalid fonts.


  II. IMPORTANT CHANGES

    - The  two new  cache functions  `FTC_ImageCache_LookupScaler' and
      `FTC_SBit_Cache_LookupScaler' have been added to allow lookup of
      glyphs using an  `FTC_Scaler' object;  this makes it possible to
      use fractional pixel sizes in the cache.  The demo programs have
      been updated accordingly to use this feature.

    - A new API  `FT_Get_CMap_Format' has been added to  get the  cmap
      format  of a  TrueType font.   This  is useful  in handling  PDF
      files.  The code has been contributed by Derek Clegg.

    - The  auto-hinter  now  produces  better  output  by  default for
      non-Latin scripts  like Indic.   This was done by  using the CJK
      hinting module  as the default instead of the Latin one.  Thanks
      to Rahul Bhalerao for this suggestion.

    - A new API `FT_Face_CheckTrueTypePatents'  has been added to find
      out  whether  a  given  TrueType  font  uses  patented  bytecode
      instructions.   The  `ft2demos' bundle  contains a  new  program
      called `ftpatchk' which demonstrates its usage.

    - A  new  API  `FT_Face_SetUnpatentedHinting'  has  been  added to
      enable or disable the unpatented hinter.

    - Support for Windows FON files in PE format  has been contributed
      by Dmitry Timoshkov.


  III. MISCELLANEOUS

    - Vincent Richomme contributed Visual C++ project files for Pocket
      PCs.


======================================================================

CHANGES BETWEEN 2.3.4 and 2.3.3

  I. IMPORTANT BUG FIXES

    - A serious  bug  in  the  handling  of bitmap  fonts (and  bitmap
      strikes of outline fonts) has been introduced in 2.3.3.


======================================================================

CHANGES BETWEEN 2.3.3 and 2.3.2

  I. IMPORTANT BUG FIXES

    - Remove a serious regression in the TrueType bytecode interpreter
      that was introduced  in version 2.3.2.  Note that  this does not
      disable  the  improvements  introduced  to  the  interpreter  in
      version 2.3.2,  only some ill  cases that occurred  with certain
      fonts (though a few popular ones).

    - The auto-hinter now  ignores single-point contours for computing
      blue zones.   This bug  created `wavy' baselines  when rendering
      text  with  various  fonts  that  use these  contours  to  model
      mark-attach points  (these are points that  are never rasterized
      and are placed outside of the glyph's real outline).

    - The `rsb_delta' and `lsb_delta' glyph slot fields are now set to
      zero for mono-spaced fonts.  Otherwise code that uses them would
      essentially ruin the fixed-advance property.

    - Fix  CVE-2007-1351 which  can  cause an  integer overflow  while
      parsing  BDF fonts,  leading to  a potentially  exploitable heap
      overflow condition.


  II. MISCELLANEOUS

    - Fixed compilation issues on some 64-bit platforms (see ChangeLog
      for details).

    - A new demo  program `ftdiff' has been added  to compare TrueType
      hinting, FreeType's auto  hinting, and rendering without hinting
      in three columns.


======================================================================

CHANGES BETWEEN 2.3.2 and 2.3.1

  I. IMPORTANT BUG FIXES

    - FreeType  returned incorrect  kerning information  from TrueType
      fonts when the bytecode  interpreter was enabled.  This happened
      due to a typo introduced in version 2.3.0.

    - Negative  kerning  values  from   PFM  files  are  now  reported
      correctly  (they were read  as 16-bit  unsigned values  from the
      file).

    - Fixed  a small  memory leak  when `FT_Init_FreeType'  failed for
      some reason.

    - The Postscript hinter placed and sized very thin and ghost stems
      incorrectly.

    - The TrueType bytecode  interpreter has been fixed to  get rid of
      most of the  rare differences seen in comparison  to the Windows
      font loader.


  II. IMPORTANT CHANGES

    - The auto-hinter  now better deals  with serifs and  corner cases
      (e.g.,  glyph '9'  in Arial  at 9pt,  96dpi).  It  also improves
      spacing  adjustments and doesn't  change widths  for non-spacing
      glyphs.

    - Many   Mac-specific   functions   are  deprecated   (but   still
      available);  modern replacements  have been  provided  for them.
      See the documentation in file `ftmac.h'.


======================================================================

CHANGES BETWEEN 2.3.1 and 2.3.0

  I. IMPORTANT BUG FIXES

    - The TrueType interpreter sometimes returned incorrect horizontal
      metrics due to a bug in the handling of the SHZ instruction.

    - A typo  in  a  security  check  introduced  after  version 2.2.1
      prevented FreeType to render some glyphs in CFF fonts.


======================================================================

CHANGES BETWEEN 2.3.0 and 2.2.1

  I. IMPORTANT BUG FIXES

    - The  PCF font  loader  is  now much  more  robust while  loading
      malformed font files.

    - Various memory leaks have been found and fixed.

    - The TrueType name loader now deals properly with some fonts that
      encode their  names in UTF-16 (the specification  was vague, and
      the code incorrectly assumed UCS-4).

    - Fixed the TrueType bytecode  loader to deal properly with subtle
      monochrome/gray  issues  when   scaling  the  CVT.   Some  fonts
      exhibited bad rendering artifacts otherwise.

    - `FT_GlyphSlot_Embolden' now  supports vertical layouts correctly
      (it mangled the vertical advance height).

    - Fixed byte  endian issues  of `ftmac.c' to  support Mac OS  X on
      i386.

    - The  PFR  font loader  no  longer  erroneously  tags font  files
      without any outlines as FT_FACE_FLAG_SCALABLE.


  II. NEW API FUNCTIONS

    - `FT_Library_SetLcdFilter' allows you  to select a special filter
      to be  applied to the bitmaps generated  by `FT_Render_Glyph' if
      one of the FT_RENDER_MODE_LCD and FT_RENDER_MODE_LCD_V modes has
      been  selected.  This filter  is used  to reduce  color fringes;
      several  settings are  available  through the  FT_LCD_FILTER_XXX
      enumeration.

      Its  declaration   and  documentation  can  be   found  in  file
      `include/freetype/ftlcdfil.h'   (to  be   accessed   with  macro
      FT_LCD_FILTER_H).

      *IMPORTANT*:     This      function     returns     an     error
      (FT_Err_Unimplemented_Feature) in default  builds of the library
      for patent reasons.  See below.

    - `FT_Get_Gasp'  allows you  to query  the flags  of  the TrueType
      `gasp' table for  a given character pixel size.   This is useful
      to duplicate  the text rendering  of MS Windows when  the native
      bytecode  interpreter is  enabled (which  isn't the  default for
      other patent reasons).

      Its  declaration   and  documentation  can  be   found  in  file
      `include/freetype/ftgasp.h'   (to   be   accessed   with   macro
      FT_GASP_H).


  III. IMPORTANT CHANGES

    - The auto-hinter has been tuned a lot to improve its results with
      serif fonts, resulting in much better font rendering of many web
      pages.

    - The unpatented  hinter is now part  of the default  build of the
      library; we  have added  code to automatically  support `tricky'
      fonts that need it.

      This means  that FreeType should `just work'  with certain Asian
      fonts, like  MingLiU, which cannot properly be  loaded without a
      bytecode interpreter,  but which fortunately  do not use  any of
      the patented  bytecode opcodes.  We detect these  fonts by name,
      so please  report any font file  that doesn't seem  to work with
      FreeType, and  we shall do what we  can to support it  in a next
      release.

      Note  that  the API  hasn't  changed,  so  you can  still  force
      unpatented hinting with a special parameter to `FT_Open_Face' as
      well.  This  might be useful in  same cases; for  example, a PDF
      reader might present  a user option to activate  it to deal with
      certain  `tricky'   embedded  fonts  which   cannot  be  clearly
      identified.

      If you are  a developer for embedded systems,  you might want to
      *disable*  the   feature  to  save  code   space  by  undefining
      TT_CONFIG_OPTION_UNPATENTED_HINTING in file `ftoption.h'.

    - LCD-optimized rendering is now  *disabled* in all default builds
      of  the  library,  mainly   due  to  patent  issues.   For  more
      information see:

      https://lists.gnu.org/archive/html/freetype/2006-09/msg00064.html

      A  new  configuration macro  FT_CONFIG_OPTION_SUBPIXEL_RENDERING
      has been introduced in  `ftoption.h'; manually define it in this
      file if you want to re-enable the feature.

      The  change only  affects the  implementation, not  the FreeType
      API.  This means that clients don't need to be modified, because
      the library still generates  LCD decimated bitmaps, but with the
      added constraint that R=G=B on each triplet.

      The  displayed result  should  be equal  to normal  anti-aliased
      rendering.

      Additionally,  if   FT_CONFIG_OPTION_SUBPIXEL_RENDERING  is  not
      defined, the new  `FT_Library_SetLcdFilter' function returns the
      FT_Err_Unimplemented_Feature error code.

    - Some computation bugs in  the TrueType bytecode interpreter were
      found,  which  allow us  to  get rid  of  very  subtle and  rare
      differences we had experienced with the Windows renderer.

    - It is now possible to cross-compile the library easily.  See the
      file `docs/INSTALL.CROSS' for details.

    - The file `src/base/ftmac.c' now contains code for Mac OS X only;
      its  deprecated function  `FT_GetFile_From_Mac_Font_Name' always
      returns an  error even if the QuickDraw  framework is available.
      The previous version has been moved to `builds/mac/ftmac.c'.

      Selecting  configure option `--with-quickdraw-carbon'  makes the
      build process use the original `ftmac.c' file instead of the Mac
      OS X-only version.


  IV. MISCELLANEOUS

    - Various performance and memory footprint optimizations have been
      performed on  the TrueType and CFF font  loaders, sometimes with
      very drastic  benefits (e.g., the  TrueType loader is  now about
      25% faster;  FreeType should use  less heap memory  under nearly
      all conditions).

    - The anti-aliased rasterizer has been optimized and is now 15% to
      25%  percent  faster than  in  previous  versions, depending  on
      content.

    - The Type 1 loader has been improved; as an example, it now skips
      top-level dictionaries properly.

    - Better support for Mac  fonts on POSIX systems, plus compilation
      fixes for Mac OS X on ppc64 where `ftmac.c' cannot be built.

    - Configuration  without `--with-old-mac-fonts'  does  not include
      `ftmac.c' (this was the behaviour in FreeType version 2.1.10).

    - The TrueTypeGX validator (gxvalid) checks the order of glyph IDs
      in the kern table.


======================================================================

CHANGES BETWEEN 2.2.1 and 2.2

  I. IMPORTANT BUG FIXES

    - Various integer overflows have been fixed.

    - PFB fonts with MacOS resource fork weren't  handled correctly on
      non-MacOS platforms.


======================================================================

CHANGES BETWEEN 2.2 and 2.1.10

(not released officially)

  I. IMPORTANT BUG FIXES

    - Vertical metrics for SFNT fonts were incorrect sometimes.

    - The FT_HAS_KERNING macro always returned 0.

    - CFF OpenType  fonts didn't  return correct vertical  metrics for
      glyphs with outlines.

    - If FreeType was compiled without hinters, all font formats based
      on PS outlines weren't scaled correctly.


  II. IMPORTANT CHANGES

    - Version 2.2 no longer exposes its internals, this is, the header
      files  located in  the `include/freetype/internal'  directory of
      the source package are not  copied anymore by the `make install'
      command.  Consequently, a number of rogue clients which directly
      access  FreeType's  internal   functions  and  structures  won't
      compile without modification.

      We provide  patches for  most of those  rogue clients.   See the
      following page for more information:

        https://www.freetype.org/freetype2/patches/rogue-patches.html

      Note that, as  a convenience to our Unix  desktop users, version
      2.2 is *binary* compatible with FreeType 2.1.7, which means that
      installing this  release on  an existing distribution  shall not
      break any working desktop.

    - FreeType's build  mechanism has been redesigned.   With GNU make
      it  is  now  sufficient  in   most  cases  to  edit  two  files:
      `modules.cfg',  to  select   the  library  components,  and  the
      configuration  file  `include/freetype/config/ftoption.h' (which
      can be copied to the objects directory).  Removing unused module
      directories   to    prevent   its   compilation    and   editing
      `include/freetype/config/ftmodule.h' is no longer necessary.

    - The  LIGHT  hinting algorithm  produces  more pleasant  results.
      Also, using the  FT_LOAD_TARGET_LIGHT flags within FT_Load_Glyph
      always forces auto-hinting, as a special exception.  This allows
      you to experiment with it  even if you have enabled the TrueType
      bytecode interpreter in your build.

    - The auto hinter now employs a new algorithm for CJK fonts, based
      on Akito  Hirai's patch.   Note that this  only works  for fonts
      with a Unicode charmap at the moment.

    - The following callback function  types have changed slightly (by
      adding the `const' keyword where appropriate):

        FT_Outline_MoveToFunc
        FT_Outline_LineToFunc
        FT_Outline_ConicToFunc
        FT_Outline_CubicToFunc
        FT_SpanFunc
        FT_Raster_RenderFunc

        FT_Glyph_TransformFunc
        FT_Renderer_RenderFunc
        FT_Renderer_TransformFunc

      Note that this doesn't affect binary backward compatibility.

    - On MacOS,  new APIs have  been added as replacements  for legacy
      APIs:  `FT_New_Face_From_FSRef'  for  `FT_New_Face_From_FSSpec',
      and              `FT_GetFile_From_Mac_ATS_Name'              for
      `FT_GetFile_From_Mac_Name'.  Legacy APIs are still available, if
      FreeType is built without disabling them.

    - A new  API `FT_Select_Size'  has been added  to select  a bitmap
      strike  by its  index.   Code using  other  functions to  select
      bitmap strikes should be updated to use this function.

    - A  new API  `FT_Get_SubGlyph_Info'  has been  added to  retrieve
      subglyph data.  This can be  used by rogue clients which used to
      access the internal headers to get the corresponding data.

    - In 2.1.10, the behaviour of `FT_Set_Pixel_Sizes' was changed for
      BDF/PCF fonts,  and only  for them.  This  causes inconsistency.
      In this release,  we undo the change.  The  intent of the change
      in 2.1.10  is to allow  size selection through  real dimensions,
      which can now be done through `FT_Request_Size'.

    - Some security  issues were discovered  and fixed in the  CFF and
      Type  1 loader, causing  crashes of  FreeType by  malformed font
      files.


  III. MISCELLANEOUS

    - The documentation  for FT_LOAD_TARGET_XXX and FT_RENDER_MODE_XXX
      values now better reflects its usage and differences: One set is
      used to specify the hinting algorithm, the other to specify  the
      pixel rendering mode.

    - `FT_New_Face' and `FT_New_Face_From_FSSpec' in ftmac.c have been
      changed to count supported scalable faces (sfnt, LWFN) only, and
      to  return the  number of  available faces  via face->num_faces.
      Unsupported bitmap faces (fbit, NFNT) are ignored.

    - builds/unix/configure  has been  improved for  MacOS X.   It now
      automatically checks available  functions in Carbon library, and
      prepare to use newest  functions by default.  Options to specify
      the  dependencies of  each Carbon  APIs (FSSpec,  FSRef, old/new
      QuickDraw, ATS)  are available too.  By manual  disabling of all
      QuickDraw   functionality,  FreeType   can   be  built   without
      `deprecated   function'   warnings    on   MacOS   10.4.x,   but
      FT_GetFile_Mac_Name  in  ftmac.c  then  is changed  to  a  dummy
      function, and returns an `unimplemented' error.  For details see
      builds/mac/README.

    - SFNT cmap handling has been  improved, mainly to run much faster
      with CJK fonts.

    - A   new  function   `FT_Get_TrueType_Engine_Type   (declared  in
      `FT_MODULE_H')  is  provided  to  determine the  status  of  the
      TrueType   bytecode  interpreter   compiled  into   the  library
      (patented, unpatented, unimplemented).

    - Vertical metrics of glyphs are  synthesized if the font does not
      provide such information.  You can tell whether  the metrics are
      synthesized or not by checking the FT_FACE_FLAG_VERTICAL flag of
      the face.

    - The demo programs  `ftview' and  `ftstring' have been  rewritten
      for better readability.   `ftview' has a new switch `-p' to test
      FT_New_Memory_Face (instead of FT_New_Face).

    - FreeType now honours bit 1 in the `head' table of TrueType fonts
      (meaning `left sidebearing point at x=0').  This helps with some
      buggy fonts.

    - Rudimentary support for Adobe's new `SING Glyphlet' format.  See

        https://www.adobe.com/content/dam/acom/en/devnet/font/pdfs/5148.SING_Tutorial.pdf

      for more information.

    - The `ftdump'  program from the `ft2demos' bundle  now shows some
      information about charmaps.  It  also supports a new switch `-v'
      to increase verbosity.

    - Better AFM support.  This includes track kerning support.


======================================================================

CHANGES BETWEEN 2.1.10 and 2.1.9

  I. IMPORTANT BUG FIXES

    - The size comparison for BDF and PCF files could fail sometimes.

    - Some  CFF files  were still not  loaded  correctly.   Patch from
      Derek Noonburg.

    - The stroker still had some serious bugs.

    - Boris  Letocha  fixed a  bug in  the  TrueType interpreter:  The
      NPUSHW instruction wasn't skipped correctly in IF clauses.  Some
      fonts like `Helvetica 75 Bold' failed.

    - Another  serious  bug  in  handling  TrueType hints  caused many
      distortions.  It has been introduced in version 2.1.8, and it is
      highly recommended to upgrade.

    - FreeType didn't properly parse empty Type 1 glyphs.

    - An unbound dynamic buffer growth was fixed in the PFR loader.

    - Several bugs have been fixed in the cache sub-system.

    - FreeType behaved incorrectly when resizing two distinct but very
      close character pixel sizes through `FT_Set_Char_Size' (Savannah
      bug #12263).

    - The auto-hinter didn't work properly for fonts without a Unicode
      charmap -- it even refused to load the glyphs.


  II. IMPORTANT CHANGES

    - Many fixes have been applied to drastically reduce the amount of
      heap   memory   used   by   FreeType,   especially   when  using
      memory-mapped font files  (which is the default on Unix  systems
      which support them).

    - The auto-hinter  has been replaced with a new module, called the
      `auto-fitter'.  It consumes  less memory  than its  predecessor,
      and it is  prepared to support non-latin scripts  better in next
      releases.

    - George Williams  contributed code to read  kerning data from PFM
      files.

    - FreeType   now   uses    the   TT_NAME_ID_PREFERRED_FAMILY   and
      TT_NAME_ID_PREFERRED_SUBFAMILY   strings   (if   available)  for
      setting  family  and  style in SFNT  fonts  (patch from Kornfeld
      Eliyahu Peter).

    - A  new  API `FT_Sfnt_Table_Info'  (in FT_TRUETYPE_TABLES_H)  has
      been added to retrieve name and size information of SFNT tables.

    - A new API `FT_OpenType_Validate' (in FT_OPENTYPE_VALIDATE_H) has
      been added to validate OpenType tables  (BASE, GDEF, GPOS, GSUB,
      JSTF).   After validation  it is  no longer  necessary to  check
      for errors in those tables while accessing them.

      Note that  this module might  be moved to another library in the
      future  to avoid  a tight  dependency between  FreeType and  the
      OpenType specification.

    - A new API in FT_BITMAP_H  (`FT_Bitmap_New', `FT_Bitmap_Convert',
      `FT_Bitmap_Copy',  `FT_Bitmap_Embolden',  `FT_Bitmap_Done')  has
      been added.   Its  use is  to convert an  FT_Bitmap structure in
      1bpp, 2bpp,  4bpp, or 8bpp  format into  another 8bpp FT_Bitmap,
      probably using a different pitch, and to further manipulate it.

    - A new  API `FT_Outline_Embolden'  (in FT_OUTLINE_H) gives  finer
      control how outlines are emboldened.

    - `FT_GlyphSlot_Embolden' (in FT_SYNTHESIS_H)  now handles bitmaps
      also (code contributed  by Chia I Wu).  Note that this  function
      is still experimental and may be replaced with a better API.

    - The method  how BDF and PCF  bitmap fonts  are accessed has been
      refined.   Formerly,   FT_Set_Pixel_Sizes  and  FT_Set_Char_Size
      were  synonyms in  FreeType's  BDF and PCF interface.  This  has
      changed now.  FT_Set_Pixel_Sizes  should be  used to  select the
      actual  font dimensions  (the `strike',  which is the sum of the
      `FONT_ASCENT'    and    `FONT_DESCENT'    properties),     while
      FT_Set_Char_Size  selects  the  `nominal' size  (the `PIXELSIZE'
      property).  In both functions, the width parameter is ignored.


  III. MISCELLANEOUS

    - The BDF driver  no longer converts  all returned bitmaps  with a
      depth of 2bpp or 4bpp to a depth of 8bpp.  The documentation has
      not  mentioned  this  explicitly,  but  implementors  might have
      relied on this after looking into the source files.

    - A new option `--ftversion' has been  added to freetype-config to
      return the FreeType version.

    - The  memory  debugger  has  been  updated   to  dump  allocation
      statistics on  all allocation  sources in the library.   This is
      useful to  spot greedy  allocations when  loading and processing
      fonts.

    - We removed a huge array of constant pointers to constant strings
      in the `psnames' module.   The problem was that  compilations in
      PIC mode (i.e.,  when generating a  Unix shared object/dll)  put
      the array  into the non-shared  writable section of  the library
      since absolute pointers are not relocatable by nature.

      This reduces the memory consumption by approximately 16KByte per
      process linked  to FreeType.   We now also store  the array in a
      compressed form (as a trie) which saves about 20KByte of code as
      well.

    - Kirill  Smelkov provided  patches to make  src/raster/ftraster.c
      compile stand-alone again.


======================================================================

CHANGES BETWEEN 2.1.9 and 2.1.8

  I. IMPORTANT BUG FIXES

    - The function  `FT_Get_CharMap_Index' was only declared,  without
      any  real  code.   For  consistency,  it  has  been  renamed  to
      `FT_Get_Charmap_Index'.   (This function is needed  to implement
      cmap caches.)

    - `FT_Outline_Get_BBox'  sometimes returned  incorrect values  for
      conic outlines (e.g., for TrueType fonts).

    - Handling of `bhed' table has been fixed.

    - The TrueType driver with enabled byte code interpreter sometimes
      returned artifacts due to incorrect rounding.  This bug has been
      introduced after version 2.1.4.

    - The BDF driver dropped the last glyph in the font.

    - The BDF driver now uses the DEFAULT_CHAR property (if available)
      to select a glyph shape for the undefined glyph.

    - The stroker failed for closed outlines and single points.


  II. IMPORTANT CHANGES

    - George  Williams   contributed  code  to   handle  Apple's  font
      distortion technology found in GX fonts (`avar', `cvar', `fvar',
      and `gvar' tables;  the Multiple Masters  API has been  slightly
      extended to cope with the new functionality).

    - The `FT_GlyphSlotRec' structure has been extended:  The elements
      `lsb_delta' and  `rsb_delta' give the difference  between hinted
      and  unhinted  left and right  side bearings  if autohinting  is
      active.  Using those values can improve the inter-letter spacing
      considerably.   See the documentation of  `FT_GlyphSlotRec'  and
      the `ftstring' demo program how to use it.

    - Loading TrueType and Type 1 fonts has been made much faster.

    - The stroker is  no longer experimental (but the  cache subsystem
      still is).


  III. MISCELLANEOUS

    - A new  documentation file  `formats.txt' describes various  font
      formats supported (and not supported) by FreeType.


======================================================================

CHANGES BETWEEN 2.1.8 and 2.1.7

  I. IMPORTANT BUG FIXES

    - The native  TrueType hinter contained some  bugs which prevented
      some fonts to be rendered correctly, most notably Legendum.otf.

    - The PostScript hinter now produces improved results.

    - The  linear advance  width  and height  values were  incorrectly
      rounded,  making  them virtually  unusable  if  not loaded  with
      FT_LOAD_LINEAR_DESIGN.

    - Indexing CID-keyed CFF fonts is  now working: The glyph index is
      correctly  treated as a  CID, similar  to FreeType's  CID driver
      module.  Note that CID CMap support is still missing.

    - The FT_FACE_FLAG_GLYPH_NAMES flag  is now  set correctly for all
      font formats.

    - Some subsetted Type 1  fonts weren't parsed correctly.  This bug
      has been introduced in 2.1.7.  In summary, the Type 1 parser has
      become more robust.

    - Non-decimal numbers weren't parsed correctly in PS fonts.

    - The WinFNT driver now correctly reports FT_ENCODING_NONE for all
      but one encoding.  Use  the new FT_WinFNT_ID_XXX values together
      with `FT_Get_WinFNT_Header' to get the WinFNT charset ID.

    - The descender metrics (face->size->metrics.descender) for WinFNT
      bitmap fonts had the wrong sign.

    - The (emulated) `seac' support for CFF fonts was broken.

    - The `flex' operator didn't work for CFF fonts.

    - PS glyphs  which  use  the   `hintmask'  operator  haven't  been
      rendered correctly in some cases.

    - Metrics for BDF and PCF bitmap font formats have been fixed.

    - Autohinting  is now  disabled for  glyphs  which  are vertically
      distorted  or mirrored  (using a  transformation matrix).   This
      fixes a bug which produced zero-height glyphs.

    - The   `freetype-config'   script   now  handles   --prefix   and
      --exec-prefix correctly; it also  returns the proper --rpath (or
      -R) value if FreeType has been built as a shared library.


  II. IMPORTANT CHANGES

    - Both  PCF  and BDF  drivers  now  handle  the SETWIDTH_NAME  and
      ADD_STYLE_NAME    properties.     Values    are   appended    to
      face->style_name; example: `Bold SemiCondensed'.

    - The PCF driver now handles bitmap  fonts compressed with the LZW
      algorithm (extension .pcf.Z, compressed with `compress').

    - A  new  API   function  `FT_Get_CMap_Language_ID'  (declared  in
      `tttables.h')  is  available  to   get  the  language  ID  of  a
      TrueType/SFNT cmap.

    - The hexadecimal format of  data after the `StartData' command in
      CID-keyed Type 1 fonts is now supported.  While this can't occur
      in  file-based   fonts,  it  can   happen  in  document-embedded
      resources of PostScript documents.

    - Embedded bitmaps in SFNT-based CFF fonts are now supported.

    - A simple  API is  now available  to control  FreeType's  tracing
      mechanism if compiled  with FT_DEBUG_LEVEL_TRACE.   See the file
      `ftdebug.h' for more details.

    - YAMATO Masatake contributed improved  handling of MacOS resource
      forks on non-MacOS platforms (for example, Linux can mount MacOS
      file systems).

    - Support for MacOS has been improved; there is now a new function
      `FT_New_Face_From_FSSpec'  similar to `FT_New_Face'  except that
      it accepts an FSSpec instead of a path.

    - The cache sub-system has been rewritten.

      - There is now support for deinstallation of faces.

      - A new  API function `FTC_Manager_RemoveFaceID'  has been added
        to  delete  all  `idle'  nodes  that  correspond  to  a  given
        FTC_FaceID.  All `locked' nodes  (i.e., those with a reference
        count > 0), will be modified to prevent them from appearing in
        further  lookups (they  will  be cleaned  normally when  their
        reference count reaches 0).

      - There  is  now  support  for point  scaling  (i.e.,  providing
        character sizes in points + dpis, instead of pixels).

      - Three abstract cache classes are now available:

          FTC_GCache:  Used to store  one glyph  item per  cache node,
                      with the ability to group common attributes into
                      `families'.      This    replaces     the    old
                      FTC_GlyphCache class.

          FTC_ICache: Used to store one FT_Glyph per cache node.  This
                      extends  FTC_GCache.  Family  definition, family
                      comparison, and  glyph loading are  however left
                      to sub-classes.

          FTC_SCache: Used to  store up to 16 small  bitmaps per cache
                      node.    This    extends   FTC_GCache.    Family
                      definition, family  comparison and glyph loading
                      are however left to sub-classes.

      - The file `src/cache/ftcbasic.c' implements:

          FTC_ImageCache: Extends    FTC_ICache;   implements   family
                          definitions and glyph loading similar to the
                          old API.

          FTC_SBitCache: Extends    FTC_SCache,    implements   family
                         definitions and glyph  loading similar to the
                         old API

        Client  applications  should  be  able to  extend  FTC_GCache,
        FTC_ICache, or FTC_SCache much more easily (i.e., less code to
        write, and  less callbacks).  For example,  one could envision
        caches  that are  capable of  storing  transformed (obliqued),
        stroked,   emboldened,   or   colored   glyph   images.    Use
        `ftcbasic.c' as an example.

      - All public  APIs are now  in `include/freetype/ftcache.h', (to
        be    accessed   as    `FT_CACHE_H').     The   contents    of
        `include/freetype/cache/' is only  needed by applications that
        wish to implement their own caches.

      - There were some major performance improvements through the use
        of  various programming  tricks.   Cache hits  are  up to  70%
        faster than in the old code.

      - The  FTC_CMapCache has  been simplified.  Charmaps can only be
        accessed by  index right now.  There  is also a  new API named
        `FT_Charmap_GetIndex' for this purpose.

      - The  demo programs  have been  updated to  the new  code.  The
        previous versions will not work with the current one.

      - Using  an invalid face  index in FT_Open_Face and friends  now
        causes an error even if the font contains a single face only.


  III. MISCELLANEOUS

    - Wolfgang Domröse contributed support files for building FreeType
      on the Atari using the PureC compiler.  Note that the Atari is a
      16bit platform.

    - Vitaliy Pasternak contributed project files for VS.NET 2003.


======================================================================

CHANGES BETWEEN 2.1.7 and 2.1.6

  I. IMPORTANT BUG FIXES

    - Updated  to newest  libtool  version, fixing  build problems  on
      various platforms.

    - On  Unix  platforms,  `make  install' didn't  copy  the  correct
      `ftconfig.h' file.

  Note that version 2.1.7  contains the same library  C source code as
  version 2.1.6.


======================================================================

CHANGES BETWEEN 2.1.6 and 2.1.5

  I. IMPORTANT BUG FIXES

    - The PFR  font driver didn't  load kerning tables  correctly, and
      the functions in FT_PFR_H didn't work at all.

    - Type 1 font  files in  binary format  (PFB) with  an end-of-file
      indicator weren't accepted by the FreeType engine.

    - Fonts which contain /PaintType  and /StrokeWidth no longer cause
      a segfault.  This bug has been introduced in version 2.1.5.

    - Fonts  loaded  with   FT_LOAD_RENDER  no  longer  cause  strange
      results.  This bug has been introduced in version 2.1.5.

    - Some  Windows   (bitmap)  FNT/FON  files   couldn't  be  handled
      correctly.


  II. IMPORTANT CHANGES

    - The internal  module API  has been heavily  changed in  favor of
      massive simplifications within the font engine.  This also means
      that authors of third-party modules must adapt their code to the
      new scheme.

      NOTE:  THE NEW SCHEME IS NOT COMPLETED YET.  PLEASE WAIT UNTIL A
      FINAL ANNOUNCEMENT!

    - The PostScript  parser has been enhanced to  handle comments and
      strings   correctly.   Additionally,   more  syntax   forms  are
      recognized.

    - Added the  optional unpatented hinting system  for TrueType.  It
      allows  typefaces which  need hinting  to produce  correct glyph
      forms (e.g., Chinese typefaces  from Dynalab) to work acceptably
      without infringing Apple patents.   This system is compiled only
      if  TT_CONFIG_OPTION_COMPILE_UNPATENTED_HINTING  is  defined  in
      ftoption.h (activated by default).


  III. MISCELLANEOUS

    - There  is now  a guard  in the  public header  files  to protect
      against inclusion of freetype.h from FreeType 1.

    - Direct inclusion of freetype.h  and other public header files no
      longer works.  You have to use the documented scheme

        #include <ft2build.h>
        #include FT_FREETYPE_H

      to load freetype.h with  a symbolic name.  This protects against
      renaming  of public  header  files (which  shouldn't happen  but
      actually  has, avoiding two  public header  files with  the same
      name).


======================================================================

CHANGES BETWEEN 2.1.5 and 2.1.4

  I. IMPORTANT BUG FIXES

    - Parsing the /CIDFontName field  now removes the leading slash to
      be in sync with other font drivers.

    - gzip support was buggy.  Some fonts could not be read.

    - Fonts which  have nested subglyphs  more than one level  deep no
      longer cause a segfault.

    - Creation of synthetic  cmaps for fonts in CFF  format was broken
      partially.

    - Numeric  font  dictionary entries  for  synthetic  fonts are  no
      longer overwritten.

    - The font matrix  wasn't applied to the advance  width for Type1,
      CID, and  CFF fonts.  This caused problems  when loading certain
      synthetic Type 1 fonts like `Helvetica Narrow'.

    - The test  for the charset registry  in BDF and PCF  fonts is now
      case-insensitive.

    - FT_Vector_Rotate  sometimes  returned   strange  values  due  to
      rounding errors.

    - The  PCF  driver  now  returns  the  correct  number  of  glyphs
      (including an artificial `notdef' glyph at index 0).

    - FreeType now  supports buggy CMaps  which are contained  in many
      CJK fonts from Dynalab.

    - Opening  an invalid  font  on a  Mac  caused a  segfault due  to
      double-freeing memory.

    - BDF  fonts  with  more   than  32768  glyphs  weren't  supported
      properly.


  II. IMPORTANT CHANGES

    - Accessing bitmap font formats has been synchronized.  To do that
      the FT_Bitmap_Size  structure has  been extended to  contain new
      fields `size', `x_ppem', and `y_ppem'.

    - The FNT driver now returns multiple faces, not multiple strikes.

    - The `psnames'  module has been  updated to the Adobe  Glyph List
      version 2.0.

    - The `psnames' module now understands `uXXXX[X[X]]' glyph names.

    - The algorithm for guessing the font style has been improved.

    - For fonts in SFNT format, root->height is no longer increased if
      the line gap  is zero.  There exist fonts  (containing e.g. form
      drawing  characters) which  intentionally have  a zero  line gap
      value.

    - ft_glyph_bbox_xxx  flags   are  now  deprecated   in  favour  of
      FT_GLYPH_BBOX_XXX.

    - ft_module_xxx   flags   are   now   deprecated  in   favour   of
      FT_MODULE_XXX.

    - FT_ENCODING_MS_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}      are     now
      deprecated               in               favour              of
      FT_ENCODING_{SJIS,GB2312,BIG5,WANSUNG,JOHAB}  -- those encodings
      are not specific to Microsoft.


  III. MISCELLANEOUS

    - The  autohinter  has been  further  improved;  for example,  `m'
      glyphs now retain its vertical symmetry.

    - Partial support of Mac fonts on non-Mac platforms.

    - `make   refdoc'   (after   first   `make')   builds   the   HTML
      documentation.  You need Python for this.

    - The make build system should  now work more reliably on DOS-like
      platforms.

    - Support for  EMX gcc  and Watson C/C++  compilers on  MS-DOS has
      been added.

    - Better VMS build support.

    - Support for the pkg-config  package by providing a `freetype.pc'
      file.

    - New configure option --with-old-mac-fonts for Darwin.

    - Some source files have been  renamed (mainly to fit into the 8.3
      naming scheme).


======================================================================

CHANGES BETWEEN 2.1.4 and 2.1.3

  I. IMPORTANT BUG FIXES

    - Updated  to newest  libtool  version, fixing  build problems  on
      various platforms.

    - A fix  in the Gzip stream  reader: It couldn't  read certain .gz
      files properly due to a  small typo.  In certain cases, FreeType
      could  also loop  endlessly  when trying  to  load tiny  gzipped
      files.

    - The configure script now tries  to use the system-wide zlib when
      it  finds one  (instead of  the  copy found  in src/gzip).   And
      `freetype-config' has  been updated to return  relevant flags in
      this case when invoked with `--libs' (e.g. `-lzlib').

    - Certain fonts couldn't be loaded  by 2.1.3 because they lacked a
      Unicode   charmap  (e.g.   SYMBOL.TTF).    FreeType  erroneously
      rejected them.

    - The CFF loader was modified to accept fonts which only contain a
      subset of  their reference charset.  This  prevented the correct
      use of PDF-embedded fonts.

    - The logic to detect Unicode charmaps has been modified.  This is
      required to  support fonts which include both  16-bit and 32-bit
      charmaps (like very  recent asian ones) using the  new 10 and 12
      SFNT formats.

    - The TrueType  loader now limits  the depth of  composite glyphs.
      This is necessary to prevent broken fonts to break the engine by
      blowing the stack with recursive glyph definitions.

    - The CMap cache is now  capable of managing UCS-4 character codes
      that   are   mapped   through   extended  charmaps   in   recent
      TrueType/OpenType fonts.

    - The   cache  sub-system   now  properly   manages  out-of-memory
      conditions  instead of  blindly  reporting them  to the  caller.
      This means that it will try to empty the cache before restarting
      its allocations to see if that can help.

    - The  PFR driver  didn't return  the list  of  available embedded
      bitmaps properly.

    - There was  a nasty  memory leak when  using embedded  bitmaps in
      certain font formats.


  II. IMPORTANT CHANGES

    - David Chester  contributed some enhancements  to the auto-hinter
      that  significantly increase  the  quality of  its output.   The
      Postscript hinter was also improved in several ways.

    - The FT_RENDER_MODE_LIGHT render mode was implemented.

    - A new  API function called `FT_Get_BDF_Property'  has been added
      to FT_BDF_H to  retrieve BDF properties from BDF  _and_ PCF font
      files.   THIS  IS  STILL  EXPERIMENTAL,  since  it  hasn't  been
      properly tested yet.

    - A Windows FNT specific API has been added, mostly to access font
      headers.  This is used by Wine.

    - TrueType tables  without an `hmtx' table are  now tolerated when
      an  incremental interface  is  used.  This  happens for  certain
      Type42 fonts passed from Ghostscript to FreeType.

    - The PFR font driver is  now capable of returning the font family
      and style  names when  they are available  (instead of  the sole
      `FontID').   This  is  performed  by parsing  an  *undocumented*
      portion of the font file!


  III. MISCELLANEOUS

    - The path stroker in FT_STROKER_H has entered beta stage.  It now
      works very  well, but  its interface might  change a bit  in the
      future.  More on this in later releases.

    - The documentation for  FT_Size_Metrics didn't appear properly in
      the API reference.

    - The file docs/VERSION.DLL has been updated to explain versioning
      with FreeType  (i.e., comparing release/libtool/so  numbers, and
      how to use them in autoconf scripts).

    - The  installation  documentation  has been  seriously  revamped.
      Everything is now in the `docs' directory.


======================================================================

CHANGES BETWEEN 2.1.3 and 2.1.2

  I. IMPORTANT BUG FIXES

    - FT_Vector_Transform  had  been  incorrectly modified  in  2.1.2,
      resulting  in  incorrect   transformations  being  applied  (for
      example, rotations were processed in opposite angles).

    - The format  8 and 12 TrueType charmap  enumeration routines have
      been fixed (FT_Get_Next_Char returned invalid values).

    - The  PFR font driver  returned incorrect  advance widths  if the
      outline  and metrics resolution  defined in  the font  file were
      different.

    - FT_Glyph_To_Bitmap now returns  successfully when called with an
      FT_BitmapGlyph argument (it previously returned an error).

    - A bug  in the Type 1  loader that prevented  valid font bounding
      boxes to be loaded from multiple master fonts.

    - The SFNT  validation code has been rewritten.   FreeType can now
      load `broken'  fonts that were  usable on Windows, but  not with
      previous versions of the library.

    - The computation of bearings in the BDF driver has been fixed.

    - The Postscript hinter crashed when trying to hint certain glyphs
      (more precisely,  when trying to  apply hints to an  empty glyph
      outline).

    - The  TrueType glyph  loader  now supports  composites in  `Apple
      format'  (they differ slightly  from Microsoft/OpenType  ones in
      the way transformation offsets are computed).

    - FreeType was  very slow at opening certain  asian CID/CFF fonts,
      due to  fixed increment  in dynamic array  re-allocations.  This
      has  been changed  to  exponential behaviour  to get  acceptable
      performance.



  II. IMPORTANT CHANGES

    - The PCF driver now supports gzip-compressed font files natively.
      This means that  you will be able to use  all these bitmap fonts
      that  come with  XFree86 with  FreeType (and  libXft/libXft2, by
      extension).

    - The  automatic and  postscript hinters  have both  been updated.
      This  results in  a relatively  important increase  of rendering
      quality since  many nasty defaults have been suppressed.  Please
      visit the web page:

        https://www.freetype.org/hinting/smooth-hinting.html

      for additional details on this topic.

    - The `load_flags' parameter of `FT_Load_Glyph' is now an FT_Int32
      (instead  of just  being  an FT_Int).   This  breaks source  and
      binary  compatibility for  16bit systems  only,  while retaining
      both of them for 32 and 64 bit ones.

      Some new flags have been added consequently:

        FT_LOAD_NO_AUTOHINT   :: Disable the use of the auto-hinter
                                 (but not native format hinters).

        FT_LOAD_TARGET_NORMAL :: Hint and render for normal
                                 anti-aliased displays.

        FT_LOAD_TARGET_MONO   :: Hint and render for 1-bit displays.

        FT_LOAD_TARGET_LCD    :: Hint and render for horizontal RGB or
                                 BGR subpixel displays (like LCD
                                 screens).  THIS IS STILL
                                 EXPERIMENTAL!

        FT_LOAD_TARGET_LCD_V  :: Same as FT_LOAD_TARGET_LCD, for
                                 vertical subpixel displays (like
                                 rotated LCD screens).  THIS IS STILL
                                 EXPERIMENTAL!

      FT_LOAD_MONOCHROME   is  still   supported,  but   only  affects
      rendering, not the hinting.

      Note that the `ftview'  demo program available in the `ft2demos'
      package  has been  updated to  support LCD-optimized  display on
      non-paletted displays (under Win32 and X11).

    - The  PFR  driver  now  supports embedded  bitmaps  (all  formats
      supported), and returns correct kerning metrics for all glyphs.

    - The TrueType charmap loader  now supports certain `broken' fonts
      that load under Windows without problems.

    - The cache API has been slightly modified (it's still a beta!):

       - The type  FTC_ImageDesc has been removed; it  is now replaced
         by  FTC_ImageTypeRec.   Note that  one  of  its  fields is  a
         `load_flag' parameter for FT_Load_Glyph.

       - The  field  `num_grays' of  FT_SBitRec  has  been changed  to
         `max_grays'  in  order to  fit  within  a  single byte.   Its
         maximum value is thus 255 (instead of 256 as previously).


  III. MISCELLANEOUS

    - Added support  for the  DESTDIR variable during  `make install'.
      This simplifies packaging of FreeType.

    - Included modified  copies of the  ZLib sources in  `src/gzip' in
      order to support  gzip-compressed PCF fonts.  We do  not use the
      system-provided  zlib  for  now,   though  this  is  a  probable
      enhancement for future releases.

    - The DocMaker tool used to generate the on-line API reference has
      been   completely    rewritten.    It   is    now   located   in
      `src/tools/docmaker/docmaker.py'.  Features:

        - better cross-referenced output
        - more polished output
        - uses Python regular expressions  (though it didn't speed the
          program)
        - much  more  modular structure,  which  allows for  different
          `backends'  in  order to  generate  HTML,  XML, or  whatever
          format.

      One can regenerate the API reference by calling:

         python src/tools/docmaker/docmaker.py \
                --prefix=ft2 \
                --title=FreeType-2.1.3 \
                --output=<outputdirectory>
                include/freetype/*.h \
                include/freetype/config/*.h \
                include/freetype/cache/*.h

    - A new, experimental, support for incremental font loading (i.e.,
      loading  of fonts  where the  glyphs are  not in  the  font file
      itself, but provided by an external component, like a Postscript
      interpreter) has been added by Graham Asher.  This is still work
      in progress, however.

    - A new,  EXPERIMENTAL, path stroker  has been added.   It doesn't
      suffer  from  severe  rounding  errors  and  treat  bezier  arcs
      directly.  Still work in progress (i.e. not part of the official
      API).   See  the file  <freetype/ftstroker.h>  for  some of  the
      details.

    - The massive  re-formatting of sources and  internal re-design is
      still under-way.  Many  internal functions, constants, and types
      have been renamed.


======================================================================

CHANGES BETWEEN 2.1.2 and 2.1.1

  I. IMPORTANT BUG FIXES

    - Many  font drivers didn't  select a  Unicode charmap  by default
      when a new face  was opened (with the FT_CONFIG_OPTION_USE_CMAPS
      options enabled),  causing many applications  to not be  able to
      display text correctly with the 2.1.x releases.

    - The  PFR driver had  a bug  in its  composite loading  code that
      produces incorrectly placed accents with many fonts.

    - The Type42 driver crashed sometimes due to a nasty bug.

    - The Type 1 custom encoding  charmap didn't handle the case where
      the first glyph index wasn't 0.

    - A  serious  typo  in  the  TrueType  composite  loader  produced
      incorrectly placed  glyphs in fonts  like `Wingdings' and  a few
      others.


  II. MISCELLANEOUS

    - The Win32  Visual C++ project  file has been updated  to include
      the PFR driver as well.

    - `freetype.m4' is  now installed by default by  `make install' on
      Unix systems.

    - The function  FT_Get_PS_Font_Info now works with  CID and Type42
      fonts as well.


======================================================================

CHANGES BETWEEN 2.1.1 and 2.1.0

  I. IMPORTANT BUG FIXES

    - The  `version_info'  returned   by  `freetype-config'  in  2.1.0
      returned an invalid value.  It now returns 9:1:3 (2.0.9 returned
      9:0:3).

    - Version 2.1.0  couldn't be linked against  applications on Win32
      and  Amiga systems  due  to  a new  debug  function that  wasn't
      properly   propagated  to   the  system-specific   directory  in
      `builds'.

    - Various MacOS and Mac OS X specific fixes.

    - Fixed  a bug in  the TrueType  charmap validation  routines that
      made version  2.1.0 too restrictive  -- many popular  fonts have
      been rejected.

    - There was  still a very small difference  between the monochrome
      glyph bitmaps produced by FreeType 1.x and FreeType 2.x with the
      bytecode  interpreter enabled.   This was  caused by  an invalid
      flag setting in the TrueType glyph loader, making the rasterizer
      change  its  drop-out   control  mode.   Now  the results should
      _really_ be completely identical.

    - The TrueType name table loader has been improved to support many
      popular  though buggy Asian  fonts.  It  now ignores  empty name
      entries,  invalid  pointer offsets  and  a  few other  incorrect
      subtleties.  Moreover,  name strings  are now loaded  on demand,
      which reduces the memory load  of many faces (e.g. the ARIAL.TTF
      font file contains a 10kByte name table with 70 names).

    - Fixed a bug in the Postscript hinter that prevented family blues
      substitution to happen correctly.


  II. NEW FEATURES

    - Three new font drivers in this release:

      * A  BDF  font driver,  contributed  by  Franco Zappa  Nardelli,
        heavily  modified   by  Werner  Lemberg.    It  also  supports
        anti-aliased bitmaps (using a slightly extended BDF format).

      * A Type42  font driver, contributed by Roberto  Alameda.  It is
        still experimental but seems to work relatively well.

      * A PFR  font driver, contributed  by David Turner  himself.  It
        doesn't  support PFR  hinting --  note that  BitStream  has at
        least two patents on this format!


  III. MISCELLANEOUS

    - The  cache  sub-system has  been  optimized  in important  ways.
      Cache hits are now significantly faster.  For example, using the
      CMap cache is about  twice faster than calling FT_Get_Char_Index
      on most platforms.  Similarly, using an SBit cache is about five
      times faster  than loading the  bitmaps from a bitmap  file, and
      300 to  500 times  faster than generating  them from  a scalable
      format.

      Note that  you should recompile  your sources if you  designed a
      custom  cache  class for  the  FT2  Cache  subsystem, since  the
      changes performed are source, but not binary, compatible.


======================================================================

CHANGES BETWEEN 2.1.0 and 2.0.9

  I. IMPORTANT BUG FIXES

    - The  TrueType bytecode  interpreter  has been  fixed to  produce
      _exactly_ the same output as FreeType 1.x.  Previous differences
      were due  to slightly distinct  fixed-point computation routines
      used to perform dot products and vector length measurements.

      It seems  that native TrueType hinting  is _extremely_ sensitive
      to  rounding errors.  The  required vector  computation routines
      have been optimized and placed within the `ttinterp.c' file.

    - Fixed the parsing of accelerator tables in the PCF font driver.

    - Fixed the Type1 glyph loader  routine used to compute the font's
      maximum advance width.


  II. NEW FEATURES

    - The `configure' script used on Unix systems has been modified to
      check  that  GNU  Make  is  being used  to  build  the  library.
      Otherwise,  it  will display  a  message  proposing  to use  the
      GNUMAKE environment variable to name it.

      The Unix-specific file README.UNX has been modified accordingly.


  III. MISCELLANEOUS

    - The  FreeType  License in  `docs/FTL.TXT'  has  been updated  to
      include  a  proposed preferred  disclaimer.   If  you are  using
      FreeType in your products, you are encouraged (but not mandated)
      to use the following text in your documentation:

      """
        Portions of this software are copyright © 1996-2002 The
        FreeType Project (www.freetype.org).  All rights reserved.
      """

    - The default size of the render pool has been reduced to 16kByte.
      This  shouldn't result  in any  noticeable  performance penalty,
      unless you are  using the engine as-is to  render very large and
      complex glyphs.

    - The  FreeType 2  redesign has  begun.  More  information  can be
      found at this URL:

        https://www.freetype.org/freetype2/redesign.html

      The following  internal changes  have been performed  within the
      sources of this release:

        - Many   internal  types   have  been   renamed   to  increase
          consistency.   The  following  should  be true,  except  for
          public types:

            * All structure  types have a name ending  in `Rec' (short
              for `record').

            * A  pointer-to-structure type  has the  same name  as the
              structure, _without_ the `Rec' suffix.

              Example:

                typedef struct FooRec_
                {
                  ...

                } FooRec, *Foo;

        - Many   internal  macros  have   been  renamed   to  increase
          consistency.  The following should be true:

            * All  macros  have a  name  beginning  with `FT_'.   This
              required a few changes like

                ALLOC   => FT_ALLOC
                FREE    => FT_FREE
                REALLOC => FT_REALLOC

            * All  macros are completely  UPPERCASE.  This  required a
              few changes like:

                READ_Short  => FT_READ_SHORT
                NEXT_Short  => FT_NEXT_SHORT
                GET_ULongLE => FT_GET_ULONG_LE
                MEM_Set     => FT_MEM_SET
                MEM_Copy    => FT_MEM_COPY
                etc.

            * Whenever   possible,   all   macro  names   follow   the
              FT_<OBJECT>_<METHOD> pattern.  For example

                ACCESS_Frame   => FT_FRAME_ENTER
                FORGET_Frame   => FT_FRAME_EXIT
                EXTRACT_Frame  => FT_FRAME_EXTRACT
                RELEASE_Frame  => FT_FRAME_RELEASE

                FILE_Pos       => FT_STREAM_POS
                FILE_Seek      => FT_STREAM_SEEK
                FILE_Read      => FT_STREAM_READ
                FILE_ReadAt    => FT_STREAM_READ_AT
                READ_Fields    => FT_STREAM_READ_FIELDS

        - Many  internal functions  have  been renamed  to follow  the
          FT_<Object>_<Method> pattern.  For example:

            FT_Seek_Stream       => FT_Stream_Seek
            FT_Read_Stream_At    => FT_Stream_ReadAt
            FT_Done_Stream       => FT_Stream_Close
            FT_New_Stream        => FT_Stream_Open
            FT_New_Memory_Stream => FT_Stream_OpenMemory
            FT_Extract_Frame     => FT_Stream_ExtractFrame

          Note that method names do not contain `_'.

        - The FT_ALLOC_ARRAY  and FT_REALLOC_ARRAY have  been replaced
          with  FT_NEW_ARRAY and  FT_RENEW_ARRAY which  do not  take a
          type  as the  fourth argument.   Instead, the  array element
          type  size is computed  automatically from  the type  of the
          target pointer used.

        - A  new object  class, FT_CMap,  has been  introduced.  These
          internal  objects are  used to  model character  maps.  This
          eases  the support  of additional  charmap types  within the
          engine.

        - A new  configuration file named `ftstdlib.h'  has been added
          to `include/freetype/config'.  It  is used to define aliases
          for  _every_ routine  of the  ISO  C library  that the  font
          engine   uses.    Each    aliases   has   a   `ft_'   prefix
          (e.g. `ft_strlen' is an alias for `strlen').

          This is  used to  ease the porting  of FreeType 2  to exotic
          runtime environments where the ISO C Library isn't available
          (e.g.  XFree86 extension modules).

      More details are available in the `ChangeLog' file.


======================================================================

CHANGES BETWEEN 2.0.9 and 2.0.8

  I. IMPORTANT BUG FIXES

    - Certain fonts like `foxjump.ttf' contain broken name tables with
      invalid entries and wild offsets.  This caused FreeType to crash
      when trying to load them.

      The  SFNT `name'  table  loader has  been  fixed to  be able  to
      support these strange fonts.

      Moreover, the code  in charge of processing this  table has been
      changed  to always favour  Windows-formatted entries  over other
      ones.  Hence,  a font that works  on Windows but not  on the Mac
      will  load cleanly in  FreeType and  report accurate  values for
      Family & PostScript names.

    - The CID font driver has been fixed.  It unfortunately returned a
      Postscript   Font   name   with   a   leading   slash,   as   in
      `/MunhwaGothic-Regular'.

    - FreeType  2 should now  compile fine  on AIX  4.3.3 as  a shared
      library.

    - A  bug  in the  Postscript  hinter  has  been found  and  fixed,
      removing un-even stem widths at small pixel sizes (like 14-17).

      This  improves the  quality of  a certain  number  of Postscript
      fonts.


  II. NEW FEATURES

    - A  new function  named  `FT_Library_Version' has  been added  to
      return  the current  library's major,  minor, and  patch version
      numbers.   This is  important since  the  macros FREETYPE_MAJOR,
      FREETYPE_MINOR,  and  FREETYPE_PATCH  cannot  be used  when  the
      library is dynamically linked by a program.

    - Two   new  APIs   have  been   added:   `FT_Get_First_Char'  and
      `FT_Get_Next_Char'.

      Together,  these can  be used  to iterate  efficiently  over the
      currently  selected  charmap of  a  given  face.   Read the  API
      reference for more details.


  III. MISCELLANEOUS

    - The FreeType sources are  under heavy internal re-factoring.  As
      a consequence,  we have created  a branch named `STABLE'  on the
      CVS to hold all future releases/fixes in the 2.0.x family.

      The  HEAD  branch  now  contains  the  re-factored  sources  and
      shouldn't  be used for  testing or  packaging new  releases.  In
      case you  would like  to access the  2.0.9 sources from  our CVS
      repository, use the tag `VER-2-0-9'.


======================================================================

CHANGES BETWEEN 2.0.8 and 2.0.7

  I. IMPORTANT BUG FIXES

    - There was  a small but  nasty bug in  `freetype-config.in' which
      caused the `freetype-config' script to fail on Unix.

      This didn't prevent the installation  of the library or even its
      execution, but caused problems  when trying to compile many Unix
      packages that depend on it.

    - Some TrueType or OpenType fonts embedded in PDF documents do not
      have  a  'cmap',  'post'  and  'name'  as  is  required  by  the
      specification.  FreeType no longer refuses to load such fonts.

    - Various fixes to the PCF font driver.


======================================================================

CHANGES BETWEEN 2.0.7 and 2.0.6

  I. IMPORTANT BUG FIXES

    - Fixed  two  bugs in  the  Type 1  font  driver.   The first  one
      resulted in a memory leak in subtle cases.  The other one caused
      FreeType to crash when  trying to load `.gsf' files (Ghostscript
      so-called Postscript fonts).

      (This  made _many_  KDE applications  crash on  certain systems.
       FreeType _is_ becoming a critical system component on Linux :-)

    - Fixed a memory leak in the CFF font driver.

    - Fixed a memory leak in the PCF font driver.

    - Fixed       the        Visual       C++       project       file
      `builds/win32/visualc/freetype.dsp' since  it didn't include the
      Postscript hinter component, causing errors at build time.

    - Fixed a  small rendering bug  in the anti-aliased  renderer that
      only  occurred when  trying to  draw  thin (less  than 1  pixel)
      strokes.

    - Fixed  `builds/unix/freetype2.a4' which  is used  to  generate a
      valid `freetype2.m4' for use with autoconf.

    - Fixed the OpenVMS Makefiles.


  II. MISCELLANEOUS

    - Added  `configure'  and   `install'  scripts  to  the  top-level
      directory.  A GNU-style installation is thus now easily possible
      with

        ./configure  <options>
        make
        make install


======================================================================

CHANGES BETWEEN 2.0.6 and 2.0.5

  I. IMPORTANT BUG FIXES

    - It wasn't possible to load embedded bitmaps when the auto-hinter
      was used.  This is now fixed.

    - The TrueType  font driver  didn't load some  composites properly
      (the  sub-glyphs  were  slightly  shifted,  and  this  was  only
      noticeable when using monochrome rendering).

    - Various  fixes  to the  auto-hinter.   They  merely improve  the
      output of sans-serif fonts.   Note that there are still problems
      with serifed fonts and composites (accented characters).

    - All scalable  font drivers erroneously  returned un-fitted glyph
      advances when hinting was  requested.  This created problems for
      a number  of layout applications.  This  is a very  old bug that
      got  undetected mainly  because most  test/demo  program perform
      rounding explicitly or implicitly (through the cache).

    - `FT_Glyph_To_Bitmap' did erroneously  modify the source glyph in
      certain cases.

    - `glnames.py'  still contained  a bug  that made  FreeType return
      invalid names for certain glyphs.

    - The  library crashed  when  loading certain  Type  1 fonts  like
      `sadn.pfb'  (`Stalingrad  Normal'),   which  appear  to  contain
      pathetic font info dictionaries.

    - The TrueType glyph  loader is now much more  paranoid and checks
      everything when loading a given glyph image.  This was necessary
      to avoid problems (crashes and/or memory overwrites) with broken
      fonts that came from a really buggy automatic font converter.


  II. IMPORTANT UPDATES AND NEW FEATURES

    - Important updates to the Mac-specific parts of the library.

    - The caching sub-system has  been completely re-designed, and its
      API has  evolved (the  old one is  still supported  for backward
      compatibility).

      The documentation for it is  not yet completed, sorry.  For now,
      you are encouraged to continue  using the old API.  However, the
      ftview  demo program in  the ft2demos  package has  already been
      updated to use the new caching functions.

    - A new charmap cache is provided too.  See `FTC_CMapCache'.  This
      is useful to perform  character code -> glyph index translations
      quickly, without the need for an opened FT_Face.

    - A NEW POSTSCRIPT HINTER module  has been added to support native
      hints in  the following  formats: PostScript Type  1, PostScript
      CID, and CFF/CEF.

      Please test!  Note that  the auto-hinter produces better results
      for a number of  badly-hinted fonts (mostly auto-generated ones)
      though.

    - A memory debugger is now  part of the standard FreeType sources.
      To      enable      it,      define      FT_DEBUG_MEMORY      in
      <freetype/config/ftoption.h>, and recompile the library.

      Additionally, define  the _environment_ variable FT_DEBUG_MEMORY
      and run any program using FreeType.  When the library is exited,
      a  summary  of memory  footprints  and  possible  leaks will  be
      displayed.

      This works transparently with  _any_ program that uses FreeType.
      However, you  will need a lot  of memory to  use this (allocated
      blocks are never  released to the heap to  detect double deletes
      easily).


  III. MISCELLANEOUS

    - We  are  aware  of  subtle  differences between  the  output  of
      FreeType  versions   1  and  2  when  it   comes  to  monochrome
      TrueType-hinted glyphs.   These are  most probably due  to small
      differences in the monochrome rasterizers and will be worked out
      in an upcoming release.

    - We have decided to fork the sources in a `stable' branch, and an
      `unstable' one, since FreeType  is becoming a critical component
      of many Unix systems.

      The next  bug-fix releases of  the library will be  named 2.0.7,
      2.0.8, etc.,  while the `2.1'  branch will contain a  version of
      the sources where we will start major reworking of the library's
      internals, in order to produce FreeType 2.2.0 (or even 3.0) in a
      more distant future.

      We  also hope  that this  scheme will  allow much  more frequent
      releases than in the past.


======================================================================

CHANGES BETWEEN 2.0.5 and 2.0.4

  NOTE THAT 2.0.5 DOES NOT CONTAIN THE POSTSCRIPT HINTER.  THIS MODULE
  WILL BE PART OF THE NEXT RELEASE (EITHER 2.0.6 or 2.1)

  - Fixed a bug that made  certain glyphs, like `Cacute', `cacute' and
    `lslash'  unavailable from Unicode  charmaps of  Postscript fonts.
    This prevented the correct display of Polish text, for example.

  - The kerning table of Type 1 fonts was loaded by FreeType, when its
    AFM    file    was    attached    to    its    face,    but    the
    FT_FACE_FLAG_HAS_KERNING   bit  flags   was  not   set  correctly,
    preventing FT_Get_Kerning to return meaningful values.

  - Improved  SFNT (TrueType  & OpenType)  charmap  support.  Slightly
    better performance, as well as support for the new formats defined
    by the OpenType 1.3 specification (8, 10, and 12)

  - Fixed a  serious typo in `src/base/ftcalc.c'  which caused invalid
    computations in certain rare cases, producing ugly artefacts.

  - The  size  of the  EM  square is  computed  with  a more  accurate
    algorithm for Postscript fonts.   The old one caused slight errors
    with embedded fonts found in PDF documents.

  - Fixed  a  bug in  the  cache  manager  that prevented  normal  LRU
    behaviour  within the cache  manager, causing  unnecessary reloads
    (for FT_Face and FT_Size objects only).

  - Added  a new  function named  `FT_Get_Name_Index' to  retrieve the
    glyph index of a given glyph name, when found in a face.

  - Added  a new function  named `FT_Get_Postscript_Name'  to retrieve
    the `unique' Postscript font name of a given face.

  - Added   a   new   public   header  size   named   FT_SIZES_H   (or
    <freetype/ftsizes.h>) providing  new FT_Size-management functions:
    FT_New_Size, FT_Activate_Size, FT_Done_Size.

  - Fixed a  reallocation bug that  generated a dangling  pointer (and
    possibly    memory    leaks)    with    Postscript    fonts    (in
    src/psaux/psobjs.c).

  - Many fixes for 16-bit correctness.

  - Removed many pedantic compiler warnings from the sources.

  - Added an Amiga build directory in `builds/amiga'.


======================================================================

CHANGES BETWEEN 2.0.4 and 2.0.3

  - Fixed a rather annoying bug that was introduced in 2.0.3.  Namely,
    the font  transformation set through  FT_Set_Transform was applied
    twice to auto-hinted glyphs, resulting in incorrectly rotated text
    output.

  - Fixed _many_  compiler warnings.   FT2 should now  compile cleanly
    with Visual  C++'s most pedantic warning level  (/W4).  It already
    compiled fine with GCC and a few other compilers.

  - Fixed a bug  that prevented the linear advance  width of composite
    TrueType glyphs to be correctly returned.

  - Fixed    the    Visual    C++    project    files    located    in
    `builds/win32/visualc' (previous versions  used older names of the
    library).

  - Many  32-bit constants  have an  `L' appended  to their  value, in
    order to improve the 16-bitness  of the code.  Someone is actually
    trying to use FT2 on an Atari ST machine!

  - Updated  the  `builds/detect.mk' file  in  order to  automatically
    build FT2  on AIX systems.   AIX uses `/usr/sbin/init'  instead of
    `/sbin/init' and wasn't previously  detected as a Unix platform by
    the FreeType build system.

  - Updated  the  Unix-specific  portions  of the  build  system  (new
    libtool version, etc.).

  - The  SFNT kerning  loader now  ensures  that the  table is  sorted
    (since some problem fonts do not meet this requirement).


=======================================================================

CHANGES BETWEEN 2.0.3 and 2.0.2

  I. CHANGES TO THE MODULES / FONT DRIVERS

    - THE  AUTO-HINTER HAS  BEEN SLIGHTLY  IMPROVED, in  order  to fix
      several annoying artefacts, mainly:

        - Blue  zone alignment  of  horizontal stems  wasn't performed
          correctly, resulting in artefacts  like the `d' being placed
          one pixel below the `b' in some fonts like Time New Roman.

        - Overshoot thresholding  wasn't performed correctly, creating
          unpleasant artefacts at large character pixel sizes.

        - Composite glyph loading has  been simplified.  This gets rid
          of  various artefacts  where the  components of  a composite
          glyphs were not correctly spaced.

      These are  the last changes to the  current auto-hinting module.
      A new  hinting sub-system is currently  in the work  in order to
      support native hints  in Type 1 / CFF /  OpenType fonts, as well
      as globally improve rendering.

    - The  PCF  driver has  been  fixed.   It  reported invalid  glyph
      dimensions for the fonts available on Solaris.

    - The Type  1, CID and CFF  drivers have been modified  to fix the
      computation of the EM size.

    - The Type 1  driver has been fixed to avoid  a dangerous bug that
      crashed the library with non-conforming fonts (i.e. ones that do
      not place the .notdef glyph at position 0).

    - The TrueType  driver had a  rather subtle bug  (dangling pointer
      when loading  composite glyphs) that could crash  the library in
      rare occasions!


  II. HIGH-LEVEL API CHANGES

    - The error  code enumeration values have been  changed.  An error
      value  is decomposed  in  a  generic error  code,  and a  module
      number.  see <freetype/fterrors.h> for details.

    - A   new  public   header   file  has   been  introduced,   named
      FT_TRIGONOMETRY_H    (include/freetype/fttrigon.h),    providing
      trigonometric functions to  compute sines, cosines, arctangents,
      etc. with 16.16 fixed precision.  The implementation is based on
      the CORDIC  algorithm and is very fast  while being sufficiently
      accurate.


  III. INTERNALS

    - Added  BeOS-specific files  in the  old build  sub-system.  Note
      that no changes were required to compile the library with Jam.

    - The  configuration  is now  capable  of automatically  detecting
      64-bit integers  on a set  of predefined compilers  (GCC, Visual
      C++, Borland C++) and will use them by default.  This provides a
      small performance boost.

    - A  small memory leak  that happened  when opening  0-sized files
      (duh!)  have been fixed.

    - Fixed bezier  stack depth  bug in the  routines provided  by the
      FT_BBOX_H  header   file.   Also  fixed  similar   bugs  in  the
      rasterizers.

    - The outline bounding  box code has been rewritten  to use direct
      computations,  instead of  bezier sub-division,  to  compute the
      exact bounding box of glyphs.   This is slightly slower but more
      accurate.

    - The build system has been  improved and fixed, mainly to support
      `make'  on Windows  2000  correctly, avoid  problems with  `make
      distclean' on non Unix systems, etc.

    - Hexadecimal  constants  have been  suffixed  with  `U' to  avoid
      problems with certain compilers on 64-bit platforms.

    - A new directory named `src/tools' has been created.  It contains
      Python scripts and simple unit test programs used to develop the
      library.

    - The DocMaker tool has been  moved from `docs' to `src/tools' and
      has been updated with the following:

         - Now accepts the `--title=XXXX' or `-t XXXX' option from the
           command line to set the project's name in the generated API
           reference.

         - Now accepts the `--output=DIR'  or `-o DIR' option from the
           command line to set  the output directory for all generated
           HTML files.

         - Now accepts the `--prefix=XXXX' or `-p XXX' option from the
           command  line  to  set  the  file prefix  to  use  for  all
           generated HTML files.

         - Now generates the current  time/data on each generated page
           in order to distinguish between versions.

      DocMaker  can be  used with  other  projects now,  not only  FT2
      (e.g. MLib, FTLayout, etc.).


======================================================================

CHANGES BETWEEN 2.0.2 and 2.0.1

  I. CHANGES TO THE MODULES / FONT DRIVERS

    - THE TRUETYPE BYTECODE INTERPRETER IS NOW TURNED OFF, in order to
      avoid legal problems  with the Apple patents.  It  seems that we
      mistakenly  turned this option  on in  previous releases  of the
      build.

      Note that if  you want to use the  bytecode interpreter in order
      to get high-quality TrueType  rendering, you will need to toggle
      by        hand        the        definition        of        the
      TT_CONFIG_OPTION_BYTECODE_INTERPRETER   macro    in   the   file
      `include/freetype/config/ftoption.h'.

    - The CFF driver has been improved by Tom Kacvinsky and Sander van
      der Wal:

      * Support for `seac' emulation.
      * Support for `dotsection'.
      * Support for retrieving glyph names through
        `FT_Get_Glyph_Name'.

      The first two items are necessary to correctly a large number of
      Type 1 fonts converted to the CFF formats by Adobe Acrobat.

    - The Type 1 driver was also improved by Tom & others:

      * Better EM size computation.
      * Better support for synthetic (transformed) fonts.
      * The  Type 1  driver returns  the charstrings  corresponding to
        each glyph in the  `glyph->control_data' field after a call to
        `FT_Load_Glyph' (thanks Ha Shao).

    - Various other bugfixes, including the following:

      * Fixed a nasty memory leak in the Type 1 driver.
      * The autohinter  and the pcf  driver used static  writable data
        when they shouldn't.
      * Many casts were added to  make the code more 64-bits safe.  It
        also now compiles on Windows XP 64-bits without warnings.
      * Some incorrect writable statics were removed in the `autohint'
        and `pcf' drivers.  FreeType 2 now compiles on Epoc again.


  II. CHANGES TO THE HIGH-LEVEL API

    - The library header files inclusion scheme has been changed.  The
      old scheme looked like:

        #include <freetype/freetype.h>
        #include <freetype/ftglyph.h>
        #include <freetype/ftcache.h>
        #include <freetype/cache/ftimage.h>

      Now you should use:

        #include <ft2build.h>
        #include FT_FREETYPE_H
        #include FT_GLYPH_H
        #include FT_CACHE_H
        #include FT_CACHE_IMAGE_H

      NOTE THAT  THE OLD  INCLUSION SCHEME WILL  STILL WORK  WITH THIS
      RELEASE.  HOWEVER, WE  DO NOT GUARANTEE THAT THIS  WILL STILL BE
      TRUE IN THE NEXT ONE (A.K.A. FREETYPE 2.1).

      The  file <ft2build.h>  is used  to define  the  header filename
      macros.  The complete and  commented list of macros is available
      in the API reference under the section name `Header File Macros'
      in Chapter I.

      For more information, see section I of the following document:

        https://www.freetype.org/freetype2/docs/tutorial/step1.html

    - Many, many comments have been added to the public source file in
      order to  automatically generate  the API Reference  through the
      `docmaker.py' Python script.

      The latter has been updated  to support the grouping of sections
      in chapters and better index sort.  See:

        https://www.freetype.org/freetype2/docs/reference/ft2-toc.html


  III. CHANGES TO THE BUILD PROCESS

    - If you  are not  building FreeType 2  with its own  build system
      (but with your own Makefiles or project files), you will need to
      be  aware that  the  build  process has  changed  a little  bit.

      You don't  need to put the  `src' directory in  the include path
      when  compiling  any FT2  component.   Instead,  simply put  the
      component's directory in the current include path.

      So, if you were doing something like:

        cc -c -Iinclude -Isrc src/base/ftbase.c

      change the line to:

        cc -c -Iinclude -Isrc/base src/base/ftbase.c

      If you were doing something like:

        cd src/base
        cc -c -I../../include -I.. ftbase.c

      change it to:

        cd src/base
        cc -c -I../../include ftbase.c


======================================================================

CHANGES BETWEEN 2.0.1 and 2.0

  2.0.1 introduces a few changes:

    - Fixed many bugs related to  the support of CFF / OpenType fonts.
      These  formats are  now much  better supported  though  there is
      still work planned to  deal with charset tables and PDF-embedded
      CFF files that use the old `seac' command.

    - The  library could not  be compiled  in debug  mode with  a very
      small  number   of  C  compilers   whose  pre-processors  didn't
      implement the `##'  directive correctly (i.e. per se  the ANSI C
      specification!)  An elegant fix was found.

    - Added  support for  the  free Borland  command-line C++  Builder
      compiler.   Use `make  setup bcc32'.   Also fixed  a  few source
      lines that generated new warnings with BCC32.

    - Fixed a bug in FT_Outline_Get_BBox when computing the extrema of
      a conic Bezier arc.

    - Updated the INSTALL file to add IDE compilation.

    - Other  minor bug  fixes,  from  invalid Type  1  style flags  to
      correct   support   of  synthetic   (obliqued)   fonts  in   the
      auto-hinter, better support for embedded bitmaps in a SFNT font.

    - Fixed some problems with `freetype-config'.

  Finally, the `standard' scheme for including FreeType headers is now
  gradually changing,  but this will  be explained in a  later release
  (probably 2.0.2).

  And very  special thanks to Tom Kacvinsky  and YAMANO-UCHI Hidetoshi
  for their contributions!


======================================================================

CHANGES BETWEEN beta8 and 2.0

  - Changed  the default  installation  path for  public headers  from
    `include/freetype' to `include/freetype2'.

    Also added a new `freetype-config' that is automatically generated
    and installed  on Unix and  Cygwin systems.  The script  itself is
    used to retrieve the current  install path, C compilation flags as
    well as linker flags.

  - Fixed several small bugs:

    * Incorrect max advance width for fixed-pitch Type 1 fonts.
    * Incorrect glyph names for certain TrueType fonts.
    * The  glyph advance  was not  copied when  FT_Glyph_To_Bitmap was
      called.
    * The  linearHoriAdvance  and  linearVertAdvance  fields  were not
      correctly returned for glyphs processed by the auto-hinter.
    * `type1z'  renamed back to  `type1'; the  old `type1'  module has
      been removed.

  - Revamped the  build system  to make it  a lot more  generic.  This
    will  allow us  to  re-use  nearly un-modified  in  lots of  other
    projects (including FreeType Layout).

  - Changed `cid' to use `psaux' too.

  - Added the  cache sub-system.  See <freetype/ftcache.h>  as well as
    the sources  in `src/cache'.  Note  that it compiles but  is still
    untested for now.

  - Updated `docs/docmaker.py', a draft  API reference is available at
    https://web.archive.org/web/20001215173400/http://www.freetype.org:80/ft2api.html.

  - Changed `type1' to use `psaux'.

  - Created a  new module named  `psaux' to hold  the Type 1 &  Type 2
    parsing routines.  It should be  used by `type1', `cid', and `cff'
    in the future.

  - Fixed an important bug in `FT_Glyph_Get_CBox'.

  - Fixed  some compiler  warnings  that happened  since the  TrueType
    bytecode decoder was deactivated by default.

  - Fixed two memory leaks:

    * The    memory   manager   (16    bytes)   isn't    released   in
      FT_Done_FreeType!
    * Using custom input streams, the  copy of the original stream was
      never released.

  - Fixed the  auto-hinter by performing automatic  computation of the
    `filling direction' of each glyph.   This is done through a simple
    and  fast approximation, and  seems to  work (problems  spotted by
    Werner though).  The Arphic fonts are a lot nicer though there are
    still a lot of things to do to handle Asian fonts correctly.


======================================================================

BETA-8 (RELEASE CANDIDATE) CHANGES

  - Deactivated the TrueType bytecode interpreter by default.

  - Deactivated the `src/type1' font driver.  Now `src/type1z' is used
    by default.

  - Updates to the build system.  We now compile the library correctly
    under  Unix  system  through  `configure' which  is  automatically
    called on the first `make' invocation.

  - Added the auto-hinting module!  Fixing some bugs here and there.

  - Found some bugs in the  composite loader (seac) of the Type1-based
    font drivers.

  - Renamed the directory `freetype2/config' to `freetype2/builds' and
    updated all relevant files.

  - Found a memory leak in the `type1' driver.

  - Incorporated Tom's patches to  support flex operators correctly in
    OpenType/CFF fonts.  Now all I need is to support pure CFF and CEF
    fonts to be done with this driver :-)

  - Added the  Windows FNT/FON driver in `src/winfonts'.   For now, it
    always  `simulates'   a  Unicode  charmap,  so   it  shouldn't  be
    considered completed right now.

    It  is there  to be  more a  proof of  concept than  anything else
    anyway.  The driver is a single  C source file, that compiles to 3
    Kb of code.

    I'm  still working on  the PCF/BDF  drivers, but  I'm too  lazy to
    finish them now.

  - CHANGES TO THE HIGH-LEVEL API

    * FT_Get_Kerning has a new parameter that allows you to select the
      coordinates of the kerning  vector (font units, scaled, scaled +
      grid-fitted).
    * The  outline functions are  now in <freetype/ftoutln.h>  and not
      part of <freetype/freetype.h> anymore.
    * <freetype/ftmodule.h>    now     contains    declarations    for
       FT_New_Library, FT_Done_Library, FT_Add_Default_Modules.
    * The so-called convenience  functions have moved from `ftoutln.c'
      to  `ftglyph.c',  and  are  thus available  with  this  optional
      component    of   the   library.     They   are    declared   in
      <freetype/ftglyph.h> now.
    * Anti-aliased  rendering is now  the default  for FT_Render_Glyph
      (i.e. corresponds to render_mode == 0 == ft_render_mode_normal).
      To generate a monochrome bitmap, use ft_render_mode_mono, or the
      FT_LOAD_MONOCHROME     flag    in    FT_Load_Glyph/FT_Load_Char.
      FT_LOAD_ANTI_ALIAS is still defined, but values to 0.
    * <freetype/freetype.h>  now include <freetype/config/ftconfig.h>,
      solving a few headaches :-)
    * The type FT_GlyphSlotRec has now a `library' field.

  - CHANGES TO THE `ftglyph.h' API

    This API has  been severely modified in order  to make it simpler,
    clearer, and more  efficient.  It certainly now looks  like a real
    `glyph factory'  object, and allows client  applications to manage
    (i.e.  transform,  bbox  and  render) glyph  images  without  ever
    knowing their original format.

  - Added  support  for CID-keyed  fonts  to  the  CFF driver.   Maybe
    support for pure CFF + CEF fonts should come in?

  - Cleaned up  source code in order  to avoid two  functions with the
    same name.  Also  changed the names of the  files in `type1z' from
    `t1XXXX' to `z1XXXX' in order to avoid any conflicts.

    `make multi' now works well :-)

    Also removed the use of `cidafm' for now, even if the source files
    are  still there.  This  functionality will  certainly  go into  a
    specific module.

  - ADDED SUPPORT FOR THE AUTO-HINTER

    It  works :-) I  have a  demo program  which simply  is a  copy of
    `ftview'       that      does       a      `FT_Add_Module(library,
    &autohinter_module_class)' after  library initialization, and Type
    1 & OpenType/CFF fonts are now hinted.

    CID  fonts are  not hinted,  as they  include no  charmap  and the
    auto-hinter doesn't include  `generic' global metrics computations
    yet.

    Now, I need to release this thing to the FreeType 2 source.

  - CHANGES TO THE RENDERER MODULES

    The  monochrome  and smooth  renderers  are  now  in two  distinct
    directories, namely `src/raster1' and `src/smooth'.  Note that the
    old `src/renderer' is now gone.

    I ditched  the 5-gray-levels renderers.  Basically,  it involved a
    simple #define toggle in 'src/raster1/ftraster.c'.

    FT_Render_Glyph,  FT_Outline_Render  &  FT_Outline_Get_Bitmap  now
    select the best renderer  available, depending on render mode.  If
    the current renderer for a  given glyph image format isn't capable
    of supporting  the render mode, another  one will be  found in the
    library's list.   This means that client applications  do not need
    to  switch or  set  the  renderers themselves  (as  in the  latest
    change), they'll get what they want automatically.  At last.

    Changed the demo programs accordingly.

  - MAJOR INTERNAL REDESIGN:

    A lot of internal modifications  have been performed lately on the
    source in order to provide the following enhancements:

    * More generic module support:

      The FT_Module  type is  now defined to  represent a handle  to a
      given  module.   The  file  <freetype/ftmodule.h>  contains  the
      FT_Module_Class definition, as well as the module-loading public
      API.

      The  FT_Driver type  is still  defined, and  still  represents a
      pointer to  a font driver.  Note that  FT_Add_Driver is replaced
      by FT_Add_Module, FT_Get_Driver by FT_Get_Module, etc.

    * Support for generic glyph image types:

      The FT_Renderer  type is a pointer  to a module  used to perform
      various operations on glyph image.

      Each renderer is  capable of handling images in  a single format
      (e.g. ft_glyph_format_outline).  Its functions are used to:

      - transform an glyph image
      - render a glyph image into a bitmap
      - return the control box (dimensions) of a given glyph image

      The scan converters `ftraster.c' and `ftgrays.c' have been moved
      to the new directory `src/renderer', and are used to provide two
      default renderer modules.

      One corresponds  to the `standard' scan-converter,  the other to
      the `smooth' one.

      he  current  renderer  can  be  set  through  the  new  function
      FT_Set_Renderer.

      The old raster-related function FT_Set_Raster, FT_Get_Raster and
      FT_Set_Raster_Mode have now disappeared, in favor of the new:

        FT_Get_Renderer
        FT_Set_Renderer

      See the file <freetype/ftrender.h> for more details.

      These  changes  were  necessary  to properly  support  different
      scalable formats in the future, like bi-color glyphs, etc.

    * Glyph loader object:

      A  new  internal  object,  called  a  'glyph  loader'  has  been
      introduced in the base layer.  It is used by all scalable format
      font drivers to load glyphs and composites.

      This object  has been  created to reduce  the code size  of each
      driver,  as  each  one  of  them  basically  re-implemented  its
      functionality.

      See <freetype/internal/ftobjs.h> and the FT_GlyphLoader type for
      more information.

    * FT_GlyphSlot has new fields:

      In  order   to  support  extended  features   (see  below),  the
      FT_GlyphSlot structure has a few new fields:

      linearHoriAdvance:

        This  field  gives  the   linearly  scaled  (i.e.  scaled  but
        unhinted) advance  width for the  glyph, expressed as  a 16.16
        fixed pixel value.  This is useful to perform WYSIWYG text.

      linearVertAdvance:
        This field  gives the linearly  scaled advance height  for the
        glyph  (relevant in  vertical  glyph layouts  only).  This  is
        useful to perform WYSIWYG text.

        Note that  the two above field replace  the removed `metrics2'
        field in the glyph slot.

      advance:
        This field is a vector  that gives the transformed advance for
        the glyph.   By default, it corresponds to  the advance width,
        unless  FT_LOAD_VERTICAL_LAYOUT  was  specified  when  calling
        FT_Load_Glyph or FT_Load_Char.

      bitmap_left:
        This  field gives  the  distance in  integer  pixels from  the
        current pen position  to the left-most pixel of  a glyph image
        IF IT IS  A BITMAP.  It is only valid  when the `format' field
        is set to `ft_glyph_format_bitmap', for example, after calling
        the new function FT_Render_Glyph.

      bitmap_top:
        This  field gives  the  distance in  integer  pixels from  the
        current pen position (located on the baseline) to the top-most
        pixel of the  glyph image IF IT IS  A BITMAP.  Positive values
        correspond to upwards Y.

      loader:
        This  is a  new  private  field for  the  glyph slot.   Client
        applications should not touch it.


    * Support for transforms and direct rendering in FT_Load_Glyph:

      Most of the functionality found in <freetype/ftglyph.h> has been
      moved to the core library.  Hence, the following:

      - A   transform   can   be   specified  for   a   face   through
        FT_Set_Transform.  this transform  is applied by FT_Load_Glyph
        to  scalable glyph  images (i.e.  NOT TO  BITMAPS)  before the
        function returns, unless the bit flag FT_LOAD_IGNORE_TRANSFORM
        was set in the load flags.

      - Once  a  glyph image  has  been  loaded,  it can  be  directly
        converted  to  a  bitmap  by  using  the  new  FT_Render_Glyph
        function.  Note that this  function takes the glyph image from
        the glyph slot,  and converts it to a  bitmap whose properties
        are returned  in `face.glyph.bitmap', `face.glyph.bitmap_left'
        and `face.glyph.bitmap_top'.  The  original native image might
        be lost after the conversion.

      - When using the new  bit flag FT_LOAD_RENDER, the FT_Load_Glyph
        and   FT_Load_Char   functions   will   call   FT_Render_Glyph
        automatically when needed.

  - Reformatted all  modules source  code in order  to get rid  of the
    basic data types redefinitions (i.e. `TT_Int' instead of `FT_Int',
    `T1_Fixed'  instead  of  `FT_Fixed').  Hence  the  format-specific
    prefixes like  `TT_', `T1_',  `T2_' and `CID_'  are only  used for
    relevant structures.


======================================================================

OLD CHANGES FOR BETA 7

  - bug-fixed the  OpenType/CFF parser.  It  now loads and displays my
    two  fonts nicely,  but I'm  pretty certain  that more  testing is
    needed :-)

  - fixed the crummy Type 1 hinter, it now handles accented characters
    correctly (well, the accent is  not always well placed, but that's
    another problem..)

  - added the CID-keyed Type 1 driver in `src/cid'.  Works pretty well
    for only 13 Kb of code  ;-) Doesn't read AFM files though, nor the
    really useful CMAP files..

  - fixed  two  bugs  in  the  smooth  renderer  (src/base/ftgrays.c).
    Thanks to Boris Letocha for spotting them and providing a fix.

  - fixed potential `divide by zero' bugs in ftcalc.c.

  - added source  code for  the OpenType/CFF driver  (still incomplete
    though..)

  - modified the  SFNT driver slightly  to perform more  robust header
    checks  in TT_Load_SFNT_Header.  This prevents certain  font files
    (e.g.  some  Type  1  Multiple  Masters)  from  being  incorrectly
    `recognized' as TrueType font files..

  - moved a lot of stuff from  the TrueType driver to the SFNT module,
    this   allows   greater   code   re-use   between   font   drivers
    (e.g. TrueType, OpenType, Compact-TrueType, etc..)

  - added a tiny segment cache to the SFNT Charmap 4 decoder, in order
    to minimally speed it up..

  - added  support for  Multiple Master  fonts in  `type1z'.  There is
    also a new file named <freetype/ftmm.h> which defines functions to
    manage them from client applications.

    The new file `src/base/ftmm.c' is also optional to the engine..

  - various  formatting changes (e.g.  EXPORT_DEF ->  FT_EXPORT_DEF) +
    small bug fixes in FT_Load_Glyph, the `type1' driver, etc..

  - a minor fix to the Type 1 driver to let them apply the font matrix
    correctly (used for many oblique fonts..)

  - some fixes for 64-bit systems (mainly changing some FT_TRACE calls
    to use %p instead of %lx).  Thanks to Karl Robillard.

  - fixed  some bugs  in  the sbit  loader (src/base/sfnt/ttsbit.c)  +
    added  a new flag,  FT_LOAD_CROP_BITMAP to  query that  bitmaps be
    cropped when  loaded from a file  (maybe I should  move the bitmap
    cropper to the base layer ??).

  - changed the default  number of gray levels of  the smooth renderer
    to 256  (instead of  the previous 128).  Of course, the  human eye
    can't see any difference ;-)

  - removed TT_MAX_SUBGLYPHS,  there is no static limit  on the number
    of subglyphs in a TrueType font now..


======================================================================

OLD CHANGES 16 May 2000

  - tagged `BETA-6'  in the  CVS tree.  This one is a  serious release
    candidate even though it doesn't incorporate the auto-hinter yet..

  - various obsolete files were removed, and copyright header updated

  - finally  updated  the  standard   raster  to  fix  the  monochrome
    rendering bug + re-enable  support for 5-gray levels anti-aliasing
    (suck, suck..)

  - created new header files, and modified sources accordingly:

     <freetype/fttypes.h>
       - simple FreeType types, without the API
     <freetype/internal/ftmemory.h>
       - definition of memory-management macros

  - added   the   `DSIG'   (OpenType   Digital   Signature)   tag   to
    <freetype/tttags.h>

  - light update/cleaning of the build system + changes to the sources
    in  order  to  get  rid  of _all_  compiler  warnings  with  three
    compilers, i.e:

    gcc with `-ansi -pedantic -Wall -W', Visual C++ with `/W3 /WX' and
    LCC

    IMPORTANT NOTE FOR WIN32-LCC USERS:
    |
    |  It seems the C pre-processor  that comes with LCC is broken, it
    |  doesn't  recognize  the  ANSI  standard  directives  #  and  ##
    |  correctly   when  one  of   the  argument  is  a  macro.  Also,
    |  something like:
    |
    |     #define F(x)  print##x
    |
    |     F(("hello"))
    |
    |  will get incorrectly translated to:
    |
    |     print "hello")
    |
    |  by its pre-processor.  For this reason, you simply cannot build
    |  FreeType 2 in debug mode with this compiler..

  - yet  another massive grunt work.  I've  changed the  definition of
    the EXPORT_DEF,  EXPORT_FUNC, BASE_DEF &  BASE_FUNC macros.  These
    now take an argument, which is the function's return value type.

    This  is necessary to  compile FreeType  as a  DLL on  Windows and
    OS/2.  Depending on the compiler used, a compiler-specific keyword
    like  __export or __system  must be  placed before  (VisualC++) or
    after (BorlandC++) the type..

    Of course, this needed a lot of changes throughout the source code
    to make it compile again...  All cleaned up now, apparently..

    Note also  that there is a  new EXPORT_VAR macro  defined to allow
    the   _declaration_    of   an   exportable    public   (constant)
    variable.  This  is  the   case  of  the  raster  interfaces  (see
    ftraster.h and ftgrays.h), as well as each module's interface (see
    sfdriver.h, psdriver.h, etc..)

  - new feature: it  is now possible to pass  extra parameters to font
                 drivers  when creating  a new  face object.  For now,
                 this capability is unused.  It could however prove to
                 be useful in a near future..

      the FT_Open_Args structure was  changes, as well as the internal
      driver interface  (the specific `init_face'  module function has
      now a different signature).

  - updated the tutorial (not finished though).

  - updated the top-level BUILD  document

  - fixed  a  potential memory  leak  that  could  occur when  loading
    embedded bitmaps.

  - added     the     declaration     of     FT_New_Memory_Face     in
    <freetype/freetype.h>, as  it was  missing from the  public header
    (the implementation was already in `ftobjs.c').

  - the file <freetype/fterrors.h> has been seriously updated in order
    to allow  the automatic generation  of error message tables.   See
    the comments within it for more information.

  - major directory  hierarchy re-organisation.  This was done for two
    things:

      * first,  to ease  the `manual'  compilation of  the  library by
        requiring at lot less include paths :-)

      * second,  to  allow  external  programs to  effectively  access
        internal  data  fields.  For example,  this  can be  extremely
        useful if  someone wants  to write a  font producer or  a font
        manager on top of FreeType.

    Basically, you  should now use  the 'freetype/' prefix  for header
    inclusion, as in:

        #include <freetype/freetype.h>
        #include <freetype/ftglyph.h>

    Some new include sub-directories are available:

     a. the  `freetype/config' directory,  contains two files  used to
        configure  the  build  of  the  library.  Client  applications
        should  not need  to look  at these  normally, but they can if
        they want.

        #include <freetype/config/ftoption.h>
        #include <freetype/config/ftconfig.h>

     b. the `freetype/internal'  directory, contains header files that
        describes library  internals.  These are the header files that
        were  previously  found  in  the `src/base'  and  `src/shared'
        directories.


    As  usual, the build  system and  the demos  have been  updated to
    reflect the change..

    Here's a layout of the new directory hierarchy:

    TOP_DIR
      include/
         freetype/
            freetype.h
            ...
            config/
              ftoption.h
              ftconfig.h
              ftmodule.h

            internal/
              ftobjs.h
              ftstream.h
              ftcalc.h
              ...

      src/
         base/
            ...

         sfnt/
         psnames/
         truetype/
         type1/
         type1z/


    Compiling a module is now  much easier, for example, the following
    should work when in the TOP_DIR directory on an ANSI build:

       gcc -c -I./include -I./src/base src/base/ftbase.c
       gcc -c -I./include -I./src/sfnt src/sfnt/sfnt.c
       etc..

    (of course, using -Iconfig/<system> if you provide system-specific
     configuration files).

  - updated the structure of FT_Outline_Funcs in order to allow direct
    coordinate scaling within  the outline decomposition routine (this
    is  important for virtual  `on' points  with TrueType  outlines) +
    updates to the rasters to support this..

  - updated  the OS/2  table  loading code  in `src/sfnt/ttload.c'  in
    order to support version 2 of the table (see OpenType 1.2 spec)

  - created  `include/tttables.h'  and  `include/t1tables.h' to  allow
    client applications to access some of  the SFNT and T1 tables of a
    face  with  a  procedural  interface (see  `FT_Get_Sfnt_Table')  +
    updates to internal source files to reflect the change..

  - some  cleanups in  the source  code to  get rid  of  warnings when
    compiling with the `-Wall -W -ansi -pedantic' options in gcc.

  - debugged and moved the smooth renderer to `src/base/ftgrays.c' and
    its header to `include/ftgrays.h'

  - updated TT_MAX_SUBGLYPHS  to 96 as some CJK  fonts have composites
    with up to 80 sub-glyphs !! Thanks to Werner


======================================================================

OLD CHANGES - 14-apr-2000

  - fixed  a bug  in  the  TrueType glyph  loader  that prevented  the
    correct loading of some CJK glyphs in mingli.ttf

  - improved the standard Type 1 hinter in `src/type1'

  - fixed two bugs  in the experimental Type 1  driver in `src/type1z'
    to handle the new XFree86 4.0 fonts (and a few other ones..)

  - the smooth  renderer is now  complete and supports  sub-banding to
    render large glyphs  at high speed.  However, it is still  located
    in `demos/src/ftgrays.c' and should move to the  library itself in
    the next  beta.  NOTE: The  smooth  renderer  doesn't  compile  in
    stand-alone mode anymore, but this should be fixed RSN..

  - introduced convenience  functions to  more easily deal  with glyph
    images, see  `include/ftglyph.h' for more details, as  well as the
    new  demo program  named `demos/src/ftstring.c'  that demonstrates
    its use

  - implemented  FT_LOAD_NO_RECURSE in  both the  TrueType and  Type 1
    drivers  (this  is required  by  the  auto-hinter  to improve  its
    results).

  - changed   the  raster   interface,  in   order  to   allow  client
    applications  to   provide  their   own  span-drawing   callbacks.
    However,   only   the   smooth   renderer   supports   this.   See
    `FT_Raster_Params' in the file `include/ftimage.h'.

  - fixed  a small bug  in FT_MulFix  that caused  incorrect transform
    computation!

  - Note: The tutorial is out-of-date.


======================================================================

OLD CHANGES - 12-mar-2000

  - changed  the  layout  of  configuration  files  :  now,  all  ANSI
    configuration         files         are         located         in
    `freetype2/config'.  System-specific over-rides  can be  placed in
    `freetype2/config/<system>'.

  - moved all configuration macros to `config/ftoption.h'

  - improvements in the Type 1 driver with AFM support

  - changed the fields  in the FT_Outline structure :  the old `flags'
    array is re-named `tags', while all ancient flags are encoded into
    a single unsigned int named `flags'.

  - introduced     new      flags     in     FT_Outline.flags     (see
    ft_outline_.... enums in `ftimage.h').

  - changed outline functions to `FT_Outline_<action>' syntax

  - added a smooth anti-alias renderer to the demonstration programs

  - added Mac graphics driver (thanks Just)

  - FT_Open_Face  changed  in  order   to  received  a  pointer  to  a
    FT_Open_Args descriptor..

  - various  cleanups,  a  few  more API  functions  implemented  (see
    FT_Attach_File)

  - updated some docs


======================================================================

OLD CHANGES - 22-feb-2000

  - introduced the `psnames' module.  It is used to:

      o convert  a Postscript glyph  name into the  equivalent Unicode
        character code (used by the  Type 1 driver(s) to synthesize on
        the fly a Unicode charmap).

      o provide an  interface to retrieve the Postscript  names of the
        Macintosh,  Adobe  Standard &  Adobe  Expert character  codes.
        (the Macintosh  names are  used by the  SFNT-module postscript
        names support routines, while the other two tables are used by
        the Type 1 driver(s)).

  - introduced the `type1z' alternate Type 1 driver.  This is a (still
    experimental) driver  for the Type  1 format that  will ultimately
    replace the one  in `src/type1'.  It uses pattern matching to load
    data from the font, instead of a finite  state analyzer.  It works
    much better than the `old' driver with `broken' fonts.  It is also
    much smaller (under 15 Kb).

  - the  Type 1  drivers (both  in `src/type1'  and  `src/type1z') are
    nearly  complete.  They  both  provide automatic  Unicode  charmap
    synthesis through  the `psnames' module.  No re-encoding vector is
    needed.  (note  that they  still  leak  memory  due to  some  code
    missing, and I'm getting lazy).

    Trivial AFM support has been added to read kerning information but
    wasn't exactly tested as it should ;-)

  - The TrueType  glyph loader has  been seriously rewritten  (see the
    file  `src/truetype/ttgload.c'.  It is now  much, much  simpler as
    well as  easier to read,  maintain and understand  :-) Preliminary
    versions introduced a  memory leak that has been  reported by Jack
    Davis, and is now fixed..

  - introduced  the new  `ft_glyph_format_plotter', used  to represent
    stroked outlines  like Windows `Vector' fonts, and  certain Type 1
    fonts  like `Hershey'.  The corresponding  raster will  be written
    soon.

  - FT_New_Memory_Face  is  gone.  Likewise,  FT_Open_Face has  a  new
    interface that uses a structure  to describe the input stream, the
    driver (if required), etc..


TODO

  - Write FT_Get_Glyph_Bitmap and FT_Load_Glyph_Bitmap

  - Add a function like FT_Load_Character(face, char_code, load_flags)
    that  would   really  embed  a  call   to  FT_Get_Char_Index  then
    FT_Load_Glyph to ease developer's work.

  - Update the tutorial!

  - consider adding  support for Multiple  Master fonts in the  Type 1
    drivers.

  - Test the AFM routines of the  Type 1 drivers to check that kerning
    information is returned correctly.

  - write a decent auto-gridding component  !! We need this to release
    FreeType 2.0 gold !


less urgent needs:

  - add a CFF/Type2 driver
  - add a BDF driver
  - add a FNT/PCF/HBF driver
  - add a Speedo driver from the X11 sources


======================================================================

OLDER CHANGES - 27-jan-2000

  - updated the  `sfnt' module  interface to allow  several SFNT-based
    drivers to co-exist peacefully

  - updated  the `T1_Face'  type  to better  separate Postscript  font
    content  from the  rest of  the FT_Face  structure.  Might be used
    later by the CFF/Type2 driver..

  - added an experimental replacement Type 1 driver featuring advanced
    (and speedy) pattern matching to retrieve the data from postscript
    fonts.

  - very minor  changes in the implementation  of FT_Set_Char_Size and
    FT_Set_Pixel_Sizes (they now implement default to lighten the font
    driver's code).


======================================================================

OLD MESSAGE

This file summarizes the changes  that occurred  since the last `beta'
of FreeType 2. Because the list is important, it has been divided into
separate sections:

Table Of Contents:

    I   High-Level Interface (easier !)
   II   Directory Structure
  III   Glyph Image Formats
   IV   Build System
    V   Portability
   VI   Font Drivers


----------------------------------------------------------------------

High-Level Interface:

  The high-level API has been considerably simplified.  Here is how:

    - resource objects have disappeared.  this means that face objects
      can now be created with  a single function call (see FT_New_Face
      and FT_Open_Face)

    - when calling  either FT_New_Face  & FT_Open_Face, a  size object
      and a glyph slot object  are automatically created for the face,
      and can  be accessed  through `face->glyph' and  `face->size' if
      one really  needs to.   In most cases,  there's no need  to call
      FT_New_Size or FT_New_Glyph.

    - similarly,  FT_Load_Glyph  now  only  takes  a  `face'  argument
      (instead  of a  glyph  slot  and a  size).  Also,  its  `result'
      parameter is  gone, as the glyph  image type is  returned in the
      field `face->glyph.format'

    - the list  of available  charmaps is directly  accessible through
      `face->charmaps', counting `face->num_charmaps'  elements.  Each
      charmap  has an  'encoding'  field which  specifies which  known
      encoding it deals with.  Valid values are, for example:

          ft_encoding_unicode      (for ASCII, Latin-1 and Unicode)
          ft_encoding_apple_roman
          ft_encoding_sjis
          ft_encoding_adobe_standard
          ft_encoding_adobe_expert

      other  values may  be added  in the  future.  Each charmap still
      holds  its `platform_id'  and `encoding_id'  values in  case the
      encoding is too exotic for the current library


----------------------------------------------------------------------

Directory Structure:

  Should seem obvious to most of you:

     freetype/
         config/        -- configuration sub-makefiles
            ansi/
            unix/       -- platform-specific configuration files
            win32/
            os2/
            msdos/

         include/       -- public header  files, those to  be included
                           directly by client apps

         src/           -- sources of the library
           base/        -- the base layer
           sfnt/        -- the sfnt `driver'  (see the drivers section
                           below)
           truetype/    -- the truetype driver
           type1/       -- the type1 driver
           shared/      -- some header files shared between drivers

         demos/         -- demos/tools

         docs/          -- documentation (a bit empty for now)


----------------------------------------------------------------------

Glyph Image Formats:

  Drivers are now able to  register new glyph image formats within the
  library.  For  now, the  base layer supports  of course  bitmaps and
  vector  outlines, but  one  could imagine  something different  like
  colored bitmaps, bi-color vectors or whatever else (Metafonts anyone
  ??).

  See  the   file  `include/ftimage.h'.   Note  also  that   the  type
  FT_Raster_Map  is gone,  and  is now  replaced  by FT_Bitmap,  which
  should encompass all known bitmap types.

  Each new  image format  must provide at  least one `raster',  i.e. a
  module capable of  transforming the glyph image into a bitmap.  It's
  also possible  to change the default  raster used for  a given glyph
  image format.

  The default outline  scan-converter now uses 128 levels  of grays by
  default,  which tends  to smooth  many  things.  Note that the  demo
  programs have been updated significantly in order to display these..


----------------------------------------------------------------------

Build system:

  You still need  GNU Make to build the library.  The build system has
  been very seriously re-vamped in order to provide things like :

   - automatic host platform  detection (reverting to 'config/ansi' if
     it is not detected, with pseudo-standard compilation flags)

   - the ability to compile from the Makefiles with very different and
     exotic compilers.  Note that linking the library can be difficult
     for some platforms.

     For example, the file `config/win32/lcclib.bat' is invoked by the
     build system to create the `.lib' file with LCC-Win32 because its
     librarian  has too  many flaws  to be  invoked directly  from the
     Makefile.

  Here's how it works:

  - the first time you type `make',  the build system runs a series of
    sub-makefiles  in order  to detect  your host  platform.  It  then
    dumps what it found, and creates a file called `config.mk' in  the
    current  directory.  This is a  sub-Makefile used  to  define many
    important Make variables used to build the library.

  - the second time, the build system detects the `config.mk' then use
    it  to  build the  library.  All object  files  go  into 'obj'  by
    default,  as well  as the  library file,  but this  can  easily be
    changed.

  Note that  you can run `make  setup' to force  another host platform
  detection  even   if  a  `config.mk'  is  present   in  the  current
  directory.  Another solution  is  simply to  delete  the file,  then
  re-run make.

  Finally, the  default compiler  for all platforms  is gcc  (for now,
  this will hopefully changed in the future).  You can however specify
  a different  compiler by specifying  it after the 'setup'  target as
  in:

      gnumake setup lcc         on Win32 to use the LCC compiler
      gnumake setup visualc     on Win32 to use Visual C++

  See  the file  `config/<system>/detect.mk' for  a list  of supported
  compilers for your platforms.

  It should be relatively easy  to write new detection rules files and
  config.mk..

  Finally, to  build the demo programs,  go to `demos'  and launch GNU
  Make, it will use the `config.mk'  in the top directory to build the
  test programs..


----------------------------------------------------------------------

Portability:

  In  the  previous  beta,  a  single FT_System  object  was  used  to
  encompass  all  low-level  operations like  thread  synchronisation,
  memory management and i/o access.  This has been greatly simplified:

    - thread synchronisation  has been dropped, for  the simple reason
      that the library  is already re-entrant, and that  if you really
      need  two  threads accessing  the  same  FT_Library, you  should
      really synchronize access to it yourself with a simple mutex.

    - memory  management is  performed  through a  very simple  object
      called `FT_Memory',  which really is a table  containing a table
      of pointers to  functions like malloc, realloc and  free as well
      as some user data (closure).

    - resources have disappeared (they created more problems than they
      solved), and  i/o management have  been simplified greatly  as a
      result.  Streams are  defined through  FT_Stream objects,  which
      can be either memory-based or disk-based.

      Note that  each face  has its own  stream, which is  closed only
      when  the  face object  is  destroyed.  Hence,  a function  like
      TT_Flush_Face in 1.x cannot be directly  supported.  However, if
      you really need something like  this, you can easily tailor your
      own streams  to achieve the same  feature at a  lower level (and
      use FT_Open_Face instead of FT_New_Face to create the face).

  See the file  `include/ftsystem.h' for more details, as  well as the
  implementations found in `config/unix' and `config/ansi'.


----------------------------------------------------------------------

Font Drivers:

  The  Font Driver  interface has  been modified  in order  to support
  extensions & versioning.


  The  list of  the font  drivers that  are statically  linked  to the
  library at compile time is  managed through a new configuration file
  called `config/<platform>/ftmodule.h'.

  This  file is  autogenerated  when  invoking  `make modules'.   This
  target  will  parse  all  sub-directories  of  'src', looking  for a
  `module.mk' rules  file, used  to describe  the driver to  the build
  system.

  Hence, one  should call  `make modules' each  time a font  driver is
  added or removed from the `src' directory.

  Finally, this  version  provides  a `pseudo-driver'  in  `src/sfnt'.
  This  driver  doesn't  support  font  files  directly, but  provides
  services used by all TrueType-like font drivers.  Hence, its code is
  shared between  the TrueType & OpenType  font formats,  and possibly
  more formats to come if we're lucky..


----------------------------------------------------------------------

Extensions support:

  The extensions support is inspired by the one found in 1.x.

  Now, each font driver has  its own `extension registry', which lists
  which extensions  are available  for the font  faces managed  by the
  driver.

  Extension ids are  now strings, rather than 4-byte  tags, as this is
  usually more readable.

  Each extension has:
    - some data, associated to each face object
    - an interface (table of function pointers)

  An extension  that is format-specific should  simply register itself
  to the correct font driver.  Here is some example code:

   // Registering an extensions
   //
   FT_Error  FT_Init_XXXX_Extension( FT_Library  library )
   {
     FT_DriverInterface*  tt_driver;

     driver = FT_Get_Driver( library, "truetype" );
     if (!driver) return FT_Err_Unimplemented_Feature;

     return FT_Register_Extension( driver, &extension_class );
   }


   // Implementing the extensions
   //
   FT_Error  FT_Proceed_Extension_XXX( FT_Face  face )
   {
     FT_XXX_Extension            ext;
     FT_XXX_Extension_Interface  ext_interface;

     ext = FT_Get_Extension( face, "extensionid", &ext_interface );
     if (!ext) return error;

     return ext_interface->do_it(ext);
   }

------------------------------------------------------------------------

Copyright (C) 2000-2022 by
David Turner, Robert Wilhelm, and Werner Lemberg.

This  file  is  part  of the  FreeType  project, and may  only be  used,
modified,  and  distributed  under  the  terms of  the FreeType  project
license, LICENSE.TXT.   By continuing to use, modify, or distribute this
file you  indicate that  you have  read the  license and understand  and
accept it fully.


Local Variables:
version-control: never
coding: utf-8
End:

--- end of CHANGES ---
