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),
    `LZW' (compressed with either `gzip' or `compress'), and
    `BZ2' (compressed with `bzip2`).

  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]
---  BZ2     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] See

      THE X WINDOW SYSTEM SERVER: X VERSION 11, RELEASE 5
      Elias Israel, Erik Fortune, Digital Press, 1992
      ISBN 1-55558-096-3

    for a specification  given in Appendix D on pgs. 436-450.   However,
    this information  might be out of  date; unfortunately,  there is no
    PCF  specification available  online, and this book is out of print.
    George  Williams deduced  the font  format from the X11  sources and
    documented it for his FontForge font editor:

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

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

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