This  file  contains a  list  of various  font  formats.   It gives  the
reference document and whether it is supported in FreeType 2.


  file type:
    The only special  case is `MAC'; on older Mac  OS versions, a `file'
    is  stored as  a  data and  a  resource fork,  this  is, within  two
    separate data chunks.   In all other cases, the  font data is stored
    in a single file.

  wrapper format:
    The format used  to represent the font data.  In  the table below it
    is used only if the font format differs.  Possible values are `SFNT'
    (binary), `PS' (a text header, followed by binary or text data), and
    `LZW' (compressed with either `gzip' or `compress').

  font format:
    How the font  is to be accessed, possibly  after converting the file
    type and  wrapper format  into a generic  form.  Bitmap  formats are
    `BDF',  `PCF', and  one  form  of `WINFNT';  all  others are  vector
    formats.

  font type:
    Sub-formats  of the font  format.  `SBIT'  and `MACSBIT'  are bitmap
    formats, `MM' and `VAR' support optical axes.

  glyph access:
    If not specified, the glyph access is `standard' to the font format.
    Values are  `CID' for CID-keyed  fonts, `SYNTHETIC' for  fonts which
    are modified  versions of other  fonts by means of  a transformation
    matrix, `COLLECTION' for collecting  multiple fonts (sharing most of
    the data) into a single file, and `TYPE_0' for PS fonts which are to
    be accessed in a tree-like structure.

  FreeType driver:
    The module in  the FreeType library which handles  the specific font
    format.   A missing entry  means that  FreeType doesn't  support the
    font format (yet).


Please  send  additions  and/or  corrections  to wl@gnu.org  or  to  the
FreeType developer's list  at freetype-devel@nongnu.org (for subscribers
only).   If you  can provide  a font  example for  a format  which isn't
supported yet please send a mail too.


file wrapper font   font    glyph      FreeType reference
type format  format type    access     driver   documents
----------------------------------------------------------------------------

---  ---     BDF    ---     ---        bdf      5005.BDF_Spec.pdf, X11


---  SFNT    PS     TYPE_1  ---        type1    Type 1 GX Font Format
                                                (for the Mac) [3]
MAC  SFNT    PS     TYPE_1  ---        type1    Type 1 GX Font Format
                                                (for the Mac) [3]
---  SFNT    PS     TYPE_1  CID        cid      5180.sfnt.pdf (for the Mac)
                                                [3]
MAC  SFNT    PS     TYPE_1  CID        cid      5180.sfnt.pdf (for the Mac)
                                                [3]
---  SFNT    PS     CFF     ---        cff      OT spec, 5176.CFF.pdf
                                                (`OTTO' format)
MAC  SFNT    PS     CFF     ---        cff      OT spec, 5176.CFF.pdf
                                                (`OTTO' format)
---  SFNT    PS     CFF     CID        cff      OT spec, 5176.CFF.pdf
MAC  SFNT    PS     CFF     CID        cff      OT spec, 5176.CFF.pdf
---  SFNT    PS     CFF     SYNTHETIC  ---      OT spec, 5176.CFF.pdf
MAC  SFNT    PS     CFF     SYNTHETIC  ---      OT spec, 5176.CFF.pdf
---  SFNT    TT     SBIT    ---        sfnt     XFree86 (bitmaps only;
                                                with `head' table)
---  SFNT    TT     MACSBIT ---        sfnt     OT spec (for the Mac;
                                                bitmaps only; `bhed' table)
MAC  SFNT    TT     MACSBIT ---        sfnt     OT spec (for the Mac;
                                                bitmaps only; `bhed' table)
---  SFNT    TT     ---     ---        truetype OT spec (`normal' TT font)
MAC  SFNT    TT     ---     ---        truetype OT spec (`normal' TT font)
MAC  SFNT    TT     VAR     ---        truetype GX spec (`?var' tables)
---  SFNT    TT     ---     COLLECTION truetype OT spec (this can't be CFF)
MAC  SFNT    TT     ---     COLLECTION truetype OT spec (this can't be CFF)


---  ---     PS     TYPE_1  ---        type1    T1_SPEC.pdf
                                                (`normal' Type 1 font)
MAC  ---     PS     TYPE_1  ---        type1    T1_SPEC.pdf
                                                (`normal' Type 1 font)
---  ---     PS     TYPE_1  CID        cid      PLRM.pdf (CID Font Type 0;
                                                Type 9 font)
---  ---     PS     MM      ---        type1    5015.Type1_Supp.pdf
                                                (Multiple Masters)
---  ---     PS     CFF     ---        cff      5176.CFF.pdf (`pure' CFF)
---  ---     PS     CFF     CID        cff      5176.CFF.pdf (`pure' CFF)
---  ---     PS     CFF     SYNTHETIC  ---      5176.CFF.pdf (`pure' CFF)
---  PS      PS     CFF     ---        ---      PLRM.pdf (Type 2) [1]
---  PS      PS     CFF     CID        ---      PLRM.pdf (Type 2) [1]
---  PS      PS     CFF     SYNTHETIC  ---      PLRM.pdf (Type 2) [1]
---  ---     PS     ---     TYPE_0     ---      PLRM.pdf
---  ---     PS     TYPE_3  ---        ---      PLRM.pdf (never supported)
---  ---     PS     TYPE_3  CID        ---      PLRM.pdf (CID Font Type 1;
                                                Type 10 font; never supported)
---  PS      PS     TYPE_14 ---        ---      PLRM.pdf (Chameleon font;
                                                Type 14 font; never supported?)
---  ---     PS     TYPE_32 CID        ---      PLRM.pdf (CID Font Type 4;
                                                Type 32 font; never supported?)
---  PS      TT     ---     ---        type42   5012.Type42_Spec.pdf
                                                (Type 42 font)
---  PS      TT     ---     CID        ---      PLRM.pdf (CID Font Type 2;
                                                Type 11 font)


---  ?       ?      CEF     ?          cff      ?


---  ---     PCF    ---     ---        pcf      X11, [4]
---  LZW     PCF    ---     ---        pcf      X11, [4]


---  ---     PFR    PFR0    ---        pfr      [2]
---  ---     PFR    PFR1    ---        ---      (undocumented, proprietary;
                                                probably never supported)


---  ---     WINFNT ---     ---        winfonts MS Windows 3 Developer's Notes
---  ---     WINFNT VECTOR  ---        ---      MS Windows 3 Developer's Notes


[1] Support should be rather simple since this is identical to `CFF' but
    in a PS wrapper.

[2] Official PFR specification:

      http://www.bitstream.com/categories/developer/truedoc/pfrspec.html
      http://www.bitstream.com/categories/developer/truedoc/pfrspec1.2.pdf

    The  syntax of  the  auxiliary data  is  not defined  there, but  is
    partially defined in  MHP 1.0.3 (also called ETSI  TS 101812 V1.3.1)
    section 7.4.

      http://www.etsi.org/
      http://webapp.etsi.org/workprogram/Report_WorkItem.asp?WKI_ID=18799

    (free registration required).

[3] Support is rudimentary currently; some tables are not loaded yet.

[4] There is no formal PCF specification; you have to deduce the exact
    format from the source code within X11.  George Williams did this for
    his FontForge editor:

      http://fontforge.sourceforge.net/pcf-format.html

------------------------------------------------------------------------

Copyright 2004, 2005, 2008, 2009 by
David Turner, Robert Wilhelm, and Werner Lemberg.

This  file is  part  of the  FreeType  project, and  may  only be  used,
modified,  and  distributed under  the  terms  of  the FreeType  project
license, LICENSE.TXT.  By continuing  to use, modify, or distribute this
file  you indicate that  you have  read the  license and  understand and
accept it fully.


--- end of formats.txt ---
