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  ---        ---      Type 1 GX Font Format
                                                (for the Mac)
MAC  SFNT    PS     TYPE_1  ---        ---      Type 1 GX Font Format
                                                (for the Mac)
---  SFNT    PS     TYPE_1  CID        ---      5180.sfnt.pdf (for the Mac)
MAC  SFNT    PS     TYPE_1  CID        ---      5180.sfnt.pdf (for the Mac)
---  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
---  LZW     PCF    ---     ---        pcf      X11


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

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

Copyright 2004, 2005 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 ---
