LATEST CHANGES

  - 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's 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
  
    o FT_Get_Kerning has a new parameter that allows you to select
      the coordinates of the kerning vector ( font units, scaled,
      scaled + grid-fitted ).
      
    o the outline functions are now in <freetype/ftoutln.h> and not
      part of <freetype/freetype.h> anymore
      
    o <freetype/ftmodule.h> now contains declarations for
       FT_New_Library, FT_Done_Library, FT_Add_Default_Modules

    o 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..

    o 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.
      
    o <freetype/freetype.h> now include <freetype/config/ftconfig.h>,
      solving a few headaches :-)

    o 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 initialisation, 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.
        
        The 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 had 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 WHEN 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 WHEN 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.




  - reformated all modules source code in order to get rid of the basic
    data types redifinitions (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.. my god..

  - 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
      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 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, grumpf.. :-(

================================================================================
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 synthetize
        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 embbed 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 ligthen the
    font driver's code).


=============================================================================
OLD MESSAGE

This file summarizes the changes that occured 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, it's "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 wathever 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);
   }

